因此,为了开始使用着色器启动,我决定创建一个简单的
程序,其中渲染纹理(加载光滑)通过按键逐渐变暗。一切都按预期工作,但我似乎无法正确理解制服以及如何与着色器进行交互。
这是我的简单顶点着色器:
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
?
提前谢谢,我为这篇长篇文章道歉
祝你有愉快的一天!
答案 0 :(得分:3)
首先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
由于链接操作成功,所有活动用户自定义 属于程序的统一变量将初始化为0,...