具有多个gl_Position输出的OpenGL多个渲染目标

时间:2016-02-11 01:25:04

标签: c++ opengl glsl

我正在寻找一个可以在不同位置写入缓冲区的MRT。

实施例

缓冲区0: gl_Position [0] = vec4(uv,0,1。); gl_FragData [0] = vec4(1。);

缓冲区1: gl_Position [1] = MVP * pos; gl_FragData [1] = vec4(0。);

顶点着色器中是否可以有多个输出? 我找不到任何相关资源..

1 个答案:

答案 0 :(得分:2)

  

是否可以在顶点着色器中有多个输出?

不,但这并不意味着你无法获得你想要的效果。好吧,你没有详细描述你想要的东西,但这与OpenGL可以提供的一样接近。

你想要的东西看起来很像layered rendering Geometry Shader 能够生成到不同层的基元。因此,您可以生成一个呈现为一个图层的三角形,然后生成一个第二个三角形,该三角形将转移到另一个图层。

当然,这提出了一个问题:什么是层?那么,这与layered framebuffers有关。请参阅,如果将分层图像附加到帧缓冲区(array texturecubemap texture),则每个阵列图层/立方体贴图表示可以渲染到的不同2D图层。几何着色器可以将每个输出图元发送到分层帧缓冲区中的特定图层。因此,如果图像中有3个阵列图层,则GS可以将图元输出到图层0,1或2,并且该图元将仅渲染到数组纹理中的特定图像。

深度缓冲区也可以分层,如果你想要使用分层渲染进行深度测试,必须使用分层深度缓冲区。图元渲染的所有方面都由它发送到的图层控制。因此,当片段着色器运行时,输出将仅转到它渲染到的图层。深度测试完成后,该测试的读取将仅从深度缓冲区的该层读取。等等,包括混合。

当然,使用分层帧缓冲区意味着特定图像附件中的所有图层必须来自相同的纹理。因此他们必须具有相同的Image Format。所以有局限性。但总的来说,它或多或少地符合你的要求。