【问题标题】:opengl z-sorting transparencyopengl z排序透明度
【发布时间】:2011-05-12 21:48:14
【问题描述】:

我在 opengl es 2.0 中的简单正方形上渲染 png,但是当我尝试在正方形后面绘制一些东西时,我已经绘制了顶部正方形中的透明区域被渲染为与背景相同的颜色。

我在每次渲染调用开始时调用这些。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glEnable (GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

【问题讨论】:

    标签: opengl transparency depth-buffer


    【解决方案1】:

    你的标题本质上就是你问题的答案!

    一般来说,透明度是通过首先渲染场景中的所有不透明对象(让 z-buffer 确定什么是可见的),然后从后到前渲染所有透明对象来完成的。

    【讨论】:

    • 哦好的,所以我需要先渲染后面的。有没有其他办法。
    • @user346443:不,没有。这是所有光栅化器的一个基本原理,OpenGL是按照光栅化器来定义的。透明人脸的顺序无关渲染是一个非常热门的研究课题,但迄今为止所有发明的方法都使用多个渲染目标或类似目标实现了从后到前的排序算法。
    【解决方案2】:

    Drew Hall 给了你一个很好的答案,但另一种选择是将glEnable(GL_ALPHA_TEST) 设置为glAlphaFunc(GL_GREATER, 0.1f)。这将完全阻止渲染透明像素(在这种情况下,alpha

    【讨论】:

    • es 2.0中是否存在GL_ALPHA_TEST和glAlphaFunc?我找不到他们。
    • 如果您正在编写自己的着色器,您可以通过丢弃任何低于给定值的 alpha 片段来模拟此效果。
    【解决方案3】:

    想通了。您可以在片段着色器中丢弃

    mediump vec4 basecolor = texture2D(sTexture, TexCoord);
    
    if (basecolor.a == 0.0){
        discard;
    }
    
    gl_FragColor = basecolor;
    

    【讨论】:

    • 是的,这相当于GL_ALPHA_TEST在固定功能管道中所做的,除了测试配置了glAlphaFunc
    • 我发现这对于绘制树时的 z 排序问题非常有用。虽然我的树是从后到前排序的,但有时两棵靠近的树靠得很近,以至于它们的距离相等,因此一棵被绘制在另一棵上,导致绘制一个讨厌的盒子。丢弃低 alpha 像素可以解决这个问题,但我仍然必须先进行排序,因为如果我不这样做,粗略的丢弃看起来会令人不快。
    • 这是一个更好的答案,IMO - 因为大多数人只是在寻找简单的透明度。半透明需要其他技术,有多少人告诉你如果不重新排序(或深度剥离之类的东西)就无法实现透明,这是高度误导的。
    • 非常重要的答案!!正如已经说过的许多用途(例如带有 alpha 通道的树叶纹理),简单的二进制透明度就足够了,不需要 alpha 混合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 2015-03-20
    相关资源
    最近更新 更多