Webgl 换制服还是换节目好?

Webgl 换制服还是换节目好?,webgl,Webgl,使用webgl,我需要执行3个过程来渲染场景。每个过程运行相同的几何体和着色器,但对于某些统一和纹理具有不同的值 我似乎有两个选择。有一个单一的“程序”,并设置每个通行证的所有制服和纹理。或者有3个“程序”,每个程序都包含相同的着色器,并为每个程序设置一次所有必要的制服/着色器,然后为每个过程切换程序。这意味着我将对每个过程执行一次useProgram调用,而不是对每个过程执行man setUniform调用 第二种技术可能会更快,因为它将避免很多setuniform调用,还是更改程序非常昂贵?

使用webgl,我需要执行3个过程来渲染场景。每个过程运行相同的几何体和着色器,但对于某些统一和纹理具有不同的值

我似乎有两个选择。有一个单一的“程序”,并设置每个通行证的所有制服和纹理。或者有3个“程序”,每个程序都包含相同的着色器,并为每个程序设置一次所有必要的制服/着色器,然后为每个过程切换程序。这意味着我将对每个过程执行一次useProgram调用,而不是对每个过程执行man setUniform调用

第二种技术可能会更快,因为它将避免很多setuniform调用,还是更改程序非常昂贵?我做了一些试验,但用我目前拥有的非常简单的几何图形,我看不到性能上的任何差异,因为设置成本压倒了任何差异


有什么理由选择一种技术而不是另一种吗?

如果着色器程序相同,只需通过glUniform发送不同的值即可

程序之间的切换通常比均匀值的更改慢。 无论如何,Uber着色器程序(包括useLighting、useAlphaMap等制服列表)在大多数情况下都不好

@格曼 我们谈论的是WebGL(GLE2.0),它没有UBO。(统一缓冲区对象)

@顶
尝试避免重新绑定着色器程序(但这不是世界末日),不要创建一个uber着色器

当需要重新绑定大量纹理时,纹理贴图集应该是最快的解决方案,因此不需要重新绑定纹理,也不需要重新绑定程序。可以通过修改表示texCoord偏移的制服来切换纹理

修改此类制服可以进一步优化:

你应该考虑把修改后的制服移到属性上。通常,它们的数据源是使用attribPointers提供的,但是当禁用它们时,也可以使用常量值。使用attribXXX()函数指定它们的常量值,而不是unformXXX()

我认为最好的例子是灯光位置。通常情况下,每次灯光位置更改到所有使用它的程序时,都必须为其指定统一的值。相反,当使用“属性化”制服时,可以在灯光移动时指定属性值一次全局

-优点: 当您有许多程序想要共享统一的时候,这种方法最适合,因为我们知道我们不能在WebGL中使用统一的缓冲区,这是唯一合理的解决方案

-缺点:


当然,这种“属性化”制服的可用尺寸比使用常规制服要小得多,但如果你在制服的某个部分使用,它仍然可以大大加快速度

我相信切换程序会更快,但我不确定。在OpenGL ES 3.0中,他们添加了制服集合,
uniform buffer objects
,这样您就可以在一个块中设置所有制服,然后在一次调用中应用整个制服块。我的理解是,一些司机通过在内部存储多个程序实现了这一点,每个制服块对应一个程序。同时,这可能取决于驾驶员哪种技术更快。一般来说,对驱动程序的调用越少越好。谢谢,我应该补充一点,我已经尝试了这两种方法,在我的应用程序中,最终似乎没有什么可测量的差异。谢谢。好的,这就是我现在要做的。谢谢你的帖子。我问的原因是,我有相同的着色器,但有相当多的纹理,以重新绑定每个过程。实际上,我所做的似乎没有什么不同。