繁体   English   中英

glsl顶点着色器glGetUniformLocation失败

[英]glsl vertex shader glGetUniformLocation fails

我想在我的顶点着色器中设置一个统一的Vector。

int loc = glGetUniformLocation(shader, "LightPos");
if (loc != -1)
{
    //do Stuff
}

问题是loc一直都是-1。 我使用了片段着色器中的变量进行了尝试,该变量确实有效。 顶点着色器:

uniform vec3 LightPos;
varying vec2 UVCoord;
varying float LightIntensity;

void main()
{           
    UVCoord = gl_MultiTexCoord0.st;
    gl_Position = ftransform();
    vec3 Normal = normalize(gl_NormalMatrix * gl_Normal);
    LightIntensity = max(dot(normalize(vec3(0, -10, 0)), Normal), 0.0);
}

片段着色器:

uniform sampler2D tex1;
varying vec2 UVCoord;
varying float LightIntensity;

void main()
{
    vec3 Color = vec3(texture2D(tex1, UVCoord));
    gl_FragColor = vec4(Color * LightIntensity, 1.0);
}

有人知道我在做什么错吗?

不幸的是,您误解了glGetUniformLocation (...)和统一位置分配在一般情况下的工作方式。

仅在编译和链接了着色器之后才分配位置。 这是一个两阶段操作,可有效地仅识别GLSL程序的所有阶段(顶点,片段,几何,细分)之间使用的输入和输出。 由于LightPos未在您的顶点着色器(或其他任何地方)中使用,因此在链接程序时未为其分配位置。 它根本不存在。

这是主动制服一词的来历。 glGetUniformLocation (...)仅返回活动制服的位置。


名称

glGetUniformLocation —返回统一变量的位置

[...]

描述

glGetUniformLocation返回一个整数,该整数表示程序对象中特定统一变量的位置。 名称必须是不包含空格的以空终止的字符串。 名称必须是程序中的活动统一变量名称,该名称不是结构,结构数组或向量或矩阵的子组件。 如果名称不对应于程序中的活动统一变量,或者名称以保留前缀“ gl_”开头,或者名称与原子计数器或命名统一块关联,则此函数返回-1。

您实际上并没有在着色器中使用 LightPos,因此优化程序没有为其分配任何寄存器

编译器可以自由地优化制服并在不使用制服的情况下进行归因

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM