You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 01:57:56