我使用Python 3.6。最初我使用这样的代码:
array_to_texture(self.board)
glColor3fv((1.0, 1.0, 1.0))
glBegin(GL_QUADS)
for vertex, tex in zip(self.POINTS, self.TEX):
glTexCoord2f(*tex)
glVertex3fv(vertex)
glEnd()
它有效。它在3D空间中绘制正方形纹理。
现在我想用VBO来做这个伎俩。要绘制墙(具有固定颜色),可以使用以下代码:
vbo = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, vbo)
glBufferData(GL_ARRAY_BUFFER, len(vertices) * 4, (c_float * len(vertices))(*vertices), GL_STATIC_DRAW)
glVertexPointer(3, GL_FLOAT, 0, None)
glDrawArrays(GL_QUADS, 0, 4)
完美无缺。 主要问题是,如何使用此方法附加和绘制纹理?如何为纹理坐标创建某种缓冲区并使用它?我真的很难找到一些最小的工作实例。
小问题,即使文档中不允许使用GL_QUADS,glDrawArrays(GL_QUADS, 0, 4)
行如何工作仍有可能:http://pyopengl.sourceforge.net/documentation/manual-3.0/glDrawArrays.html
答案 0 :(得分:1)
命令
void VertexPointer( int size, enum type, sizei stride, const void *pointer ); void NormalPointer( enum type, sizei stride, const void *pointer ); void ColorPointer( int size, enum type, sizei stride, const void *pointer ); void SecondaryColorPointer( int size, enum type, sizei stride, const void *pointer ); void IndexPointer( enum type, sizei stride, const void *pointer ); void EdgeFlagPointer( sizei stride, const void *pointer ); void FogCoordPointer( enum type, sizei stride, const void *pointer ); void TexCoordPointer( int size, enum type, sizei stride, const void *pointer );
指定数组的位置和组织,以存储顶点坐标,法线,颜色,二次颜色,颜色索引,边缘标志,雾坐标。
...
通过调用
之一启用或禁用单个阵列void EnableClientState( enum array ); void DisableClientState( enum array );
将数组设置为
VERTEX_ARRAY
,NORMAL_ARRAY
,COLOR_ARRAY
,SECONDARY_COLOR_ARRAY
,INDEX_ARRAY
,EDGE_FLAG_ARRAY
,FOG_COORD_ARRAY
或TEXTURE_COORD_ARRAY
,分别用于顶点,法线,颜色,辅助颜色,颜色索引,边缘标志,雾坐标或纹理坐标数组。
这意味着顶点坐标可以由glVertexPointer
指定,并由glEnableClientState(GL_VERTEX_ARRAY)
glVertexPointer(3, GL_FLOAT, 0, None)
glEnableClientState(GL_VERTEX_ARRAY)
纹理cooridantes可由glTexCoordPointer
指定并由glEnableClientState(GL_TEXTURE_COORD_ARRAY)
启用
glTexCoordPointer(3, GL_FLOAT, 0, None)
glEnableClientState(GL_TEXTURE_COORD_ARRAY)