OpenGL - 网格索引

作者: li_礼光 | 来源:发表于2017-05-19 17:17 被阅读380次

    《OpenGL ES 应用开发实践 iOS版》中第六章,关于网格索引的理解 :

    使用索引来绘制三角形的话,一般都是以逆时针方向来绘制.
    以下的绘制顺序是(0,1,2)(2,1,3)


    逆时针绘制 网格

    对于这种网格类的图形,如何使用索引来描绘呢?

    关于书上的解释 :

    使用索引顶点 绘制

    罗列出顶点数据排布的样式:


    顶点排布

    发现索引数组中的排布方式(看上图)
    {0,4,1,5,2,6,3,7,......,13,17,12,16}

    逆时针的方式


    索引的布局方式

    所以设置索引的方式


    添加索引

    代码的实现方式.

    // 传入一个索引数组,根据宏定义的行列来设定索引数组的方式
    void SceneMeshInitIndices(GLushort meshIndices[NUM_MESH_INDICES])
    {
       int    currentRow = 0;
       int    currentColumn = 0;
       int    currentMeshIndex = 0;
       
       // 从1开始,因为算法在开始时返回一个索引
       currentMeshIndex = 1;  
       
       for(currentColumn = 0; currentColumn < (NUM_MESH_COLUMNS - 1);currentColumn++)
       {
        
          if(0 == (currentColumn % 2))
          { //这是一个偶数列
             currentMeshIndex--; // 返回:覆盖重复的顶点
             
             for(currentRow = 0; currentRow < NUM_MESH_ROWS; currentRow++)
             {
                meshIndices[currentMeshIndex++] =  currentColumn * NUM_MESH_ROWS + currentRow;
                meshIndices[currentMeshIndex++] = (currentColumn + 1) * NUM_MESH_ROWS + currentRow;
             }
          }else{ // 这是一个奇数列
             currentMeshIndex--; // 返回:覆盖重复的顶点
             
             for(currentRow = NUM_MESH_ROWS - 1; currentRow >= 0;currentRow--)
             {
                meshIndices[currentMeshIndex++] =  currentColumn * NUM_MESH_ROWS + currentRow;
                meshIndices[currentMeshIndex++] = (currentColumn + 1) * NUM_MESH_ROWS + currentRow;
             }
          }
       }
     
       NSCAssert(currentMeshIndex == NUM_MESH_INDICES, @"Incorrect number of indices intialized.");
    }
    
    #define NUM_MESH_ROWS (20)     // Must be at least 2            行
    #define NUM_MESH_COLUMNS (40)  // Must be at least 2            列
    

    相关文章

      网友评论

        本文标题:OpenGL - 网格索引

        本文链接:https://www.haomeiwen.com/subject/pswyxxtx.html