调用glGetUniformBlockIndex等OpenGL方法时类型错误问题求助
Uniform Buffer Object与GLSL几何着色器交互时的类型错误问题
在Ubuntu 22.04环境下,尝试使用Uniform Buffer Object与GLSL几何着色器交互,调用glGetUniformBlockIndex、glGetUniformIndices、glGetActiveUniformBlockiv、glGetActiveUniformsiv这些方法时,均触发如下错误:
File "~/Venv_tk/Tdd/./newMilar.py", line 100, in border self.index = glGetUniformBlockIndex (self.bProgram, "quadrant") File "src/latebind.pyx", line 39, in OpenGL_accelerate.latebind.LateBind.__call__ File "src/wrapper.pyx", line 314, in OpenGL_accelerate.wrapper.Wrapper.__call__ File "src/wrapper.pyx", line 311, in OpenGL_accelerate.wrapper.Wrapper.__call__ File "~/Venv_tk/lib/python3.10/site-packages/OpenGL/platform/baseplatform.py", line 415, in __call__ return self( *args, **named ) ctypes.ArgumentError: ("argument 1: <class 'TypeError'>: wrong type", (<Ogl.Shader.Shader object at 0x7f912843a1d0>, b'quadrant'))
相关几何着色器代码
#version 430 core layout (points, invocations = 4) in ; layout (line_strip, max_vertices = 4) out ; layout (std140) uniform quadrant { mat4 projection[4] ; } ; void main (void) { for (int k = 0 ; k < gl_in.length () ; k++) { gl_Position = projection[gl_InvocationID] * (gl_in[k].gl_Position - vec4 (0.1, 0.0, 0.0, 0.0)) ; gl_ViewportIndex = gl_InvocationID ; EmitVertex () ; gl_Position = projection[gl_InvocationID] * (gl_in[k].gl_Position + vec4 (0.1, 0.0, 0.0, 0.0)) ; gl_ViewportIndex = gl_InvocationID ; EmitVertex () ; EndPrimitive () ; gl_Position = projection[gl_InvocationID] * (gl_in[k].gl_Position - vec4 (0.0, 0.1, 0.0, 0.0)) ; gl_ViewportIndex = gl_InvocationID ; EmitVertex () ; gl_Position = projection[gl_InvocationID] * (gl_in[k].gl_Position + vec4 (0.0, 0.1, 0.0, 0.0)) ; gl_ViewportIndex = gl_InvocationID ; EmitVertex () ; EndPrimitive () ; } }
问题代码片段
def border (self): self.bProgram = Shader ({ f'./Ogl/Shaders/bvs.glsl' : GL_VERTEX_SHADER, f'./Ogl/Shaders/bgs.glsl' : GL_GEOMETRY_SHADER, f'./Ogl/Shaders/bfs.glsl' : GL_FRAGMENT_SHADER, }) self.bVao = glGenVertexArrays (1) glBindVertexArray (self.bVao) # enable self.bVao self.points = np.array ([ -0.5, 0.5, # UL 0.5, 0.5, # UR 0.5, -0.5, # LL -0.5, -0.5 # LR ], dtype = np.float32) point_vbo = glGenBuffers (1) glBindBuffer (GL_ARRAY_BUFFER, point_vbo) glBufferData (GL_ARRAY_BUFFER, self.points.nbytes, self.points, GL_STATIC_DRAW) glVertexAttribPointer (0, 2, GL_FLOAT, GL_FALSE, 0, None) glEnableVertexAttribArray (0) self.uniform_bVbo = glGenBuffers (1) glBindBuffer (GL_UNIFORM_BUFFER, self.uniform_bVbo) glBufferData (GL_UNIFORM_BUFFER, 4 * self.ident_size, None, GL_DYNAMIC_DRAW) self.index = glGetUniformBlockIndex (self.bProgram, "quadrant") glBindVertexArray (0) # disable self.bVao
注释掉self.index = glGetUniformBlockIndex (self.bProgram, "quadrant")这一行后,代码可正常运行,屏幕显示16个'+'符号。
内容的提问来源于stack exchange,提问作者W.B.Homer
相关产品推荐
相关产品推荐

