You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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Јовић

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:07:44