【问题标题】:OpenGL ES 3.0: writing to multiple buffersOpenGL ES 3.0:写入多个缓冲区
【发布时间】:2017-02-21 16:01:22
【问题描述】:

OpenGL ES 3.0 规范的一部分对我来说并不完全清楚。

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

如果 OpenGL ES Shading Language 1.00 片段着色器写入 gl_FragColor 或 gl_FragData,DrawBuffers 指定绘制缓冲区,如果 任何,其中由 gl_FragColor 定义的单个片段颜色或 gl_FragData[0] 被写入。如果 OpenGL ES Shading Language 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 编写我的着色器,那么我可以编写一个片段着色器,其输出定义为单个 variing out 变量,并且通过调用 DrawBuffers() 动态打开和关闭对 COLOR1 的写入,无需交换 glPrograms。

上面说的对吗?

【问题讨论】:

    标签: opengl-es


    【解决方案1】:

    上面说的对吗?

    没有。在 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 的输出动态重定向到任何 COLOR_ATTACHMENTi 的任何 i 附加的东西,只需调用 DrawBuffers()?
    • 老实说从未尝试过;我曾经使用 MRT 支持的唯一原因是当我实际上有多个渲染目标时;从未尝试重新映射它们。
    猜你喜欢
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    相关资源
    最近更新 更多