2010-12-20 8 views
1

배경 : 나는 아이폰 OpenGLES 2.0을 배우려고 노력하고 애플이 엑스 코드에서 제공하는 템플릿 프로젝트로 난처한 상황에 빠진 한프로젝션 매트릭스

.

기본 프로젝트는 2D 사각형을 보여 주지만, 나는 z 축에 다양한 깊이로 정점을 추가 실험을합니다. 애플의 기본 OpenGL을 프로젝트에서

, 그들은 단지 x와 버텍스 쉐이더에 전달 된 y 좌표를 사용하여 2D 사각형을 그립니다.

차원 공간에서 정점 배치를 실험하기 위해, I는 샘플 프로젝트 정점 데이터에 z 값을 추가했다. 그런 다음 glVertexAttribPointer 메서드의 size 매개 변수를 2에서 3으로 변경했습니다. 정점에서 z 값을 변경하여 프로그램을 실행했을 때 정사각형이 뒤쪽으로 기울어 진 것처럼 보이게했습니다.

문제

는 여전히 같은 2D 사각형으로 나타난다는 것이다. 필자의 독서에 따르면 이것은 투영 행렬이 원근법 대신 정사각형으로 설정되어 있기 때문에 발생한다고 생각합니다.

질문 :

가 어떻게 애플의 템플릿 OpenGL을 프로젝트에 OpenGLES 2.0을 사용하여 직교의 관점에 투영 행렬을 변경합니까?

나는 시도했다 :

glMatrixMode (GL_PROJECTION); glLoadIdentity(); glFrustumf (-0.5, 0.5, -0.5, 0.5, 1, 10);

그러나 결과는 바뀌지 않았습니다.

I는 또한 정점 셰이더 프로그램이 같은 것을 추가 시도 :


mat4 projectionMatrix = {2.0/320.0, 0.0, 0.0, -1.0, 0.0, 2.0/480.0, 0.0, -1.0 , 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 1.0};

gl_Position * = projectionMatrix;


하지만 그 중 하나도 작동하지 않았습니다.


1.0 용이었던 OpenGLES 2.0에서 투영 행렬을 다르게 설정하는 방법이 있습니까? 노력하고있는 물건이 2.0과 호환되지 않을 수도 있습니다.

미리 감사드립니다.

마이크

업데이트 도움 요한

감사합니다. 정말 감사. 내 EAGL보기에서 createFramebuffer 메서드에 다음 코드를 추가하여 제안 사항을 기반으로 깊이 버퍼를 추가하려했지만 여전히 변경하지 않았습니다.

// Create depth render buffer and allocate backing store. 
     glGenRenderbuffers(1, &depthRenderbuffer); 
     glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer); 

     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, framebufferWidth, framebufferHeight); 

     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer); 

그리고 내 렌더링 방법에 다음 코드를 추가 할 경우 :

glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glFrustumf(-0.5, 0.5, -0.5, 0.5, 1, 10); 

엑스 코드에서 예외가 발생합니다. 이견있는 사람?

답변

0

기본적으로 깊이 버퍼를 사용하지 않는 예제를 사용하는 것처럼 들립니다. 샘플 프로젝트에서 GL_DEPTH_COMPONENT16에 대한 참조를 찾고 깊이 버퍼 사용을 구현하십시오.

+0

안녕하세요, John은 glMatrixMode가 OpenGLES 2.0에서 작동하지 않는다고 생각합니다. 머리글을 살펴 봤지만 2.0 버전에서는 표시되지 않지만 1.0 버전에서는 표시됩니다. 웹에서 glViewport 함수가 glMatrixMode를 대체하고 버전 2.0의 다른 관련 함수를 많이 읽었습니다. 아무도 이것을 확인할 수 있습니까? 감사! – Hivebrain

1

마침내 예상대로 작동했습니다.

여러 깊이에 여러 객체를 구성하지 않으면 내가 듣는 것보다 분명히 필요하지 않으므로 깊이 버퍼 문제가 아닙니다.

Opengles 2.0에서는 사물을 3D로 렌더링하기 위해 자신의 투영 행렬을 만들어 위치 속성에 적용해야하는 것처럼 보입니다. 문제는 행렬을 생성하기 위해 2.0에서 내장 된 메서드를 찾을 수 없다는 것입니다.

Opengles 2.0에서 그의 챕터의 일부로 게시 된 Jeff LeMarche의 코드를 보면 퍼스널 매트릭스 (그리고 다른 많은 좋은 것들)를 생성하는 데 편리한 방법을 많이 사용하는 것으로 나타났습니다. 그 샘플 프로젝트는 여기에서 찾을 수 있습니다 : http://iphonedevelopment.blogspot.com/2010/07/opengl-es-20-book-teaser.html 파일 이름은 GLCommon입니다. 고맙습니다 제프!

투영 행렬을 만들고 적용하기 위해 GLCommon 파일에서 Matrix3DSetPerspectiveProjectionWithFieldOfView라는 메서드를 사용했습니다.

vertex shader에 균일하게 전달 된 행렬을 설정 한 다음 position 속성을 곱한 다음 gl_Position으로 전달합니다.

Matrix3DSetPerspectiveProjectionWithFieldOfView의 근거리 및 원거리 값을 조정하여 항목을 시야에 표시되도록했습니다.

OpenGLES 2.0을 배우려는 사람들에게 유용한 정보로 웹에 OpenGLES에서 1.0을위한 작업을 수행하는 방법에 대한 많은 정보가 있지만 실제로 게시 된 것이므로 그렇게 말하지는 않습니다 2.0이 나오기 전에. 코드가 2.0에서 작동하는지 확인하기 위해 2.0 헤더를 확인하십시오. Apple의 템플릿 프로젝트를 사용하는 경우 두 버전의 프레임 워크가 포함되어 있으므로 빌드하고 실행할 때까지는 1.0 코드가 문제가되지 않습니다.

+2

참고로, 저는 OpenGL ES 2.0에서 클래스를 만들었습니다.이 비디오는 iTunes U에서 찾을 수 있습니다. http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=407243028 –