gpt4 book ai didi

glsl - 假设未设置的 sampler2D 制服将读取纹理单元 0 是否安全?

转载 作者:行者123 更新时间:2023-12-04 04:06:05 25 4
gpt4 key购买 nike

我有多个纹理,其中一个在绘制之前绑定(bind)到 TEXTURE0。

在我的片段着色器中,我有一个 sampler2D 制服,例如:

uniform sampler2D diffuse;

我曾经在每一帧、每个着色器中调用 uniform1f([uniform location], 0) 来显式设置统一以读取纹理单元零,但是在删除这些调用之后,我的应用程序仍然可以在 Linux、Windows 和 Mac 上运行我测试过的系统。这不是不设置 uniform 是安全的决定性证据,因此问题是:假设未设置 sampler2D uniform 将读取纹理单元 0 是否安全?

删除 uniform1f 调用的动机是减少绘制调用,这在使用 webassembly 时特别昂贵,因为调用 javascript 会产生额外的开销。

除了仅在 opengl 4(而非 WebGL 2)中支持的用户可设置默认值之外,我没有在规范中看到任何关于默认值的提及。我应该注意到更改后控制台中没有错误。

最佳答案

Is it safe to assume that unset sampler2D uniforms will read texture unit 0?

是的,它是安全的。

Uniforms 在 WebGL 和 WebGL2 中默认为 0

来自 the spec section 2.12.16

When a program is successfully linked, all active uniforms belonging to theprogram 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为此在一致性测试和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) 所有着色器共享的内容,例如 View 、投影、viewProjection 矩阵、任何相机信息等。(2) 许多对象共享的内容,例如灯光和 Material 设置(3) 对象特定的事物。对于每个模型都不会改变的东西,这意味着您可以通过每个统一缓冲区对象调用 1 个 webgl 来设置它们。

  • 考虑像 instanced drawing 这样的批处理解决方案或 texture based batching .

关于glsl - 假设未设置的 sampler2D 制服将读取纹理单元 0 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62502080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com