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指定绘制缓冲区if 任何,由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,无需交换glPrograms。
以上是否正确?
答案 0 :(得分:1)
以上是否正确?
没有。在ESSL 1.0着色器中,您只能写入单个颜色缓冲区gl_FragData
或其别名gl_FragData[0]
。在ESSL 1.0中没有gl_FragData[1]
这样的东西。
通过调用
COLOR1
动态打开和关闭写入DrawBuffers()
,无需交换glPrograms
。
是的,这是它在ESSL 3.x中的工作方式。
但是,在大多数情况下,交换程序的效率要高得多。您执行着色器程序数百万次(每个片段一次),因此让一个程序包含所有颜色目标的所有代码并且只是屏蔽输出写入是非常低效的。不要这样做。您希望着色器程序尽可能接近最佳 - 这是您的GPU运行时间所在......