簡體   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