2010-04-20 3 views
1

저는 기본적으로 iPhone에서 2 차원 게임을 가지고 있습니다. 다른 속도로 스크롤하는 여러 배경을 설정하려고합니다 (시차 배경으로 알려짐).iPhone에서 OpenGL ES의 시차 배경

내 생각에 다른 z 좌표 평면을 사용하여 전경 아래에 배경을 고정시키고 수용 할 수 있도록 전경 (크기로)보다 커지게하여 전체를 스크롤 할 수있게되었습니다. 다른 속도).

그리고 (내가 아는 한) 기본적으로 구현했습니다. 유일한 문제는 내가 제공 한 z 값을 완전히 무시하거나 오히려 모든 것을 무시한다는 것입니다. 나는 배경을 본다. (나는 지금까지 하나의 배경을 테스트 해 보았고, 단순하게 유지했다. 그래서 지금은 전경이 있고 다른 배경으로 한 배경을 스크롤하고 싶다.)하지만 1 : 1로 스크롤한다. 전경, 그래서 그것은 분명히 옳지 않습니다, 그리고 그것의 대부분은 잘립니다 (더 큰 원인). 그리고 배경과 여러 가지 near/far 클리핑 비행기에 대해 다양한 z 값을 시도했습니다 ... 항상 동일합니다. 나는 아마 단순한 일을 잘못하고있을 것이지만, 나는 그것을 이해할 수 없다. 포 그라운드에 대한 glVertexPointer에서 2 좌표 만 사용하여 나와 관련이 있는지 궁금하네요?

(배경 내가 3 전달 AM에 대한 물론) 나는 몇 가지 코드를 게시합니다 :

를이 일부 초기 설정은 다음과 같습니다

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -10.0f, 10.0f); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

glEnableClientState(GL_VERTEX_ARRAY); 
//glEnableClientState(GL_COLOR_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

//transparency 
glEnable (GL_BLEND); 
glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

내 전경의 float 배열에 대해 조금 .. .. 인터리브되었습니다. 내 전경 들어, 버텍스 x, 버텍스 y, 텍스쳐 x, 텍스쳐 y, 반복. 이것은 모두 정상적으로 작동합니다.

이 내 전경 렌더링 :

glVertexPointer(2, GL_FLOAT, 4*sizeof(GLfloat), texes); <br> 
glTexCoordPointer(2, GL_FLOAT, 4*sizeof(GLfloat), (GLvoid*)texes + 2*sizeof(GLfloat)); <br> 
glDrawArrays(GL_TRIANGLES, 0, indexCount/4); 

배경 렌더링 : 그것은 정점의 X, 정점 y를 정점 Z, 텍스처 X, 텍스처, Y, 반복을가는이 시간을 제외하고 여기

동일 드릴. 이번에는 z 값에 유의하십시오. 이 배열의 데이터가 디버깅 중에 올바른지 확인했습니다 (올바른 z 값 가져 오기). 그리고 다시, 그것은 나타난다. .. 그것이해야하는 것처럼 멀리에서 멀리 돌아 가지 않고있다.

glVertexPointer(3, GL_FLOAT, 5*sizeof(GLfloat), b1Texes); 
glTexCoordPointer(2, GL_FLOAT, 5*sizeof(GLfloat), (GLvoid*)b1Texes + 3*sizeof(GLfloat)); 
glDrawArrays(GL_TRIANGLES, 0, b1IndexCount/5); 

내 카메라를 이동하려면 간단한 glTranslatef (x, y, 0.0f)를 사용하십시오.

나는 가장 기본적인 3D 기능이 상상할 수있는 것처럼 보이지만 내가하는 일을 이해하지 못한다. 카메라가 움직이면 멀리 떨어져있는 것이 더 작아지고 빠르게 움직이지 않는다. 나를위한 경우는 아닙니다. 꽤 기본적이고 내 계획과 모든 영향을받지 않아야합니다 (비록 glFrustum을 재미, 성공하지 못하게하려고 시도했지만). 제발 도와 줘, 나는 그것이 단지 한 바보 같은 것 같아요. 필요한 경우 더 많은 코드를 게시 할 것입니다. 설정에 프레임 버퍼 초기화 내에서 깊이 - 버퍼링을 잊고에 어둠 속에서

+0

depthBuffering을 사용 설정 했습니까? – Till

+0

깊이 버퍼 추가에 대한 자세한 내용은 http://www.memention.com/blog/2009/10/08/Think-deep.html – epatel

답변

0

를 참조하십시오. 이전에 glFrustum을 시도했을 때 (내 질문에 언급했듯이) 설정을 잘못했다. 가까운 클리핑 값에 음수 값을 사용하고 있었고 기본적으로 정사영과 같은 1 : 1 스크롤링 문제가있었습니다. 하지만이 값을 0.01로 변경했으며 마침내 제대로 표시되기 시작했습니다 (배경이 더 멀리 표시됨).

내 문제는 해결되었지만 측면 아이디어와 마찬가지로, 이제는 동일한 프레임 내에서 정사영 및 원근감을 혼합 할 수 있는지, 그리고 그 것이 필요한지 궁금합니다. 나는 전경을 매우 단순하고 정사 (2d)로 유지하기를 원하기 때문에 배경의 깊이를 표시하기를 원합니다. 누군가가 호기심 경우에 나는이 함께 놀러 내 결과를 언급합니다

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -10.0f, 10.0f); 

//render foreground 

glLoadIdentity(); 
glFrustum(-1.0f, 1.0f, -1.5f, 1.5f, 0.01f, 1000.0f); 

//render backgrounds 

:

내 생각 같은 것을했다. 이 문제에 대한 피드백은 기술적으로는 더 이상이 문제에 대한 긴급한 요구가 없습니다. (여기에서 아이디어 토론이 될 것입니다.)

0

샷 ...

당신은 할 수 있습니다. 애플의 나이 EAGLView 템플릿에서

복사 & 붙여 넣기 :

 

    glGenRenderbuffersOES(1, &depthRenderbuffer); 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); 
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight); 
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); 
 
+0

이 템플릿을 실제로 사용하고 있습니다. iPhone OS 2.2.1에서 테스트 중이며 SDK 3.0이 있습니다. 거기에 작성한 코드는 "if (USE_DEPTH_BUFFER)"문에 내장되어 있으며 USE_DEPTH_BUFFER # define'd가 1입니다. 디버깅을하고 코드가 호출되는지 확인했습니다. 아직 난처했지만 제안에 감사드립니다. 내가 뭔가를 잊을 수 있습니까? –

0

당신이 먼을 그리는 의미, 당신은 깊이 순서로 작성하여야한다 혼합으로 따라하는 경우 (깊은)의 첫 번째 레이어. 그렇지 않으면 영역이 100 % 투명하더라도 Z 버퍼 값이 기록 될 때 맨 위에있는 레이어로 덮어 씁니다.

내가 (나는 이것에 틀렸다면 정정 해줘하시기 바랍니다) 더 멀리있는 사물을 표시 할 능력이있는 직교 투영을 사용하고 있음을 알아 냈어요 here

관련 문제