繁体   English   中英

pyopengl-具有纹理的VBO

[英]Pyopengl - VBO with texture

我使用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, http ://pyopengl.sourceforge.net/documentation/manual-3.0/glDrawArrays,glDrawArrays glDrawArrays(GL_QUADS, 0, 4)行怎么可能工作。 HTML

请参阅OpenGL 4.6 API兼容性配置文件规范; 10.3.3为固定功能属性指定数组; 第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)

可以通过glTexCoordPointer指定纹理材质,并通过glEnableClientState(GL_TEXTURE_COORD_ARRAY)启用纹理材质

glTexCoordPointer(3, GL_FLOAT, 0, None)
glEnableClientState(GL_TEXTURE_COORD_ARRAY)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM