如何在GLSL 320 ES着色器中获取Uniform块变量的位置?
如何正确获取GLSL Uniform块成员的位置
核心问题:误用查询方法
你用attributeLocation()来查询uniform变量的位置,这是完全错误的——这个方法专门用于获取**顶点属性(着色器中in修饰的输入变量,比如你的vertex、texCoord)**的位置,uniform变量必须使用uniformLocation()方法查询。
正确的查询方式
根据你用glGetActiveUniform列出的结果,uniform成员的完整名称是Projection.type和Projection.mvp_matrix,因此需要使用这个全名来查询:
Qt QOpenGLShaderProgram 方式
// 获取mvp_matrix的位置 GLint mvpLoc = program->uniformLocation("Projection.mvp_matrix"); qDebug() << "Projection.mvp_matrix location:" << mvpLoc; // 获取type的位置 GLint typeLoc = program->uniformLocation("Projection.type"); qDebug() << "Projection.type location:" << typeLoc;
原生OpenGL方式
GLuint programId = program->programId(); GLint mvpLoc = glGetUniformLocation(programId, "Projection.mvp_matrix"); if (mvpLoc != -1) { // 成功获取位置,可调用glUniformMatrix4fv等方法设置值 }
为什么用projection.mvp_matrix查询失败?
你在着色器中定义的projection是uniform块的实例名,但GLSL链接后,uniform块成员的识别名称是块的类型名(Projection) + 成员名,而不是实例名+成员名,这就是你用实例名查询返回-1的原因。
内容的提问来源于stack exchange,提问作者BЈовић
相关产品推荐
相关产品推荐

