我正在尝试在iOS上使用OpenGL ES 1.1渲染一个地球仪(带有地图的球体)。我能够绘制球体和地图边界,但存在一个问题:我的视角中未朝向前方的线条也会被绘制在屏幕上。就像这样:
在图片中,你可以看到美洲呈现得很好,但是你可以看到澳大利亚在后面呈现出来。它不应该被显示,因为它在球体的后面,并且球体中的黑色和紫色条纹不透明。
有什么想法可以调整哪些参数以获得正确的地球仪吗?
如果需要,我可以发布相关部分的代码。只需询问哪个部分,我将更新问题。
提前感谢您的帮助。
更新:这是我用于球体渲染的内容:
这是我在渲染任何对象之前使用的设置:
在图片中,你可以看到美洲呈现得很好,但是你可以看到澳大利亚在后面呈现出来。它不应该被显示,因为它在球体的后面,并且球体中的黑色和紫色条纹不透明。
有什么想法可以调整哪些参数以获得正确的地球仪吗?
如果需要,我可以发布相关部分的代码。只需询问哪个部分,我将更新问题。
提前感谢您的帮助。
更新:这是我用于球体渲染的内容:
glEnableClientState(GL_VERTEX_ARRAY);
glPolygonOffset(-1.0f, -1.0f);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
int x, y;
GLfloat curR, curG, curB;
curR = curG = curB = 0.15f;
for (y=0; y<EARTH_LAT_RES; y++) {
if (y%10 == 0) {
glColor4f(curR, curG, curB, 1.0f);
curR = curR == 0.15f ? 0.6f : 0.15f;
curB = curB == 0.15f ? 0.6f : 0.15f;
}
for (x=0; x<EARTH_LON_RES; x++) {
Vertex3D vs[4];
vs[1] = vertices[x][y];
vs[0] = vertices[x][y+1];
vs[3] = vertices[x+1][y];
vs[2] = vertices[x+1][y+1];
glVertexPointer(3, GL_FLOAT, 0, vs);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
}
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDisable(GL_POLYGON_OFFSET_FILL);
glDisableClientState(GL_VERTEX_ARRAY);
这是我用来呈现边框线的代码:
// vxp is a data structure with vertex arrays that represent
// border lines
int i;
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnableClientState(GL_VERTEX_ARRAY);
for (i=0; i<vxp->nFeatures; i++)
{
glVertexPointer(3, GL_FLOAT, 0, vxp->pFeatures[i].pVerts);
glDrawArrays(GL_LINE_STRIP, 0, vxp->pFeatures[i].nVerts);
}
glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_BLEND);
这是我在渲染任何对象之前使用的设置:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glEnable(GL_DEPTH_TEST); /* enable depth testing; required for z-buffer */
glEnable(GL_CULL_FACE); /* enable polygon face culling */
glCullFace(GL_BACK);
glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -1.0f, 1.0f);
glFrustumf (-1.0, 1.0, -1.5, 1.5, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
GL_LINE_STRIP
绘制它们。我甚至不知道如何进行任何镶嵌操作... :-) - Pablo Santa Cruz