【问题标题】:Can't set uniform value in OpenGL shader无法在 OpenGL 着色器中设置统一值
【发布时间】:2014-02-23 11:18:22
【问题描述】:

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

#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,但我尝试了许多不同的版本,结果相同。

【问题讨论】:

    标签: c++ opengl glsl glm-math


    【解决方案1】:

    你在设置制服之前打电话给glUseProgram吗?可以在许多在线示例中找到完整的工作清单,包括我之前写的 (Github: sgxperf/sgxperf_gles20_vg.cpp),它显示了以下序列:

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

    【讨论】:

    • 你是救命稻草,谢谢。我没有意识到在设置制服之前我必须打电话给glUseProgram,但它确实有意义。
    • glUseProgram()glGetUniformLocation()实际上可以互换,对吧?
    • 否,因为 glUseProgram 首先设置了正确的状态,而 glGetUniformLocation 依赖于该状态来获取制服的位置。
    • @mlvljr 我认为它们可以交换,因为 glGetUniformLocation 将要查询的程序作为第一个参数,所以它可以在不先使用的情况下进行查询。 (也实验证实了这一点。)文档没有说明在查询之前应该使用该程序的任何地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多