GLSL统一行为

GLSL uniform behaviour


所以为了开始我的着色器入门,我决定创建一个简单的 渲染纹理(加载光滑)随着按键逐渐变暗的程序。一切都按预期工作,但我似乎无法正确理解制服以及它们如何与着色器交互。
这是我的简单 vertex 着色器:

varying vec2 vTexCoord;

void main()
{
    vTexCoord = gl_MultiTexCoord0.xy;
    gl_Position = ftransform();
}

片段着色器:

uniform sampler2D myTexture;
uniform vec3 darknessParam;
varying vec2 vTexCoord;

void main()
{
    gl_FragColor = texture2D(myTexture, vTexCoord).rgba *  vec4(darknessParam, 1);
}

所以程序按预期执行,但我通常设置制服 darknessParam,但我没有设置制服 sampler2D,也没有在主 java 中引用它-lwjgl 程序。那么片段着色器如何在没有我在任何地方设置它的情况下使用统一的 sampler2D 呢?
提前致谢,我为冗长的 post.
道歉 祝你有美好的一天!

首先sampler2D是一个类型而不是统一的,所以我对问题的解释如下:

我没有将 myTexture 设置为任何值,为什么它仍然有效?

要使用采样器对象访问着色器中的纹理,必须将纹理单元的编号传递给制服。参见此处的示例:https://www.opengl.org/wiki/Sampler_%28GLSL%29#Binding_textures_to_samplers

假设现在,您正在使用纹理单元 0,则不需要设置制服,因为所有制服都已初始化为 0。

来自https://www.khronos.org/opengles/sdk/docs/man31/html/glLinkProgram.xhtml

As a result of a successful link operation, all active user-defined uniform variables belonging to program will be initialized to 0,...