glm value_ptr в PyOpenGL возвращает ошибку при использовании с glUniformMatrix4fv - PullRequest
1 голос
/ 07 мая 2020

Я использую шейдеры в PyOpenGL для рендеринга вещей, и теперь я хочу использовать матрицы для преобразования моих вершин, передавая их шейдерам. Для этого я определяю матрицу преобразования в моем основном коде с помощью glm, а затем пытаюсь передать ее как униформу моему вершинному шейдеру, используя glUniformMatrix4fv и glm.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))

И вот моя вершина shader:

#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 и glm.value_ptr. Я обошел это, превратив матрицу в список, используя понимание списка, и я подозреваю, что это сработает и в этом случае.

Мне было интересно, если glm.value_ptr просто обычно разбивается на Python, или если я просто неправильно использую? Спасибо!

1 Ответ

0 голосов
/ 07 мая 2020

Проблема не вызвана glm.value_ptr. Вы не получаете ошибку типа, вы получаете ошибку OpenGL «недопустимая операция».

Ошибка вызвана тем, что вы пропустили установку shaderProgram до glUniformMatrix4fv.

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

Обратите внимание: glUniform* устанавливает значение в единый блок по умолчанию для текущей установленной программы и вызывает ошибку GL_INVALID_OPERATION, если текущий программный объект отсутствует.

...