是否可以在着色器中忽略特定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;
}
}
答案 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
来控制它,因此它应该不是问题。