【问题标题】:OpenGL VBO can run without error but no graphicsOpenGL VBO 可以正常运行但没有图形
【发布时间】:2022-01-25 06:39:38
【问题描述】:

以下代码应在每次调用时绘制一个立方体 错误代码:

draw=False
block_VBO=0
block_EBO=0
block_VAO=0
block_EBO_buffer_len=0
def print_blocks(sx:int,sy:int,sz:int):
    global draw,block_VAO,block_EBO,block_VBO,block_EBO_buffer_len
    if not draw:
        block_point_buffer=[]
        block_color_buffer=[]
        block_EBO_buffer=[]
        block_point_buffer+=[x-0.5,y+0.5,z-0.5,#V0
                            x+0.5,y+0.5,z-0.5,#V1
                            x+0.5,y-0.5,z-0.5,#V2
                            x-0.5,y-0.5,z-0.5,#V3
                            x-0.5,y+0.5,z+0.5,#V4
                            x+0.5,y+0.5,z+0.5,#V5
                            x+0.5,y-0.5,z+0.5,#V6
                            x-0.5,y-0.5,z+0.5]#V7
        block_EBO_buffer+=[0,1,5,4,
                          3,2,6,7,
                          0,3,7,4,
                          1,2,6,5,
                          0,1,2,3,
                          4,5,6,7]
        block_VBO=glGenBuffers(1)
        glBindBuffer(GL_ARRAY_BUFFER,block_VBO)
        a=numpy.array(block_point_buffer,dtype='float32')
        glBufferData(GL_ARRAY_BUFFER,sys.getsizeof(a),a,GL_STATIC_DRAW)
        block_EBO=glGenBuffers(1)
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,block_EBO)
        a=numpy.array(block_EBO_buffer,dtype='float32')
        glBufferData(GL_ELEMENT_ARRAY_BUFFER,sys.getsizeof(a),a,GL_STATIC_DRAW)
        block_EBO_buffer_len=len(a)
        block_VAO=glGenVertexArrays(1)
        glBindVertexArray(block_VAO)
        glBindBuffer(GL_ARRAY_BUFFER,block_VBO)
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,block_EBO)
        glVertexPointer(3,GL_FLOAT,0,None)
        glEnableClientState(GL_VERTEX_ARRAY)
        glBindVertexArray(0)
        draw=True
    glBindVertexArray(block_VAO)
    glDrawElements(GL_QUADS,block_EBO_buffer_len,GL_UNSIGNED_INT,None)
    glBindVertexArray(0)

print_blocks 在主循环中。如果我使用glBegin和glEnd,可以正常绘制。但是我使用VBO之后,就没有图形显示了。我不想使用着色器,我不需要它们。另外,如何将颜色数组绑定到 VAO?

【问题讨论】:

    标签: python opengl pyopengl


    【解决方案1】:

    元素缓冲区中的索引类型需要是整数。它必须与绘图调用中指定的类型相匹配 (GL_UNSIGNED_INT ):

    a=numpy.array(block_EBO_buffer,dtype='float32')

    a= numpy.array(block_EBO_buffer, dtype = 'uint32')
    

    【讨论】:

    • 您的回答很有用,非常感谢。但是,如何将颜色数组绑定到 VAO?
    • @Wzq 为具有 RGBA 颜色的颜色 (color_VBO) 创建 VBO。然后glBindBuffer(GL_ARRAY_BUFFER,color_VBO)glColorPointer(4,GL_FLOAT,0,None)glEnableClientState(GL_COLOR_ARRAY)。注意,glColorPointerglVertexPointer等将当前绑定的数组缓冲区对象关联到属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多