4,448
社区成员
发帖
与我相关
我的任务
分享
m_iNumFaces = 0;
m_iNumVertices = 0;
m_iNumIndices = 0;
const int triangles_per_row = x_grids * 2; // 一格两个三角形
const int indices_per_row = triangles_per_row + 2;
m_iNumVertices = (x_grids + 1) * (y_grids + 1);
m_pVertexArray = new meshVertex[m_iNumVertices];
if ( m_pVertexArray==NULL )
return false;
m_iNumIndices = indices_per_row * y_grids * 2;
m_pIndexArray = new unsigned short[m_iNumIndices];
if ( m_pIndexArray==NULL )
return false;
m_iNumFaces = m_iNumIndices;
float x_adv = 1.0f/(float)(x_grids+1);
float y_adv = 1.0f/(float)(y_grids+1);
int vertex_index = 0;
float fx, fy;
int x,y;
for ( y=0, fy=0; y<=y_grids; y++, fy+=y_adv )
{
for ( x=0, fx=0; x<=x_grids; x++, fx+=x_adv, vertex_index++ )
{
// 坐标
m_pVertexArray[vertex_index].m_Position[0] = fx*_width;
m_pVertexArray[vertex_index].m_Position[1] = fy*_height;
m_pVertexArray[vertex_index].m_Position[2] = 0.0f;
}
}
const int vertices_per_row = x_grids + 1;
bool from_left_to_right = true;
int index_index = 0;
// 生成索引
for ( y=0; y<y_grids; y++ )
{
if ( from_left_to_right )
{
m_pIndexArray[index_index++] = y*vertices_per_row;
for ( x=0; x<x_grids; x++ )
{
vertex_index = y * vertices_per_row + x;
if ( x%2 == 0)
{
m_pIndexArray[index_index++] = vertex_index + vertices_per_row;
m_pIndexArray[index_index++] = vertex_index + vertices_per_row + 1;
m_pIndexArray[index_index++] = vertex_index;
m_pIndexArray[index_index++] = vertex_index + 1;
}
else
{
m_pIndexArray[index_index++] = vertex_index;
m_pIndexArray[index_index++] = vertex_index + 1;
m_pIndexArray[index_index++] = vertex_index + vertices_per_row;
m_pIndexArray[index_index++] = vertex_index + vertices_per_row + 1;
}
}
m_pIndexArray[index_index++] = (x%2 == 0) ? vertex_index + 1 : vertex_index + 1 + vertices_per_row;
}
else
{
for ( x=x_grids; x>0; x-- )
{
vertex_index = y * vertices_per_row + x;
if ( x%2 == 0)
{
m_pIndexArray[index_index++] = vertex_index;
m_pIndexArray[index_index++] = vertex_index - 1;
m_pIndexArray[index_index++] = vertex_index + vertices_per_row;
m_pIndexArray[index_index++] = vertex_index + vertices_per_row - 1;
}
else
{
m_pIndexArray[index_index++] = vertex_index + vertices_per_row;
m_pIndexArray[index_index++] = vertex_index + vertices_per_row - 1;
m_pIndexArray[index_index++] = vertex_index;
m_pIndexArray[index_index++] = vertex_index - 1;
}
}
m_pIndexArray[index_index++] = vertex_index + vertices_per_row - 1;
}
from_left_to_right = !from_left_to_right;
}
glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(meshVertex), m_pVertexArray);
// 用 GL_LINE_STRIP 看得错误会更明显
glDrawElements(GL_TRIANGLE_STRIP, m_iNumFaces, GL_UNSIGNED_SHORT, m_pIndexArray);
glPopClientAttrib();