OpenGL 3.0帧缓冲区输出到附件而不指定?
好的,我有一个带有一堆附件的帧缓冲区。附件包括颜色、布卢姆、速度和深度 我首先用下面的代码将帧缓冲区清除为我选择的值OpenGL 3.0帧缓冲区输出到附件而不指定?,opengl,glsl,attachment,framebuffer,fragment-shader,Opengl,Glsl,Attachment,Framebuffer,Fragment Shader,好的,我有一个带有一堆附件的帧缓冲区。附件包括颜色、布卢姆、速度和深度 我首先用下面的代码将帧缓冲区清除为我选择的值 // 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
// 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附件输出黑色?我还没有指定它输出任何东西,但它还是会调整它
例如,如果我将bloom缓冲区清除为绿色
// Clear Bloom Buffer
float bloomDefaultValue[4] = { 0.0, 1.0, 0.0, 1.0 };
glClearBufferfv(GL_COLOR, 1, bloomDefaultValue);
我不向片段着色器中的bloom附件输出任何值,我在bloom缓冲区中得到一个黑色。您可以在下图中看到它
图像中缓冲区为绿色的部分是未绘制几何体的部分。黑色部分是图像中包含不够明亮的几何体的部分,因此不应该向bloom缓冲区输出任何内容,但它们显然输出了一些内容,在本例中为黑色。
紫色部分是超出亮度阈值并按预期工作的碎片
黑色是什么?不能从片段着色器中有条件地写入颜色缓冲区 始终为每个活动颜色缓冲区设置值,即使您没有写入它们。即使没有为该输出值声明变量,这也是正确的。如果没有值被写入特定的片段输出位置,那么使用的值将是未定义的。但这将是一件大事 你可以根据条件写。但这是每次绘制调用的事情,而不是可以在片段着色器中完成的事情。你可以,用0的alpha表示“不写”,用1的alpha表示“不写”