使用采样器而不传递值

Use sampler without passing through value

我在片段着色器中处理纹理,我使用 sampler2D 来获取 2D 纹理,但我没有在 OpenGL 程序中传递值。但是,那个 sampler2D 的值是正确的。

我对此感到很困惑,对此有何解释?

采样器变量的默认值为 0。来自 GLSL 3.30 规范,“4.3.5 制服”部分:

The link time initial value is either the value of the variable's initializer, if present, or 0 if no initializer is present. Sampler types cannot have initializers.

由于值为 0 意味着它是从纹理单元 0 采样的,因此只要您将纹理绑定到单元 0,它就可以在不设置值的情况下工作。这是定义明确的行为。

由于纹理单元 0 也是默认值,直到您使用 GL_TEXTURE0 以外的值调用 glActiveTexture(),因此只要着色器不需要超过一个,始终使用单元 0 是很常见的质地。这意味着很多时候,设置采样器制服对于简单的应用程序来说是多余的。

我仍然希望始终设置这些值。如果不出意外,任何阅读您的代码的人都可以清楚地知道您真正的意思是从纹理单元 0 进行采样,而不仅仅是忘记设置值。