首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenGL ES 3.0:写入多个缓冲区

OpenGL ES 3.0:写入多个缓冲区
EN

Stack Overflow用户
提问于 2017-02-21 16:01:22
回答 1查看 750关注 0票数 1

对于我来说,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。

以上内容正确吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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运行时的方向.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42372188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档