Pyopengl - 与纹理的VBO

时间:2018-04-10 09:22:26

标签: python opengl pyopengl

我使用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

1 个答案:

答案 0 :(得分:1)

请参阅OpenGL 4.6 API Compatibility Profile Specification; 10.3.3 Specifying Arrays for Fixed-Function Attributes; page 402

  

命令

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_ARRAYNORMAL_ARRAYCOLOR_ARRAYSECONDARY_COLOR_ARRAYINDEX_ARRAYEDGE_FLAG_ARRAYFOG_COORD_ARRAYTEXTURE_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)