如何在现代OpenGL中渲染多个纹理?

时间:2015-09-27 20:46:25

标签: opengl framebuffer deferred-rendering

如果我正确理解FBO,我可以将几个2D纹理附加到不同的颜色附着点。我想使用此功能从片段着色器(例如世界位置和法线)写出一些不同类型的数据。看起来在过去的日子里,这涉及在不同索引处写入gl_FragData,但gl_FragData不再存在。现在怎么办?

2 个答案:

答案 0 :(得分:4)

您只需将输出变量添加到片段着色器即可。这是一个例子:

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);
}

答案 1 :(得分:2)

正如dari所说,你可以使用layout(location=0)说明符。

在着色器外部分配位置的另一种方法是使用:

glBindFragDataLocation(_program, 0, "color");

然后在着色器中:

out vec4 color;

有关输出缓冲区的更全面讨论,请参阅此处: https://www.opengl.org/wiki/Fragment_Shader#Output_buffers