GLSL统一行为

时间:2015-01-18 12:45:57

标签: java opengl glsl lwjgl


因此,为了开始使用着色器启动,我决定创建一个简单的 程序,其中渲染纹理(加载光滑)通过按键逐渐变暗。一切都按预期工作,但我似乎无法正确理解制服以及如何与着色器进行交互。
这是我的简单顶点着色器:

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
提前谢谢,我为这篇长篇文章道歉 祝你有愉快的一天!

1 个答案:

答案 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,...