忽略着色器内的颜色输出

时间:2017-07-03 15:26:05

标签: opengl glsl

是否可以在着色器中忽略特定FBO颜色附件的颜色输出?

例如:

#version 330

layout (location = 0) out vec4 output_A;    
layout (location = 1) out vec4 output_B;

uniform float isGlass;

void main(void)
{
    if (isGlass = 0)
    {
        output_A = vec4(1,1,1,1);
        output_B = vec4(1,1,1,1);
    }
    else
    {
        output_A = vec4(1,1,1,1);
        output_B = NULL;
    }   
}

2 个答案:

答案 0 :(得分:3)

不,这不适用于着色器内部。

但是你可以通过为第二个渲染缓冲区启用alpha混合(glBlendFunci)来实现类似的效果,并在没有任何东西写入时将alpha通道设置为0。

编辑:

着色器可以假设第二个渲染目标的混合模式设置为(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),如下所示:

#version 330

layout (location = 0) out vec4 output_A;    
layout (location = 1) out vec4 output_B;

uniform float isGlass;

void main(void)
{
    if (isGlass = 0)
    {
        output_A = vec4(1,1,1,1);
        output_B = vec4(1,1,1,1);
    }
    else
    {
        output_A = vec4(1,1,1,1);
        output_B = vec4(0,0,0,0); //Will not be written since alpha = 0
    }   
}

答案 1 :(得分:2)

如果要关闭对特定附件的写入,最好通过write masking完成。可以使用glColorMaski

在每个附件的基础上启用/禁用颜色遮罩
glColorMask(buffer, GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);

buffer是与输出变量关联的位置。

当然,这只能在绘制调用之间完成。但是,由于您使用uniform来控制它,因此它应该不是问题。