Я использую шейдеры в 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, или если я просто неправильно использую? Спасибо!