glPoint Alpha Blending问题

时间:2013-09-11 02:18:27

标签: opengl alphablending glblendfunc

我有问题alpha混合glPoints。当glPoint在背景上时,alpha混合正常工作,但是当glPoint与另一个glPoint重叠时,背景颜色可见,而不是底层的glPoint。

enter image description here

// 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); 
    }

我做错了什么?

1 个答案:

答案 0 :(得分:2)

看起来深度测试会导致您的问题。正如您所描述的那样,首先绘制前面的点并更换深度值。然后背后的点是光栅化的,但是所有的片段都没有通过深度测试,所以没有更多的渲染/混合。

  1. 正如Andon M. Coleman指出的那样,你真的需要按照深度的顺序对碎片进行排序以进行正确的α混合(精确的顺序无关透明度目前对于粒子是不切实际的,尽管你可以尝试一些近似技术。使用alpha值作为权重的所有颜色也可以得到不错的结果。

  2. 特别是对于您拥有的粒子密度和粒子之间缺乏变化,排序和排序之间可能没有太大区别。在这种情况下,请确保首先绘制所有不透明的东西,并启用深度测试,然后绘制粒子。您希望保持深度测试的启用,这样当您的粒子落后于不透明的东西时不会被绘制,但是您不希望它们相互模糊 - 您希望使用深度缓冲区进行测试而不是写入深度值。为此,请使用glDepthMask