【问题标题】:OpenGL ES 2.0: glUseProgram vs glUniform performanceOpenGL ES 2.0:glUseProgram 与 glUniform 性能
【发布时间】:2013-04-25 17:30:10
【问题描述】:

哪个更快,一个电话到glUseProgram,或者发送例如6 个左右通过glUniform 浮动(批量或单独),大约浮动多少?

【问题讨论】:

  • 这里没有问这个问题。尽管它与同一主题有关,但另一个问题是:“初始制服设置是否抵消了 glUseProgram 调用开销”。这个问题特别要求在glUseProgram 呼叫和glUniform 呼叫之间进行直接的头对头速度比较,另一个问题没有要求,在这种情况下,特别是(a)glUniform 呼叫/使用 6 个浮点数调用。
  • 我不同意。尽管问题略有不同,但我相信您收到的答案将大同小异。 “重复”标签是为了引导你找到一组已经提供的答案——而不是反映你的问题的质量。如果有“答案将与”标签,我很乐意使用它。

标签: opengl-es shader


【解决方案1】:

您能否更详细地描述您认为这会影响渲染管道性能的场景?它们提供完全不同的功能,我不明白您为什么会关心 glUseProgram 与 glUniform 的性能。

现在让我们分析一下当您使用这些函数来了解它们的成本时会发生什么。

当您调用 glUseProgram 时,它会更改几个 OpenGL 渲染状态,因为我们将使用附加到程序对象的新着色器。规范说,当您调用此函数时,顶点和片段程序会安装在处理器中。仅此一项似乎就足以掩盖 glUniform 的成本。此外,当您安装新的顶点和片段程序时,渲染管道的其他状态会发生变化,以适应程序使用的纹理单元数量和数据布局。

glUniform 将数据从内存的一个位置复制到另一个位置以指定统一变量的值。最坏的情况是复制看起来没有 glUseProgram 复杂的矩阵。

但最终,这一切都取决于您使用 glUniform 传输的数据量和 glUseProgram 的底层实现(它可以由驱动程序进行超级优化并且成本非常低)以及您的引擎是否足够智能对使用相同程序的几何图形进行分组并在不更改状态的情况下绘制它。

【讨论】:

  • 感谢您的想法 - 我希望有更多可用的数字。我可以使用glUseProgram 在着色器之间切换,或者简单地将glUniform 切换到同一个着色器以获得完全相同的效果。在任何一种情况下,着色器都将执行完全相同的计算工作,因此我要求进行直接的头对头速度比较。 glUseProgram 开关用于已链接的程序,而glUniform 用于在典型的 Android 设备上向当前使用的程序发送 6 个浮点数(单独或批量作为一个数组)。似乎找不到足够的信息来确定哪个会更快
  • 如果您在着色器代码中使用分支来处理不同的渲染路径,则代价可能高于切换程序。
  • 好点,但在我的情况下没有分支 - 只需 glUniform 将一些浮点数发送到单例计算(与 glUseProgram 切换程序,其中每个程序具有相同的浮点数硬编码在里面)。显然,这仅适用于在应用程序的生命周期内保持固定的值(但在每帧每个 draw 调用之前不同)。无论如何,我必须通过glUniform 发送着色器计算中的其他动态值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
相关资源
最近更新 更多