无法在 OpenGL 着色器中设置统一值

Can't set uniform value in OpenGL shader

本文关键字:设置 OpenGL      更新时间:2023-10-16

我正在尝试让简单的着色器工作。更具体地说,我正在尝试设置着色器的统一值。着色器成功编译并在我消除统一值时正常工作。下面是(顶点)着色器代码:

#version 440 core
layout(location = 0) in vec3 vertex;
uniform mat4 mvp;
void main()
{
    gl_Position = mvp * vec4(vertex, 1);
}

以及我用来设置值的代码(glGetUniformLocation按预期返回 0):

mvp = glm::mat4(
    glm::vec4(3.0f, 0.0f, 0.0f, 0.0f),
    glm::vec4(0.0f, 1.0f, 0.0f, 0.0f),
    glm::vec4(0.0f, 0.0f, 1.0f, 0.0f),
    glm::vec4(0.0f, 0.0f, 0.0f, 2.0f)
);
GLuint matrix = glGetUniformLocation(program, "mvp");
glUniformMatrix4fv(matrix, 1, GL_FALSE, glm::value_ptr(mvp));

问题是它似乎根本没有设置值。如果我使用 glGetUniformfv 查询制服的值,它会返回默认值(不是我刚刚设置的值),并且几何形状根本不显示(但这只是一个结果,这不是这里的问题)。

如果我在着色器中对制服的值进行硬编码,应用程序会正确显示几何图形,并且在要求输入值(再次使用 glGetUniformfv )时,它会返回正确的值。

#version 440 core
layout(location = 0) in vec3 vertex;
uniform mat4 mvp = mat4(
    vec4(1.0f, 0.0f, 0.0f, 0.0f),
    vec4(0.0f, 1.0f, 0.0f, 0.0f),
    vec4(0.0f, 0.0f, 1.0f, 0.0f),
    vec4(0.0f, 0.0f, 0.0f, 2.0f)
);
void main()
{
    gl_Position = mvp * vec4(vertex, 1);
}

知道为什么会这样吗?我使用的是 OpenGL 4.4,但我尝试了许多不同的版本,结果相同。

你在设置制服之前打电话给glUseProgram吗?完整的工作列表可以在许多在线示例中找到,包括我不久前写的内容(Github:sgxperf/sgxperf_gles20_vg.cpp),其中显示序列为:

glCreateProgram()
glAttachShader()
glLinkProgram()
glUseProgram()
glGetUniformLocation()
glUniformMatrix4fv()