代码之家  ›  专栏  ›  技术社区  ›  Mike Weller

将大量纹理Atlas绘制调用与OpenGL ES结合起来

  •  1
  • Mike Weller  · 技术社区  · 15 年前

    我有一个大的纹理图集,我正在从这个屏幕上绘制很多纹理。目前,图集中的每个纹理都是用如下代码单独绘制的:

    GLfloat coordinates[] = {
            bla, bla,
            bla, bla,
            bla, bla,
            bla, bla
    };
    
    GLfloat vertices[] = {
            bla, bla, bla,
            bla, bla, bla
            bla, bla, bla
            bla, bla bla
    };
    
    
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, name);
    glVertexPointer(3, GL_FLOAT, 0, vertices);
    glTexCoordPointer(2, GL_FLOAT, 0, coordinates);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    

    所以我们用三角形条来做这个。

    现在,我只是通过保存坐标/顶点,并在一次调用中将它们全部绘制出来,来缓存这些类型的调用。但是OpenGLES没有四边形,因此尝试使用三角形条带意味着操作会将它们全部合并在一起,并且从上一点开始,纹理会在屏幕上扭曲。

    我尝试了gldrawArrays和gldrawElements,但没有取得任何成功。这是可能的吗?

    5 回复  |  直到 14 年前
        1
  •  2
  •   Marco Mustapic    15 年前

    你能把每个四边形画成两个三角形吗?当然,在数组中会有重复的顶点和坐标。

        2
  •  1
  •   Andreas    14 年前

    你可以用一个退化带。

    在这种情况下,(几乎)没有意义,因为每个条带只保存两个顶点, 但是如果你得到更长的条纹和更少的停止,这是很好的武器在你的兵工厂。

    退化条带是基于硬件跳过零区域三角形的事实,对于两个相同顶点的三角形来说,这是正确的。

    (恐怖的编码员ASCII艺术拯救。)

    A--D
    | /|
    |/ |
    B--C
    
       E--H
       | /|
       |/ |
       F--G
    

    三角形

    ABD DBC EFH HFG  -> 12
    

    Va= f(q)=6xq

    三角条

    ABD     C     C     E     E     F     H     G -> 10
    ABD (BD)C (DC)C (CC)E (CE)E (EE)F (EF)H (FH)G
    CCW CW    CCW   CW    CCW   CW    CCW   CW
    NOR NOR   DEG   DEG   DEG   DEG   NOR   NOR
    

    vb=f(q)=4+(4+2)(q-1)

    Q   | Va | Vb
     1  |  6 |  4
     2  | 12 | 10
     3  | 18 | 16
    10  | 60 | 58
    

    从OpenGL3.1中,您可以简单地使用 “原始重新启动” 这会让你的生活更轻松。

        3
  •  0
  •   Gordon Childs    15 年前

    变化

    glVertexPointer(3, GL_FLOAT, 0, vertices);  
    

    glVertexPointer(2, GL_FLOAT, 0, vertices);
    

    它应该可以工作,假设三角形条带配合 你的省略是正确的。

        4
  •  0
  •   zoul    15 年前

    您可能对 TextureAtlas iPhone的Cocos2d引擎类。

        5
  •  0
  •   dude    15 年前

    使用带4个顶点和6个索引的gldrawElements和gl_三角形。现代硬件将缓存重复顶点的内存提取,因此性能将接近于gl_triangle_条带,而且您可以更有效地批处理gl_triangle,而对于单个四边形,批处理gl_triangle比条带效率更高,这是一个巨大的胜利。确保三角形缠绕正确,或者关闭背面剔除。

    // triangle vertex order
    // 1--2
    // | /|
    // |/ |
    // 0--3
    
    vertex foo[4] = {
        {<vtx0>},
        {<vtx1>},
        {<vtx2>},
        {<vtx3>}
    };
    
    // same clockwise winding for both triangles
    GLushort idx[2][3] = {
        { 0, 1, 2 },
        { 0, 2, 3 }
    };
    
    <setup vertex array>
    // use a VBO for both the vertex and index array if possible...
    
    glDrawElements( GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, idx );