c++ - 即使在顶点着色器中使用,glGetUniformLocation() 也返回 -1

标签 c++ opengl glsl

我正在尝试渲染一个带有法线的简单立方体。我正在使用以下代码来初始化着色器。

void initShader(const char* vertexShaderPath, const char* fragmentShaderPath){
    cout<<"Initializing Shaders"<<endl<<"==="<<endl;
    cout<<"Vertex shader ";
    vs = loadShader(vertexShaderPath, GL_VERTEX_SHADER);
    cout<<"Fragment shader ";
    fs = loadShader(fragmentShaderPath, GL_FRAGMENT_SHADER);

    cout<<"Creating program: ";
    program = glCreateProgram();
    if(0==program) cout<< "Failed"<<endl; else cout<< "OK"<<endl;

    glAttachShader(program, vs);
    glAttachShader(program, fs);

    cout<<"Linking program: ";
    glLinkProgram(program); 
    GLint linkstatus = 0;
    glGetProgramiv(program, GL_LINK_STATUS, &linkstatus);
    if(GL_TRUE==linkstatus) cout<<"OK"<<endl; else cout<<"Failed" <<endl;

    cout<<endl<<endl<<"Memory status"<<endl<<"==="<<endl;

    mvpmat = glGetUniformLocation(program,"mvpMatrix");
    mvmat = glGetUniformLocation(program,"mvMatrix");
    normalmat = glGetUniformLocation(program,"normalMatrix");

    cout << "mvpMatrix: "<<mvpmat<<" mvMatrix: "<<mvmat<<" normalMatrix: " << normalmat<<endl;
}

最后一条cout语句的输出结果如下(编译或链接时均无错误)。

mvpMatrix: 0 mvMatrix: -1 normalMatrix: 1

这是我的顶点着色器代码

uniform mat4 mvpMatrix;
uniform mat4 mvMatrix;
uniform mat3 normalMatrix;
attribute vec3 vertex;
attribute vec3 normal;
varying vec3 outNormal;
varying vec3 outPos;

void main(){
    gl_Position = mvpMatrix*vec4(vertex,1.0);
    outPos = (mvMatrix*vec4(vertex,1.0)).xyz;
    outNormal = normalize(normalMatrix*normal);
}

我在代码中使用了所有的 mvpMatrix、mvMatrix 和 normalMatrix。因此我真的很困惑为什么 getUniformLocation() 返回 mvMatrix = -1?

最佳答案

如果您的片段着色器不使用 outPos 的输入,它将被优化掉。制服是在链接后定义的。所以片段着色器和顶点着色器都很重要。

关于c++ - 即使在顶点着色器中使用,glGetUniformLocation() 也返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23319288/

相关文章:

c++ - 从基类转换到派生类抛出异常

c++ - C++实现序列化的数据结构对齐

opengl - 将计算着色器输出渲染到屏幕

java - 在 Java 中渲染 OpenGL Canvas 中的小部件

java - 将缓冲区绑定(bind)到多个目标

c++ - 使用 GLSL 进行光线追踪

ios - 如何在 glsl 的 texture2D 中正确采样 textureCoordinate

c++ - 错误 C2664 : 'errno_t strcpy_s(char *,rsize_t,const char *)' : cannot convert parameter 2 from 'char [512]' to 'rsize_t'

c++ - CPU 时间测量

iphone - 在着色器中除以 0 时会发生什么?