2017-02-21 131 views
1

OpenGL ES 3.0规范的一部分对我来说并不完全清楚。OpenGL ES 3.0:写入多个缓冲区

https://www.khronos.org/registry/Ope...s_spec_3.0.pdf,第185页:

如果一个OpenGL ES着色语言1.00片段着色器写入 gl_FragColor或gl_FragData,DrawBuffers指定绘制缓冲区,如果 任何,到其中的单个片段的颜色由gl_FragColor定义或者 写入gl_FragData [0]。如果一个OpenGL ES着色语言3.00 片段着色器写入用户定义的变化出变量, DrawBuffers指定一组绘制缓冲区成各由这些变量所限定的 多输出颜色可单独 写入。

我此了解以下方式:

1)如果我使用OpenGL ES 3.0和写入使用GLSL 1.0着色器,那么唯一的办法可以写至2个缓冲器一次(COLOR0和COLOR1)是手动指定在片段着色器中写入gl_FragData [0]和gl_FragData [1]的内容。如果我然后想回到仅写入COLOR0,我必须将glPrograms切换为只写入gl_FragData [0](或gl_FragColor)的glPrograms。 2)如果另一方面我使用OpenGL ES 3.0并使用GLSL 3.0编写我的着色器,那么我可以编写一个片段着色器,其输出被定义为单个变量,变量为变量,并且动态地开启并且关闭通过调用DrawBuffers()写入COLOR1,而不需要交换glPrograms。

以上是否正确?

回答

1

以上是否正确?

号在ESSL 1.0着色器,你只能写一个单一的颜色缓冲gl_FragData,或者它的别名gl_FragData[0]。 ESSL 1.0中没有gl_FragData[1]这样的东西。

,并动态地打开和关闭与调用DrawBuffers()并且不需要换glProgramsCOLOR1

是的,这是它在ESSL 3.x中的工作原理。

但是,在大多数情况下,交换程序的效率会更高。你执行着色器程序数百万次(每个片段一次),因此有一个程序包含所有颜色目标的所有代码,并且只是掩盖输出写入,这是非常低效的。不要这样做。你希望你的着色器程序尽可能地接近最优 - 这就是你的GPU运行时间去的地方...

+0

谢谢。还有一个问题(我想我应该试着做而不是问你):规范似乎是说即使使用GLSL 1.0,我仍然可以动态地将gl_FragColor的输出重定向到任何COLOR_ATTACHMENTi,对于任何有附件的我,都通过简单的调用DrawBuffers()? – Leszek

+0

从未尝试过说实话;我曾经使用过MRT支持的唯一原因是我实际上有多个渲染目标;从来没有试图重新映射它们。 – solidpixel