Opengl es OpenGL ES 3.0:写入多个缓冲区

Opengl es OpenGL ES 3.0:写入多个缓冲区,opengl-es,Opengl Es,OpenGLES3.0规范中有一部分我并不完全清楚 ,第185页: 如果OpenGL ES着色语言1.00片段着色器写入 gl_FragColor或gl_FragData,DrawBuffers指定绘图缓冲区,如果 任何,由gl_FragColor或 写入了gl_FragData[0]。如果使用OpenGL ES着色语言3.00 片段着色器写入一个用户定义的变量, DrawBuffers指定一组绘图缓冲区,其中每个 由这些变量定义的多个输出颜色是分开的 书面的 我的理解如下: 1) 如果我使用O

OpenGLES3.0规范中有一部分我并不完全清楚

,第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)的程序

2) 另一方面,如果我使用OpenGL ES 3.0并使用GLSL 3.0编写着色器,那么我可以编写一个片段着色器,将输出定义为单个变量,并通过调用DrawBuffers()动态打开和关闭对COLOR1的写入,而无需交换GLSL程序

以上是正确的吗

以上是正确的吗

不可以。在ESSL 1.0着色器中,只能写入单色缓冲区
gl_FragData
,或其别名
gl_FragData[0]
。在ESSL 1.0中没有
gl_FragData[1]

通过调用
DrawBuffers()
动态地打开和关闭写入
COLOR1
,而无需交换
glPrograms

是的,这就是它在ESSL 3.x中的工作方式


然而,在大多数情况下,仅仅交换程序要有效得多。您执行着色器程序数百万次(每个片段一次),因此一个程序包含所有颜色目标的所有代码,并且只屏蔽输出写入,效率极低。不要这样做。您希望您的着色器程序尽可能接近最优-这就是您的GPU运行时的方向…

谢谢。还有一个问题(我想我应该试着去做,而不是问你):规范似乎在说,即使使用GLSL 1.0,我仍然可以动态地将gl_FragColor的输出重定向到任何附加颜色,对于任何附加了东西的I,只需简单地调用DrawBuffers()?说实话,我从未尝试过;我使用MRT支持的唯一原因是我实际上有多个渲染目标;从未试图重新映射它们。