我在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 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);
您的标题本质上是您问题的答案!
通常,透明度是通过首先渲染场景中的所有不透明对象(让 z 缓冲区找出可见的对象),然后从后到前渲染所有透明对象来完成的。
Drew Hall 给了你一个很好的答案,但另一个选择是glEnable(GL_ALPHA_TEST)
设置glAlphaFunc(GL_GREATER, 0.1f)
. 这将完全防止透明像素(在这种情况下,alpha < 0.1f 的像素)被渲染。这样他们就不会写入 Z 缓冲区,其他东西可以“显示出来”。但是,这仅适用于完全透明的对象。它在 0.1 alpha 边缘所在的地方也有粗糙的边缘,这对于像素比对象大的远距离特征看起来很糟糕。
弄清楚了。您可以在片段着色器中丢弃
mediump vec4 basecolor = texture2D(sTexture, TexCoord);
if (basecolor.a == 0.0){
discard;
}
gl_FragColor = basecolor;