【问题标题】:glBegin/glEnd to glDrawElements()glBegin/glEnd 到 glDrawElements()
【发布时间】:2015-09-30 10:05:35
【问题描述】:

我一直在尝试将此即时模式(glBegin/glEnd)代码移植到直接模式(VAs)以渲染飞机。请让我知道直接模式代码是否与立即模式代码完全一样。

注意:考虑一个 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() 的结果的绕组?

【问题讨论】:

  • 至少glVertexPointer 行看起来是错误的,因为每个顶点只有两个浮点数,但告诉 OpenGL 读取其中三个。总的来说:这段代码有什么问题?
  • 非常感谢您的回复。你的回答绝对正确。问题是这段代码没有像 glBegin()/glEnd() 那样渲染整个网格。再次感谢您的回答。这解决了问题。
  • 原来的图案看起来很奇怪,因为有非三角形区域?
  • 抱歉,由于 OpenGL ES 不支持 glPolygonMode(),我使用 GL_LINE_STRIP 进行渲染以了解模式。

标签: opengl


【解决方案1】:

由于你只有二维坐标,glVertexPointer 调用是错误的。

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

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

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

【讨论】:

  • 我根据您的建议更新了结果。如果可能,请检查并恢复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多