1

我在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);
4

3 回答 3

5

您的标题本质上是您问题的答案!

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

于 2011-05-12T21:52:45.610 回答
5

Drew Hall 给了你一个很好的答案,但另一个选择是glEnable(GL_ALPHA_TEST)设置glAlphaFunc(GL_GREATER, 0.1f). 这将完全防止透明像素(在这种情况下,alpha < 0.1f 的像素)被渲染。这样他们就不会写入 Z 缓冲区,其他东西可以“显示出来”。但是,这仅适用于完全透明的对象。它在 0.1 alpha 边缘所在的地方也有粗糙的边缘,这对于像素比对象大的远距离特征看起来很糟糕。

于 2011-05-12T22:01:38.403 回答
5

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

mediump vec4 basecolor = texture2D(sTexture, TexCoord);

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

gl_FragColor = basecolor;
于 2011-05-12T22:23:59.963 回答