繁体   English   中英

glPoint Alpha Blending问题

[英]glPoint Alpha Blending issue

我有问题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); 
    }

我究竟做错了什么?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM