opengl z-sorting透明度

use*_*443 1 opengl transparency depth-buffer

我在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);
Run Code Online (Sandbox Code Playgroud)

Dre*_*all 5

你的头衔基本上就是你问题的答案!

通常,透明度通过首先渲染场景中的所有不透明对象(让z缓冲区找出可见的内容),然后从后向前渲染所有透明对象来完成.


Ben*_*son 5

德鲁霍尔给了你一个很好的答案,但另一种选择是glEnable(GL_ALPHA_TEST)设置glAlphaFunc(GL_GREATER, 0.1f)。这将阻止透明像素(在本例中为 alpha < 0.1f 的像素)被渲染。这样它们就不会写入 Z 缓冲区,并且其他内容可以“显示出来”。然而,这仅适用于完全透明的物体。无论 0.1 alpha 边缘在哪里,它都具有粗糙的边缘,对于像素比对象大的远处特征来说,这可能看起来很糟糕。


use*_*443 5

弄清楚了.您可以在片段着色器中丢弃

mediump vec4 basecolor = texture2D(sTexture, TexCoord);

if (basecolor.a == 0.0){
    discard;
}

gl_FragColor = basecolor;
Run Code Online (Sandbox Code Playgroud)

  • 这是一个更好的答案,IMO - 因为大多数人只是寻求简单的透明度.半透明需要其他技术,并且极有误导性的是,有多少人告诉你,如果没有重新订购(或深度剥皮等),你就无法做透明度. (2认同)