混合线看起来不像预期的那样

时间:2014-03-31 20:35:02

标签: graphics opengl-es opengl-es-2.0

我使用以下片段着色器(使用雾效果)绘制场景:

precision mediump float;

uniform int EnableFog;
uniform float FogMinDist;
uniform float FogMaxDist;

varying lowp vec4 DestinationColor;
varying float EyeToVertexDist;

float computeFogFactor()
{
    float fogFactor = 1.0;

    if (EnableFog != 0)
    {
        //Use a bit lower vlaue of FogMaxDist to get a better fog effect - it will make the far end disappear quicker. 
        float fogMaxDistABitCloser = FogMaxDist * 0.98;

        fogFactor = (fogMaxDistABitCloser - EyeToVertexDist) / (fogMaxDistABitCloser - FogMinDist);

        fogFactor = clamp(fogFactor, 0.0, 1.0);
    }

    return fogFactor;
}

void main(void)
{
    float fogFactor = computeFogFactor();

    gl_FragColor = DestinationColor * fogFactor;
}

我启用了alpha混合:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

结果是以下场景:

enter image description here

我的问题在于线条重叠的位置 - 结果是颜色看起来比两条线的颜色都暗:

enter image description here

我如何解决它?

1 个答案:

答案 0 :(得分:0)

正如评论中已经描述的那样,您将新绘制的线条与背景混合,背景可能已包含某些像素的其他对象的颜色,在线条重叠的情况下。要解决此问题,您必须绘制线条而不重叠,或使绘图与当前缓冲区状态无关。

在特定情况下,您可以通过一些均匀或甚至纹理将背景颜色传递给片段着色器,然后在片段着色器中手动进行混合。

通常,您可能希望将网格绘制到具有附加纹理的某个帧缓冲对象(FBO),然后使用雾着色器和混合在单个绘制调用中绘制整个纹理。然后,FBO的绘图应该与禁用混合。

还有其他方法,例如首先将网格绘制到模板缓冲区,然后使用着色器和混合重新绘制全屏矩形应用颜色。