当与 glUniformMatrix4fv 一起使用时,PyOpenGL 中 glm 的 value_ptr 返回错误
Posted
技术标签:
【中文标题】当与 glUniformMatrix4fv 一起使用时,PyOpenGL 中 glm 的 value_ptr 返回错误【英文标题】:glm's value_ptr in PyOpenGL returns error when used with glUniformMatrix4fv 【发布时间】:2020-05-07 09:43:13 【问题描述】:我在 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 或 PyGLM 版本有关。但是glm.value_ptr
(结合glUniformMatrix4fv
)对我来说很好。
【参考方案1】:
问题不是由glm.value_ptr
引起的。您没有收到类型错误,而是 OpenGL 错误“无效操作”。
错误是因为你错过了在glUniformMatrix4fv
之前安装shaderProgram
。
glUseProgram(shaderProgram.getID())
glUniformMatrix4fv(transformLocation, 1, GL_FALSE, glm.value_ptr(trans))
注意,glUniform
* 将值设置为当前安装程序的默认统一块中的统一值,如果没有当前程序对象,则会导致 GL_INVALID_OPERATION
错误。
【讨论】:
以上是关于当与 glUniformMatrix4fv 一起使用时,PyOpenGL 中 glm 的 value_ptr 返回错误的主要内容,如果未能解决你的问题,请参考以下文章