首页 > 解决方案 > 当与 glUniformMatrix4fv 一起使用时,PyOpenGL 中 glm 的 value_ptr 返回错误

问题描述

我在 PyOpenGL 上使用着色器来渲染事物,现在我想使用矩阵通过将它们传递给着色器来转换我的顶点。为此,我使用 glm 在我的主代码中定义了一个转换矩阵,然后我尝试使用 and 将它作为一个统一传递给我的顶点着色glUniformMatrix4fvglm.value_ptr

当我尝试运行我的代码时,它返回一个无效的操作错误:

OpenGL.error.GLError: GLError(
    err = 1282,
    description = b'invalid operation',
    baseOperation = glUniformMatrix4fv,
    pyArgs = (
        3,
        1,
        GL_FALSE,
        <glfw.LP_c_float object at 0x7f40928b8b70>,
    ),
    cArgs = (
        3,
        1,
        GL_FALSE,
        <glfw.LP_c_float object at 0x7f40928b8b70>,
    ),
    cArguments = (
        3,
        1,
        GL_FALSE,
        <glfw.LP_c_float object at 0x7f40928b8b70>,
    )
)

这是相关的代码部分:

    trans = glm.mat4(1.0)
    trans = glm.rotate(trans, glm.radians(90), glm.vec3(0, 0, 1))
    trans = glm.scale(trans, glm.vec3(0.5, 0.5, 0.5))

    shaderProgram = shaderUtils.shader(vert_shader_file, frag_shader_file)
    shaderProgram.compile()

    transformLocation = glGetUniformLocation(shaderProgram.getID(), 'transform')
    glUniformMatrix4fv(transformLocation, 1, GL_FALSE, glm.value_ptr(trans))

这是我的顶点着色器:

#version 450 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;

out vec2 TexCoord;

uniform mat4 transform;

void main() {
        gl_Position = transform * vec4(aPos, 1.0);
        TexCoord = vec2(aTexCoord.x, aTexCoord.y);
}

glLoadMatrix使用and时我已经遇到过类似的错误glm.value_ptr。我通过使用列表理解将矩阵转换为列表来解决它,我怀疑它在这种情况下也可以工作。

我想知道是否glm.value_ptr只是在Python中通常被破坏,或者我只是使用错误?谢谢!

标签: pythonopenglmatrixglm-mathpyopengl

解决方案


该问题不是由glm.value_ptr. 您没有收到类型错误,而是 OpenGL 错误“无效操作”。

该错误是由于您错过了安装shaderProgram之前的glUniformMatrix4fv.

glUseProgram(shaderProgram.getID())
glUniformMatrix4fv(transformLocation, 1, GL_FALSE, glm.value_ptr(trans))

注意,glUniform*在当前安装的程序的默认统一块中将值设置为统一GL_INVALID_OPERATION,如果没有当前程序对象,则会导致错误。


推荐阅读