【发布时间】: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