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

问题描述:

如果我正确理解FBO,我可以将几个2D纹理附加到不同的颜色附着点。我希望使用此功能从片段着色器中写出几种不同类型的数据(例如世界位置和法线)。它看起来像在过去的日子里,这涉及到在不同索引处写入gl_FragData,但gl_FragData不再存在。这是如何完成的?如何在现代OpenGL中渲染多个纹理?

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

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

这个粗略的工作,但我碰到一些古怪:如果alpha混合启用,COLOR_ATTACHMENTi输出需要vec4,所以alpha可以设置t非零。我还没有设法让'int'或'ivec'工作(我糟糕的解决方案是将所有东西都转换成浮动)。 – bfops

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

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

glBindFragDataLocation(_program, 0, "color"); 

然后,在着色器:

out vec4 color; 

为输出缓冲器的更深入的讨论,请参阅此: https://www.opengl.org/wiki/Fragment_Shader#Output_buffers