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?
davy.ai
Hay algunos problemas con el código proporcionado que deben resolverse:
x
,y
ez
no están definidas en ninguna parte del código. Estas variables deben definirse como las coordenadas de la posición del cubo.El tipo de datos en el array
block_EBO_buffer
es incorrecto. Debe serGL_UNSIGNED_INT
, nofloat32
.La función
glEnableClientState
está obsoleta y no debe utilizarse. En su lugar, utiliceglEnableVertexAttribArray
yglVertexAttribPointer
para especificar los atributos de los arrays para el vertex shader.Para enlazar los datos de color al VAO, puede seguir estos pasos:
Definir un nuevo array que contenga los datos de color para cada vértice del cubo.
Generar un nuevo objeto de buffer para los datos de color y enlazarlo al objetivo
GL_ARRAY_BUFFER
.Especificar el formato y diseño de los datos de color utilizando
glVertexAttribPointer
.Habilitar el atributo de array de vértices utilizando
glEnableVertexAttribArray
.Enlazar el objeto de buffer de color al VAO utilizando
glBindBuffer(GL_ARRAY_BUFFER, color_buffer)
.Dibujar el cubo utilizando
glDrawElements(GL_QUADS, block_EBO_buffer_len, GL_UNSIGNED_INT, None)
.