OpenGL - 网格索引
2017-05-19 本文已影响380人
li_礼光
《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 列