【问题标题】:Pyopengl - VBO with texturePyopengl - 带有纹理的 VBO
【发布时间】:2018-04-10 20:46:32
【问题描述】:

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

【问题讨论】:

    标签: python opengl pyopengl


    【解决方案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)
    

    并且纹理坐标可以由glTexCoordPointer指定并由glEnableClientState(GL_TEXTURE_COORD_ARRAY)启用

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

    【讨论】:

      猜你喜欢
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 2019-02-05
      • 2023-03-23
      • 2021-09-18
      • 1970-01-01
      • 2015-05-09
      相关资源
      最近更新 更多