2017-07-03 148 views
1

从着色器中可以忽略特定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; 
    } 
} 

回答

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 
    } 
} 
+0

有趣的,所以你可以启用/禁用个别颜色附件的alpha混合? –

+0

是的。这就是'glBlendFunci'的用处。 – BDL

+0

如果你有时间可以发布示例着色器,我正在努力实现这个工作。目标是根据if语句的结果写入输出。 –

2

如果你想关闭写入到一个特定的附件,这最好通过write masking完成。色掩模可以被使能/基于每个附件基础禁用与glColorMaski

glColorMask(buffer, GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 

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

当然,这只能在绘制调用之间完成。但是由于您使用的是uniform来控制这一点,所以这不会成为问题。