忽略着色器内部的颜色输出
问题描述:
从着色器中可以忽略特定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;
}
}
答
没有,这是不可能从内部着色器。
但是,您可以通过为第二个渲染缓冲区启用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
}
}
答
如果你想关闭写入到一个特定的附件,这最好通过write masking完成。色掩模可以被使能/基于每个附件基础禁用与glColorMaski
:
glColorMask(buffer, GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
buffer
是输出变量与相关联的位置。
当然,这只能在绘制调用之间完成。但是由于您使用的是uniform
来控制这一点,所以这不会成为问题。
有趣的,所以你可以启用/禁用个别颜色附件的alpha混合? –
是的。这就是'glBlendFunci'的用处。 – BDL
如果你有时间可以发布示例着色器,我正在努力实现这个工作。目标是根据if语句的结果写入输出。 –