Opengl GLSL:Can';我找不到工作地点

Opengl GLSL:Can';我找不到工作地点,opengl,glsl,Opengl,Glsl,我的问题是,我无法获得一些制服的位置,而其他制服的位置我可以毫无问题地获得 例如,我穿的是VS制服,叫做“MVP”和“Model”,我有“MVP”的位置,没有问题,但我没有对称使用的“Model”位置。 以同样的方式,我无法从FS中的光结构中获得场的位置 将数据传递到着色器的代码: bool Shader::SetShaderParameters(mat4 MVPMatrix,mat4 Model,GLint textureUnit) { GLuint matrixLocation = gl

我的问题是,我无法获得一些制服的位置,而其他制服的位置我可以毫无问题地获得

例如,我穿的是VS制服,叫做“MVP”和“Model”,我有“MVP”的位置,没有问题,但我没有对称使用的“Model”位置。 以同样的方式,我无法从FS中的光结构中获得场的位置

将数据传递到着色器的代码:

bool Shader::SetShaderParameters(mat4 MVPMatrix,mat4 Model,GLint textureUnit)
{
  GLuint matrixLocation = glGetUniformLocation(programID,"MVP");
  if(matrixLocation==-1)
    return false;
  glUniformMatrix4fv(matrixLocation,1,GL_FALSE,&MVPMatrix[0][0]);
  GLuint modelLocation = glGetUniformLocation(programID,"Model");
  if(modelLocation==-1)
    return false;
  glUniformMatrix4fv(modelLocation,1,GL_FALSE,&Model[0][0]);
  return true;
}

bool Shader::SetShaderLights(vec3 lightColor,vec3 ambientIntensity,vec3 direction,vec3 diffuseIntensity)
{
    GLuint lightColorLocation = glGetUniformLocation(programID,"light.lightColor");
    if(lightColorLocation==-1)
        return false;
    glUniform3fv(lightColorLocation,1,&lightColor[0]);
    GLuint ambientIntensityLocation = glGetUniformLocation(programID,"light.ambientIntensity");
    if(ambientIntensityLocation==-1)
        return false;
    glUniform3fv(ambientIntensityLocation,1,&ambientIntensity[0]);
    GLuint directionLocation = glGetUniformLocation(programID,"light.direction");
    if(directionLocation==-1)
        return false;
    glUniform3fv(directionLocation,1,&direction[0]);
    GLuint diffuseIntensityLocation = glGetUniformLocation(programID,"light.diffuseIntensity");
    if(diffuseIntensityLocation==-1)
        return false;
    glUniform3fv(diffuseIntensityLocation,1,&diffuseIntensity[0]);
    return true;
}
这是着色器的代码:

VS:

财政司司长:

在获取制服位置时,各种行为会出现什么问题?可能我使用了不好的着色器版本,或者类似于着色器中的数据优化。我正在调试我的解决方案,我非常确定着色器程序ID是正确的

[编辑]:
当我尝试在FS中使用norm时,没有任何变化,在无法获取位置的glGetUniformLocation()之后,我得到了零错误代码。

编译器可以优化掉任何未使用的制服,这就是为什么会出现此错误

你可以放心地忽略这一点。如果找不到制服,
glGetUniformLocation
返回-1。根据OpenGL 4.3规范第7.6.1节:

如果location的值为-1,则Uniform*命令将以静默方式执行 忽略传入的数据,当前的统一值将不会被忽略 变了

这是对的扩展

在我的例子中,当我把
glGetUniformLocation
glUniform*
放在
glUseProgram
之前时,我得到了
-1
;然而,当我把这两个放在
glUseProgram
之后时,我可以得到正确的统一位置


(我的版本是代码> OpenGL 3.3,GLSL 3.30 )/P>你在调用中间检查了GL错误吗?试着在片段着色器中使用<代码>范数< /C> >的值。如果着色器程序的值对最终结果没有影响,则可以从着色器程序中删除代码>模型。实际上,是链接器删除了未使用的制服(它们是程序状态,编译器仅处理着色器)。这不一定是一种优化,而只是链接工作方式的结果。如果某个东西未用于生成程序输出,则它不会生成通过最终链接程序的代码路径,因此通常不会显示非活动制服和属性。Seaparate着色器对象稍微改变了这种行为,因为每个阶段都可以是自己的独立程序(变量只需在当前阶段中使用即可被视为活动)。如果您想引用规范的一部分。这实际上解释了发生的事情,我建议使用第7.6节统一变量的第一段:“着色器可以声明命名的统一变量,如OpenGL着色语言规范中所述。如果编译器和链接器确定在执行可执行代码时将实际访问统一,则统一被视为活动统一。如果编译器和链接器无法做出结论性决定,则统一将被视为活动的。”然后您可以解释

glGetUniformLocation(…)
返回活动制服的位置,如果没有该名称的制服处于活动状态,则返回-1。但就目前情况而言,这个答案并不能真正解释实际发生的情况。
#version 440 core

layout(location=0) in vec3 vertexPosition;
layout(location=1) in vec2 vertexUV;
layout(location=2) in vec3 normal;

out vec2 uv;
out vec3 norm;

uniform mat4 Model;
uniform mat4 MVP;

void main()
{
  gl_Position = MVP*vec4(vertexPosition,1.0);
  uv = vertexUV;
  norm = (Model*vec4(normal,0.0)).xyz;
}
#version 440 core

struct Light
{
  vec3 lightColor;
  vec3 ambientIntensity;
  vec3 direction;
  vec3 diffuseIntensity;
};

in vec2 uv;
in vec3 norm;

out vec3 color;

uniform sampler2D texSamp;
uniform Light light;

void main()
{
  color = texture(texSamp,uv).rgb*light.ambientIntensity;
}