OpenGL 3.0 Framebuffer输出到附件没有我指定



好了,我有一个framebuffer和一堆附件。附件是颜色,绽放,速度和深度。

我首先用下面的代码将framebuffer清除为我选择的值。
// Clear Color Buffer
float colorDefaultValue[4] = { 0.5, 0.5, 0.5, 1.0 };
glClearBufferfv(GL_COLOR, 0, colorDefaultValue);
// Clear Bloom Buffer
float bloomDefaultValue[4] = { 0.0, 0.0, 1.0, 1.0 };
glClearBufferfv(GL_COLOR, 1, bloomDefaultValue);
// Clear Depth Buffer
float depth[1] = { 1.0 };
glClearBufferfv(GL_DEPTH, 0, depth);

然后我继续使用我的主着色器渲染场景。如下面的代码所示,我指定了输出。

// Layouts
layout (location = 0) out vec4 o_vFragColor;
layout (location = 1) out vec4 o_vBloomColor; 

然后我在片段着色器中输出值给他们。

o_vFragColor = vec4(color, alpha);
float brightness = dot(o_vFragColor.rgb, vec3(0.2126, 0.2126, 0.2126)); 
if(brightness > 1.0)
    o_vBloomColor = vec4(o_vFragColor.rgb, 1.0);

现在,我的问题是:如果一个片段不够亮,为什么它输出黑色的布隆附件?我还没有指定它输出任何东西,但它还是会调整它。

例如,如果我清除bloom缓冲区为绿色

// Clear Bloom Buffer
float bloomDefaultValue[4] = { 0.0, 1.0, 0.0, 1.0 };
glClearBufferfv(GL_COLOR, 1, bloomDefaultValue);

和我不输出任何值的绽放附件在片段着色器,我得到一个黑色的绽放缓冲区。你可以从下图中看到。

BloomBuffer

图像中缓冲区为绿色的部分是没有绘制几何图形的部分。黑色部分是图像中包含几何图形的部分,它们不够亮,因此不应该输出任何东西到布隆缓冲,但它们显然输出了一些东西,在这种情况下是黑色的。紫色部分是超出亮度阈值并正常工作的碎片。

黑色怎么了?

不能有条件地从片段着色器中写入颜色缓冲区。

一个输出片段总是有每个活动颜色缓冲区的值,即使你没有写它们。即使您没有为该输出值声明变量,也是如此。如果没有值被写入到特定的片段输出位置,那么使用的值将是未定义的。但是它将是一些

您可以基于颜色掩蔽进行条件书写。但那是一个逐画调用的东西,不是可以在片段着色器中完成的东西。您可以在颜色缓冲中使用混合,使用alpha值为0表示"不要写",并使用alpha值为1来替换那里的内容。

相关内容

  • 没有找到相关文章

最新更新