假设未设置的 sampler2D 制服将读取纹理单元 0 是否安全?
Is it safe to assume that unset sampler2D uniforms will read texture unit 0?
我有多个纹理,其中一个在绘制之前绑定到 TEXTURE0。
在我的片段着色器中,我有一个 sampler2D 制服,例如:
uniform sampler2D diffuse;
我曾经在每一帧、每个着色器中调用 uniform1f([uniform location], 0) 来显式设置 uniform 以读取纹理单元零但是,在删除这些调用之后,我的应用程序仍然可以在 Linux、Windows 和 Mac 我测试过的系统。这不是不设置制服是安全的决定性证据,因此问题是:假设未设置 sampler2D 制服将读取纹理单元 0 是否安全?
删除 uniform1f 调用的动机是减少绘制调用,这在使用 webassembly 时特别昂贵,因为调用 javascript.
会产生额外开销
除了仅在 opengl 4(而非 WebGL 2)中支持的用户可设置默认值外,我没有在规范中看到任何默认值的提及。我应该注意到更改后控制台没有错误。
Is it safe to assume that unset sampler2D uniforms will read texture unit 0?
是的,它很安全。
在 WebGL 和 WebGL2 中统一默认为 0
When a program is successfully linked, all active uniforms belonging to the
program object’s default uniform block are initialized: to 0.0 for floating-point uniforms, to 0 for integer uniforms, and to FALSE for boolean uniforms
浏览器中有 tests for this in the conformance tests and workarounds 不良驱动程序。
虽然我们在这里,但属性默认为 0、0、0、1。
第 2.8 节
The initial values for all generic vertex attributes are (0.0, 0.0, 0.0, 1.0).
自 2011 年 WebGL 发布以来我编写的几乎所有程序中都使用了这两个功能,并且在 WebGL2 中继续使用
至于减少 WebGL 调用,不将统一设置为 0 似乎不太可能成为性能和非性能之间的区别。如果 CPU 是你的瓶颈(许多基于 GPU 的程序,GPU 本身就是瓶颈)并且如果瓶颈在于调用 WebGL 那么你可以做的事情
不要在渲染时做任何你能在初始化时做的事情。例如在初始时间查找统一位置。
不要在渲染时更改属性,在初始化时设置顶点数组对象。
如果不需要,请不要使用采样器对象。成千上万的应用程序在没有它们的情况下发货,因为它们直到 WebGL2/OpenGL ES 3.0
才存在
使用统一的缓冲区对象。理想情况下,您可能希望将统一缓冲区对象分成多个组,例如 (1) 所有着色器共享的事物,例如视图、投影、viewProjection 矩阵、任何相机信息等。(2) 许多对象共享的事物,例如灯光和 material settings (3) 对象特定的东西。对于每个模型都不会改变的东西,这意味着您可以通过每个统一缓冲区对象调用 1 个 webgl 来设置它们。
考虑像 instanced drawing or texture based batching.
这样的批处理解决方案
我有多个纹理,其中一个在绘制之前绑定到 TEXTURE0。
在我的片段着色器中,我有一个 sampler2D 制服,例如:
uniform sampler2D diffuse;
我曾经在每一帧、每个着色器中调用 uniform1f([uniform location], 0) 来显式设置 uniform 以读取纹理单元零但是,在删除这些调用之后,我的应用程序仍然可以在 Linux、Windows 和 Mac 我测试过的系统。这不是不设置制服是安全的决定性证据,因此问题是:假设未设置 sampler2D 制服将读取纹理单元 0 是否安全?
删除 uniform1f 调用的动机是减少绘制调用,这在使用 webassembly 时特别昂贵,因为调用 javascript.
会产生额外开销除了仅在 opengl 4(而非 WebGL 2)中支持的用户可设置默认值外,我没有在规范中看到任何默认值的提及。我应该注意到更改后控制台没有错误。
Is it safe to assume that unset sampler2D uniforms will read texture unit 0?
是的,它很安全。
在 WebGL 和 WebGL2 中统一默认为 0
When a program is successfully linked, all active uniforms belonging to the program object’s default uniform block are initialized: to 0.0 for floating-point uniforms, to 0 for integer uniforms, and to FALSE for boolean uniforms
浏览器中有 tests for this in the conformance tests and workarounds 不良驱动程序。
虽然我们在这里,但属性默认为 0、0、0、1。
第 2.8 节
The initial values for all generic vertex attributes are (0.0, 0.0, 0.0, 1.0).
自 2011 年 WebGL 发布以来我编写的几乎所有程序中都使用了这两个功能,并且在 WebGL2 中继续使用
至于减少 WebGL 调用,不将统一设置为 0 似乎不太可能成为性能和非性能之间的区别。如果 CPU 是你的瓶颈(许多基于 GPU 的程序,GPU 本身就是瓶颈)并且如果瓶颈在于调用 WebGL 那么你可以做的事情
不要在渲染时做任何你能在初始化时做的事情。例如在初始时间查找统一位置。
不要在渲染时更改属性,在初始化时设置顶点数组对象。
如果不需要,请不要使用采样器对象。成千上万的应用程序在没有它们的情况下发货,因为它们直到 WebGL2/OpenGL ES 3.0
才存在使用统一的缓冲区对象。理想情况下,您可能希望将统一缓冲区对象分成多个组,例如 (1) 所有着色器共享的事物,例如视图、投影、viewProjection 矩阵、任何相机信息等。(2) 许多对象共享的事物,例如灯光和 material settings (3) 对象特定的东西。对于每个模型都不会改变的东西,这意味着您可以通过每个统一缓冲区对象调用 1 个 webgl 来设置它们。
考虑像 instanced drawing or texture based batching.
这样的批处理解决方案