使用采样器而不传递值

HgM*_*gMs 2 glsl

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

我对此感到非常困惑,对此有任何解释吗?

Ret*_*adi 5

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

链接时初始值要么是变量初始化器的值(如果存在),要么是 0(如果不存在初始化器)。采样器类型不能有初始值设定项。

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

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

我仍然希望始终设置这些值。如果不出意外,它会让任何阅读您代码的人都清楚您真正想从纹理单元 0 采样,并且不会忘记设置该值。