2011-05-13 4 views
3

지구본 (지도가있는 구)을 iOS에서 OpenGL ES 1.1으로 렌더링하려고합니다.OpenGL ES로 지구본 그리기

구체를 그리고 테두리를 매핑 할 수 있지만 한 가지 문제가 있습니다. 내 눈앞에서 직면하지 않는 선들도 화면에 그려집니다.. 이 같이 : 그림에서

Globe with lines on the back being shown

, 당신은 미국이 잘 렌더링하는 것을 볼 수 있습니다,하지만 당신은 호주 뒷면에 렌더링 볼 수 있습니다. 그것은 지구의 뒤쪽에 있기 때문에 보여지기로되어 있지 않습니다. 지구상의 BLACK과 PURPLE 줄무늬는 투명하지 않습니다.

적절한 글로브를 만들기 위해 어떤 매개 변수를 조정해야합니까?

도움이 될 경우 코드의 관련 부분을 게시 할 수 있습니다. 어느 부분에 질문하면 질문을 업데이트 할 것입니다.

미리 감사드립니다.

업데이트 : 이것은 내가 구체 렌더링에 사용하고 무엇을 :

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(); 
+0

지오메트리로 정의 된 다양한 테두리가 있으므로 좌표를 지구 표면에 매핑 한 다음 GL_LINES (또는 선 루프 또는 다른 선 프리미티브)로 그리기위한 몇 가지 계산을 수행하고 있습니까? 모자이크 처리 된 것이 있습니까? – Tommy

+0

@ 토미 : 예. 정확하게. 좌표를 지구 표면에 매핑하고 GL_LINE_STRIP을 사용하여 좌표를 그리는 중입니다. 나도 tessellated ...--) –

+0

당신이 vxp 데이터를 공유 할 수있는 방법을 모르는? 비슷한 문제가 있지만 안드로이드 플랫폼을 위해 노력하고 있습니다 ... –

답변

5

코드의 나머지 부분을 방해하지 않는 확실한 방법은 깊이 버퍼를 프라임하는 보이지 않는 방법으로 솔리드 객체로 구를 그리는 것입니다. 그런 다음 심도 테스트에서 선들 중 어느 것이 보이는지 알아 내야합니다. glPolygonOffset을 사용하여 심도 계산에 사용되는 값에 구현 별 '소량'을 추가 할 수 있으므로 깊이 버퍼 투쟁을 피할 수 있습니다. 그래서 그것은 다음과 같을 것입니다 :

이렇게하면 글로브가 단단한 것처럼 깊이 버퍼에 값이 남습니다. 그것이 받아 들일 수 없다면, 내가 생각할 수있는 유일한 대안은 CPU에 가시성 계산을하는 것입니다. 당신은 현재 뷰 매트릭스를 얻기 위해 glGet을 사용할 수 있습니다. 구체에 맵핑하는 방식에서 직접 각 정점의 법선을 결정할 수 있습니다 (단지 중심을 기준으로하는 위치 일 것입니다). 그런 다음 하나 이상의 선을 그립니다 정점은 카메라에서 점과 법선까지의 벡터의 내적에 대해 음수 값을 반환합니다.

+0

@ 토미 : 답변 해 주셔서 감사합니다. 구를 렌더링하는 데 사용하는 코드로 질문을 업데이트했습니다. 나는 당신의 제안을 덧붙였지만, 나는 아직도 언급 한 문제들을 겪고있다. 이상한 점은 일반 OpenGL에서 비슷한 코드를 사용하면이 효과가 없기 때문입니다 ... –

+0

깊이 버퍼가 연결되어 있습니까? – Tommy

+0

@ 토미 : 도와 줘서 고마워. 나는 관련 부분에 질문을 추가했다. 그게 충분한 지 모르겠다. 예상대로, 필자는 구체와 선을 렌더링하기 전에 ** 버퍼, 뷰 및 기타 관련 물건을 설정하고 있습니다. –

관련 문제