GLSL:无法获得制服位置

Cpp*_*ter 5 opengl glsl

我的问题是事实上,我不能得到一些制服位置,当别人的位置我得到没有问题.

例如,我有VS制服称为"MVP"和"模型",我有"MVP"位置没有问题,但我没有"模型"位置,我对称使用.以同样的方式,我无法从FS中的Light结构获得字段的位置.

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

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;
}
Run Code Online (Sandbox Code Playgroud)

这是着色器的代码:

VS:

#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;
}
Run Code Online (Sandbox Code Playgroud)

FS:

#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;
}
Run Code Online (Sandbox Code Playgroud)

获得制服的位置时,各种行为可能有什么问题?也许我使用不良版本的着色器,或者它有点像着色器中的数据优化.我正在调试我的解决方案,我很确定着色器程序ID是正确的.

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

And*_*urg 8

允许编译器优化掉任何未使用的制服,这就是你得到这个错误的原因.

你可以放心地忽略这个.如果未找到制服,则glGetUniformLocation返回-1.从OpenGL 4.3规范,第7.6.1节:

如果location的值为-1,则Uniform*命令将静默忽略传入的数据,并且不会更改当前的统一值.


Jia*_*ang 5

这是对Andreas答案的扩展。

就我而言,当我放进去之前glGetUniformLocationglUniform*之后glUseProgram,我得到了-1;但是,当我把这两个放在之后时glUseProgram,我可以获得正确的统一位置。

(我的版本是OpenGL 3.3, GLSL 3.30