我有问题alpha混合glPoints。当glPoint在背景上时,alpha混合正常工作,但是当glPoint与另一个glPoint重叠时,背景颜色可见,而不是底层的glPoint。
// create texture
GLuint tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);
// Draw
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, tex);
....
glDrawArrays(GL_POINTS, 0, numberOfPoints);
// Frag Shader
uniform sampler2D Texture;
void main(void)
{
gl_FragColor = texture2D(Texture, gl_PointCoord);
}
我做错了什么?
答案 0 :(得分:2)
看起来深度测试会导致您的问题。正如您所描述的那样,首先绘制前面的点并更换深度值。然后背后的点是光栅化的,但是所有的片段都没有通过深度测试,所以没有更多的渲染/混合。
正如Andon M. Coleman指出的那样,你真的需要按照深度的顺序对碎片进行排序以进行正确的α混合(精确的顺序无关透明度目前对于粒子是不切实际的,尽管你可以尝试一些近似技术。使用alpha值作为权重的所有颜色也可以得到不错的结果。
特别是对于您拥有的粒子密度和粒子之间缺乏变化,排序和排序之间可能没有太大区别。在这种情况下,请确保首先绘制所有不透明的东西,并启用深度测试,然后绘制粒子。您希望保持深度测试的启用,这样当您的粒子落后于不透明的东西时不会被绘制,但是您不希望它们相互模糊 - 您希望使用深度缓冲区进行测试而不是写入深度值。为此,请使用glDepthMask