Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL 3.0帧缓冲区输出到附件而不指定?_Opengl_Glsl_Attachment_Framebuffer_Fragment Shader - Fatal编程技术网

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表示“不写”