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中,多纹理渲染是如何工作的?_Opengl_Framebuffer_Deferred Rendering - Fatal编程技术网

在现代OpenGL中,多纹理渲染是如何工作的?

在现代OpenGL中,多纹理渲染是如何工作的?,opengl,framebuffer,deferred-rendering,Opengl,Framebuffer,Deferred Rendering,如果我正确理解FBO,我可以将多个2D纹理附加到不同的颜色附着点。我想使用此功能从片段着色器中写出几种不同类型的数据(例如,世界位置和法线)。看起来在古代,这涉及到以不同的索引向gl_FragData写信,但gl_FragData已经不存在了。现在是如何完成的?您可以将输出变量添加到片段着色器中。以下是一个例子: layout(location=0) out vec4 color; layout(location=1) out vec3 normal; layout(location=2) ou

如果我正确理解FBO,我可以将多个2D纹理附加到不同的颜色附着点。我想使用此功能从片段着色器中写出几种不同类型的数据(例如,世界位置和法线)。看起来在古代,这涉及到以不同的索引向gl_FragData写信,但gl_FragData已经不存在了。现在是如何完成的?

您可以将输出变量添加到片段着色器中。以下是一个例子:

layout(location=0) out vec4 color;
layout(location=1) out vec3 normal;
layout(location=2) out vec3 position;

void main() {
    color = vec4(1,0,0,1);
    normal = vec3(0,1,0);
    position = vec3(1,2,3);
}

只需将输出变量添加到片段着色器。以下是一个例子:

layout(location=0) out vec4 color;
layout(location=1) out vec3 normal;
layout(location=2) out vec3 position;

void main() {
    color = vec4(1,0,0,1);
    normal = vec3(0,1,0);
    position = vec3(1,2,3);
}

正如dari所说,您可以使用
布局(location=0)
说明符

指定着色器外部位置的另一种方法是使用:

glBindFragDataLocation(_program, 0, "color");
然后在着色器中:

out vec4 color;
有关输出缓冲区的更详细讨论,请参见此:
正如dari所说,您可以使用
布局(location=0)
说明符

指定着色器外部位置的另一种方法是使用:

glBindFragDataLocation(_program, 0, "color");
然后在着色器中:

out vec4 color;
有关输出缓冲区的更详细讨论,请参见此:

这大致可行,但我发现了一些奇怪之处:如果启用了alpha混合,则颜色附件的输出需要为vec4,这样alpha就可以设置为非零。我还没有设法让
int
ivec
工作(我糟糕的解决方案是将所有内容都转换为浮动)。这大致可行,但我遇到了一些奇怪的情况:如果启用alpha混合,则颜色附件输出需要为vec4,以便alpha可以设置为非零。我还没有设法让
int
ivec
工作(我糟糕的解决方案是将所有内容都转换为浮动)。