2013-04-25 77 views
2

哪个更快,单个调用glUseProgram,或发送6个左右通过glUniform浮动(分批或分开),并大约多少钱?OpenGL ES 2.0:glUseProgram vs glUniform performance

+1

[GLSL multiple shaderprogram VS uniforms switches]可能的重复(http://stackoverflow.com/questions/6539774/glsl-multiple-shaderprogram-vs-uniforms-switches) – Ani 2013-04-25 17:54:16

+0

这里没有提到这个问题。虽然它涉及同一主题,但另一个问题是:“初始制服设置是否抵消了glUseProgram调用开销”。这个问题特别要求在'glUseProgram'调用和'glUniform'调用之间进行直接的头对头速度比较,其他问题没有要求,在这种情况下,具体地(a)“glUniform”调用/与6个花车呼叫。 – Navigateur 2013-04-25 21:20:15

+0

我不同意。尽管问题略有不同,但我相信您收到的答案将沿着相同的路线。 “重复”标签是指导你一套已经提供的答案 - 而不是反思你的问题的质量。如果有“答案将与”标签相同,我很乐意使用它。 – Ani 2013-04-29 15:03:21

回答

0

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

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

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

glUniform将数据从一个内存位置复制到另一个位置以指定统一变量的值。最糟糕的情况是复制似乎不如glUseProgram复杂的矩阵。

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

+0

感谢您的想法 - 我希望有更多的数字可用于此。我可以使用'glUseProgram'在着色器或简单的'glUniform'之间切换到相同的着色器,以获得完全相同的效果。无论哪种情况,着色器都会执行完全相同的计算工作,因此我要求进行直接头对头速度比较。 'glUseProgram'开关是一个已经链接的程序,'glUniform'是在典型的Android设备上发送6个浮点数(单独或批量为一个数组)到当前使用的程序。似乎无法找到足够的信息来确定哪个会更快 – Navigateur 2013-04-30 02:17:12

+1

如果您在着色器代码中分支以处理不同的渲染路径,惩罚可能会高于切换程序。 – 2013-05-03 02:00:26

+0

好点,但在我的情况下没有分支 - 只是'glUniform'向单个计算发送一些浮点数(vs'glUseProgram'来切换每个程序都有那些硬编码的非常相同的浮点数的程序)。显然,这只适用于在应用程序的整个生命周期内保持固定的值(但在每个“draw”调用之前不同)。无论如何,我必须通过'glUniform'发送其他的着色器计算中的动态值。 – Navigateur 2013-05-03 09:13:58