glBegin / glEnd到glDrawElements()

时间:2015-09-30 10:05:35

标签: opengl

我一直试图将此立即模式(glBegin / glEnd)代码移植到直接模式(VA)以渲染平面。如果直接模式代码完全用作立即模式代码,请告诉我。

注意:考虑50X50网格 立即模式代码:

int once=0, a=0,b=0;
for(int j=0; j<50-1; j++)
{
 once=0;
 for(int i=0; i<50; i++)
 {
  a=i+j*(50);
  b=i+(j+1)*50;
  if(once)
  {
   glBegin(GL_TRIANGLE_STRIP);
   once=1;
  }
  else
  {
   glTexCoord2f(Texture[a].x, Texture[a].y);
   glVertex2f(Mesh[a].x, Mesh[a].y);
   glTexCoord2f(Texture[a].x, Texture[a].y);
   glVertex2f(Mesh[b].x, Mesh[b].y);
  }
 }
  if(once)
  {
   glEnd();
  }
}

直接模式代码:

unsigned int indexArray[50*50];
int idx=0;
for(int j=0; j<50-1; j++)
{
 for(int i=0; i<50; i++)
 {
  a=i+j*(50);
  b=i+(j+1)*50;
  indexArray[idx]=a;
  indexArray[idx+1]=b;
  idx+=2;
 }
}
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);

glTexCoordPointer(2, GL_FLOAT, sizeof(2dPoint), Texture);
glVertexPointer(3, GL_FLOAT, sizeof(2dPoint), Mesh);
glDrawElements(GL_TRIANGLE_STRIP, (50-1)*(50-1)*2, GL_UNSIGNED_INT, indexArray);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

注意: 2dPoint是一个包含x和y的2个浮点值的结构

更新 纠正glVertexPointer()后的二维坐标。我观察到三角测量发生的方式如下:

使用glBegin() - glEnd():

       /\       /\          /\      /\          /
      /  \     /  \        /  \    /  \        /
\    /    \   /    \      /    \  /    \      /
 \  /      \ /      \    /      \/      \    /
  \/        \        \  /       /\       \  /
  /\       / \        \/       /  \       \/
 /  \     /   \       /\      /    \      /\
/    \   /     \     /  \    /      \    /  \
      \ /       \   /    \  /        \  /    \
\      /         \ /      \/          \/      \
 \    / \         \       /\          /\       \
  \  /   \       / \     /  \        /  \       \
   \/     \     /   \   /    \      /    \       \
   /\      \   /     \ /      \    /      \       \ 
  /  \      \ /       /        \  /        \       \
 /    \      /       / \        \/          \       \
/      \    / \     /   \       /\           \       \
        \  /   \   /     \     /  \           \       \
         \/     \ /       \   /    \           \       \
         /\      /         \ /      \           \       \

使用glDrawElements():

       /\       /\          /\      /\          /
      /  \     /  \        /  \    /  \        /
\    /    \   /    \      /    \  /    \      /
 \  /      \ /      \    /      \/      \    /
--\/--------\--------\--/-------/\-------\--/
  /\       / \        \/       /  \       \/
 /  \     /   \       /\      /    \      /\
/    \   /     \     /  \    /      \    /  \
------\-/-------\---/----\--/--------\--/----\
\      /         \ /      \/          \/      \
 \    / \         \       /\          /\       \
  \  /   \       / \     /  \        /  \       \
   \/     \     /   \   /    \      /    \       \
   /\      \   /     \ /      \    /      \       \ 
  /  \      \ /       /        \  /        \       \
-/----\----- \-------/-\--------\/----------\-------\
/      \    / \     /   \       /\           \       \
        \  /   \   /     \     /  \           \       \
         \/     \ /       \   /    \           \       \
         /\      /         \ /      \           \       \

很抱歉插图中的对齐问题。但正如您所看到的,使用索引数组和glDrawElements(),三角形的数量增加了。如何修改索引数组以匹配类似于glBegin()/ glEnd()的结果的绕组?

1 个答案:

答案 0 :(得分:0)

由于您只有2d坐标,glVertexPointer调用错误。

glVertexPointer(3, GL_FLOAT, sizeof(2dPoint), Mesh);

这一行告诉OpenGL每个顶点总是读取3个浮点数,所以如果你只有2个浮点数,你必须将它改为:

glVertexPointer(2, GL_FLOAT, sizeof(2dPoint), Mesh);
                ^