在现代 OpenGL 中渲染到多个纹理是如何工作的?
How does rendering to multiple textures work in modern OpenGL?
如果我正确理解 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);
}
正如 dari 所说,您可以使用 layout(location=0)
说明符。
另一种在着色器外部分配位置的方法是使用:
glBindFragDataLocation(_program, 0, "color");
然后在着色器中:
out vec4 color;
有关输出缓冲区的更详尽讨论,请参阅此内容:
https://www.opengl.org/wiki/Fragment_Shader#Output_buffers
如果我正确理解 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);
}
正如 dari 所说,您可以使用 layout(location=0)
说明符。
另一种在着色器外部分配位置的方法是使用:
glBindFragDataLocation(_program, 0, "color");
然后在着色器中:
out vec4 color;
有关输出缓冲区的更详尽讨论,请参阅此内容: https://www.opengl.org/wiki/Fragment_Shader#Output_buffers