es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

OpenGL VBO puede ejecutarse sin errores pero no se muestra ninguna gráfica.

El siguiente código debería dibujar un cubo cada vez que se llame:
código de error:

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 está en el bucle principal. Si uso glBegin y glEnd, se puede dibujar normalmente. Pero después de usar VBO, no se mostrará ningún gráfico. No quiero usar shaders, no los necesito. Además, ¿cómo puedo vincular la matriz de colores a VAO?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Hay algunos problemas con el código proporcionado que deben resolverse:

    1. Las variables x, y e z no están definidas en ninguna parte del código. Estas variables deben definirse como las coordenadas de la posición del cubo.
    2. El tipo de datos en el array block_EBO_buffer es incorrecto. Debe ser GL_UNSIGNED_INT, no float32.

    3. La función glEnableClientState está obsoleta y no debe utilizarse. En su lugar, utilice glEnableVertexAttribArray y glVertexAttribPointer para especificar los atributos de los arrays para el vertex shader.

    Para enlazar los datos de color al VAO, puede seguir estos pasos:

    1. Definir un nuevo array que contenga los datos de color para cada vértice del cubo.

    2. Generar un nuevo objeto de buffer para los datos de color y enlazarlo al objetivo GL_ARRAY_BUFFER.

    3. Especificar el formato y diseño de los datos de color utilizando glVertexAttribPointer.

    4. Habilitar el atributo de array de vértices utilizando glEnableVertexAttribArray.

    5. Enlazar el objeto de buffer de color al VAO utilizando glBindBuffer(GL_ARRAY_BUFFER, color_buffer).

    6. Dibujar el cubo utilizando glDrawElements(GL_QUADS, block_EBO_buffer_len, GL_UNSIGNED_INT, None).

Comments are closed.