当与glUniformMatrix4fv一起使用时,PyOpenGL中的glm's value_ptr返回错误。

问题描述 投票:1回答:1

我在PyOpenGL上使用着色器来渲染东西,现在我想使用矩阵来转换我的顶点,将它们传递给着色器。为此,我在我的主代码中使用glm定义了一个变换矩阵,然后我尝试使用 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);
}

当我在使用顶点着色器时,我已经遇到过类似的错误 glLoadMatrixglm.value_ptr. 我曾用列表理解法把矩阵变成了一个列表,我想在这种情况下也能解决这个问题。

我在想,如果 glm.value_ptr 在Python中一般都是坏的,还是我用错了?谢谢!我在PyOpenGL上使用着色器来渲染东西,现在我想使用矩阵通过它们来变换我的顶点。

python opengl matrix glm-math pyopengl
1个回答
0
投票

这个问题不是由以下原因造成的 glm.value_ptr. 你没有得到一个类型错误,你得到的是OpenGL错误 "无效操作"。

该错误的原因是由于您没有安装 shaderProgram 之前 glUniformMatrix4fv.

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

注意: glUniform* 在当前安装的程序的默认制服块中设置一个值为制服,并引起一个 GL_INVALID_OPERATION 错误,如果没有当前程序对象。

© www.soinside.com 2019 - 2024. All rights reserved.