0

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

我究竟做错了什么?

4

1 回答 1

2

看起来深度测试正在导致您的问题。正如您所描述的,会发生什么,首先绘制前面的一个点,然后替换深度值。然后后面的点被光栅化,但所有片段都未能通过深度测试,因此不再渲染/混合。

  1. 正如 Andon M. Coleman 指出的那样,您确实需要按深度顺序对片段进行排序以正确混合 alpha (尽管您可以尝试一些近似技术,但与粒子无关的精确顺序透明度目前是不切实际的。使用 alpha 值平均所有颜色为重量也可以产生不错的结果)。

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

于 2013-09-11T04:37:33.463 回答