我在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))
这是我的顶点着色器。
#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中一般都是坏的,还是我用错了?谢谢!我在PyOpenGL上使用着色器来渲染东西,现在我想使用矩阵通过它们来变换我的顶点。
这个问题不是由以下原因造成的 glm.value_ptr
. 你没有得到一个类型错误,你得到的是OpenGL错误 "无效操作"。
该错误的原因是由于您没有安装 shaderProgram
之前 glUniformMatrix4fv
.
glUseProgram(shaderProgram.getID())
glUniformMatrix4fv(transformLocation, 1, GL_FALSE, glm.value_ptr(trans))
注意: glUniform
* 在当前安装的程序的默认制服块中设置一个值为制服,并引起一个 GL_INVALID_OPERATION
错误,如果没有当前程序对象。