Opengl es OpenGL ES 2.0:GluseProgramm与GlusiForm性能

Opengl es OpenGL ES 2.0:GluseProgramm与GlusiForm性能,opengl-es,shader,Opengl Es,Shader,哪个更快,一次调用glUseProgram,或者通过glUniform(批处理或单独)发送6个左右的浮点值,大约是多少?您能否更详细地描述一下您认为这会影响渲染管道性能的场景?它们提供了完全不同的功能,我不明白你为什么会关心glUseProgram和glUniform的性能 现在,让我们分析一下当您使用这些函数来了解它们的成本时会发生什么 调用glUseProgram时,它会更改几个OpenGL渲染状态,因为我们将使用附加到程序对象的新着色器。规范规定,调用此函数时,顶点和片段程序安装在处理器中

哪个更快,一次调用
glUseProgram
,或者通过
glUniform
(批处理或单独)发送6个左右的浮点值,大约是多少?

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

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

调用glUseProgram时,它会更改几个OpenGL渲染状态,因为我们将使用附加到程序对象的新着色器。规范规定,调用此函数时,顶点和片段程序安装在处理器中。单凭这一点看来,成本就足以盖过glUniform的成本。此外,安装新的顶点和片段程序时,渲染管道的其他状态也会更改,以适应程序使用的纹理单元数和数据布局

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


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

这里没有提出可能重复的问题。尽管它与同一主题相关,但另一个问题是:“初始设置是否抵消了GluseProgramm调用开销”。这个问题特别要求在
glUseProgram
调用和
glUniform
调用之间进行直接的头对头速度比较,这是另一个问题没有要求的,在这种情况下,特别是(a)
glUniform
调用/调用有6个浮点数。我不同意。尽管问题略有不同,但我相信你得到的答案是相同的。“重复”标签是为了引导你找到一组已经提供的答案,而不是反映你问题的质量。如果有一个“答案将与”标签,我会很乐意使用它。谢谢你的想法-我希望这上面有更多的数字。我可以使用
glUseProgram
在着色器之间切换,或者简单地对同一着色器使用
glUniform
以获得完全相同的效果。无论哪种情况,着色器都将执行完全相同的计算工作,因此我要求进行直接的头对头速度比较。
glUseProgram
开关用于连接一个已经链接的程序,&
glUniform
用于在一个典型的Android设备上向当前使用的程序发送6个浮点值(单独或批量作为一个数组)。似乎找不到足够的信息来确定哪一个会更快如果你在着色器代码中有分支来处理不同的渲染路径,那么惩罚可能会比切换程序更高。这一点很好,但在我的例子中没有分支-只需
glUniform
向单个案例计算发送一些浮点值(vs
glUseProgram
切换程序,其中每个程序中都有硬编码的相同浮点值)。显然,这只适用于在应用程序生命周期内保持固定的值(但在每个
draw
调用每帧之前不同)。无论如何,我必须通过
glUniform
发送着色器计算中的其他动态值。