OpenGL网格绘制显示错误

abchappy1234 2009-11-23 01:19:30
不是很好描述这个问题,主要是这样的,下面的网格代码只能绘制255*255个格子的网格,多了就会出错。
初始化

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();
...全文
160 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
abchappy1234 2009-11-23
  • 打赏
  • 举报
回复
。。。。我晕,没注意
张赐 2009-11-23
  • 打赏
  • 举报
回复
恩,index的范围太小了
xingzhe2001 2009-11-23
  • 打赏
  • 举报
回复
改为32位索引的方法是index array用unsigned int 类型,glDrawElement的第三个参数用 GL_UNSIGNED_INT
xingzhe2001 2009-11-23
  • 打赏
  • 举报
回复
你的index是16位的,最多也就是65535个索引,而256*256=65535刚好是极限,再多就索引出错了,改用32位索引就可以了

4,448

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧