对于我来说,OpenGL ES3.0规范的一个部分并不完全清楚。
3.0.pdf,第185页:
如果OpenGL ES阴影语言1.00片段着色器写入gl_FragColor或gl_FragData,则DrawBuffers指定绘制缓冲区(如果有的话),其中写入gl_FragColor或gl_FragData定义的单个片段颜色。如果OpenGL ES阴影语言3.00片段着色器写入用户定义的可变变量,则DrawBuffers指定一组绘制缓冲区,其中这些变量定义的多个输出颜色分别写入其中。
我对此的理解如下:
1)如果我使用OpenGL ES 3.0并使用GLSL1.0编写着色器,那么唯一可以一次写入两个缓冲区(COLOR0和COLOR1)的方法是在片段着色器中手动指定写入gl_FragData和gl_FragData1的内容。如果我想回到只写COLOR0的问题上,我必须将glPrograms转换为只写到gl_FragData0的。
2)另一方面,如果我使用OpenGL es3.0并使用GLSL3.0编写我的着色器,那么我可以编写一个片段着色器,其输出定义为单个变量,并动态地打开或关闭对COLOR1的写入,调用DrawBuffers(),不需要交换glPrograms。
以上内容正确吗?
发布于 2017-02-22 11:14:59
以上内容正确吗?
不是的。在Essl1.0着色器中,您只能写入单个颜色的缓冲区gl_FragData
,或者它的别名gl_FragData[0]
。在Essl1.0中没有像gl_FragData[1]
这样的东西。
并动态地打开和关闭对
COLOR1
的写入,调用DrawBuffers()
,而不需要交换glPrograms
。
是的,这就是ESSL 3.x中的工作原理。
然而,在大多数情况下,仅仅是交换程序就更有效了。您执行着色器程序数百万次(每段一次),因此,一个程序包含所有颜色目标的所有代码,并且只是掩蔽输出写入是可怕的低效率。不要这样做。你希望你的着色程序尽可能接近最优-这是你的GPU运行时的方向.
https://stackoverflow.com/questions/42372188
复制相似问题