OpenGL frustumM에 대해서

안드로이드에서 OpenGL 돌리는 샘플 테스트 하는데

float ratio = (float) width / height;
Matrix.frustumM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7);

첫번째 의문 frustumM의 인자값
우선 이해가 안됬던게 인터넷에 검색해보면 좀 다양한 결과가 나오는데 세번째 인자부터 4개의 인자 값이
어떤 사이트는 Frustum의 왼쪽평면 좌표, 우측평면좌표, 상단평면좌표, 하단평면 좌표라고 그림까지 그려가면서
설명되어 있었음.  이거 잘못된건데 비슷한 내용의 블로그가 꽤 많아서 계속 삽질했음.
(그냥 상식적으로 평면좌표가 하나의 float 값만 가진다는게 말이 안되지)

역시 레퍼런스가 짱이지 라는 생각으로  OpenGL 공식 문서를 뒤져봄.
https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glFrustum.xml 에 따르면

left, right
Specify the coordinates for the left and right vertical clipping planes.
bottom, top
Specify the coordinates for the bottom and top horizontal clipping planes.

좌/우는 수직절단면체로부터의 왼쪽과 오른쪽 좌표
하/상은 수평절단면체로부터의 아래와 위 좌표
라고 함.


이미지 출처: https://developer.android.com/guide/topics/graphics/opengl.html

수직절단면체는 위 이미지의 중심에 굵은 가로세로선을 말하는것임.
조금 더 쉽게 생각하면 Frustum의 near Plane이 GLSurfaceView랑 딱 붙어 있다고 생각하고
그 좌표를 입력한다고 생각하면 이해하기 쉬움

 

두번째 의문
좌우는 (가로/세로 = ratio)의 값으로 채우면서 왜 상하는 그냥 -1, 1을 채웠는가 였음.
이거 첨에 정말 고민 많이 했는데 정말 간단한 거였음 (지금 생각하면 “바보아냐” 라고 생각할정도로)

위 이미지 처럼 opengl의 내부는 좌표는 -1~1까지를 가짐.
ratio 값 자체가 height를 1이라 생각했을때 width의 비율을 나타내는거기 때문에  -ratio, ratio, -1, 1, 를 사용하는것임
Frustum값을 저렇게 세팅해야 모델링 결과가 좌우로 넓적하게 늘어난다던지 세로로 길쭉해진다는 문제가 없이 정상적으로 표현됨.

 

 


뒷이야기

얼마전에 Ogre3D 최신버전 빌드해보면서 OpenGL 버전이 상당히 많이 업데이트 됬구나 하는 생각이 들어서
예전에 안드로이드에서  OpenGLES 사용할땐 그냥 별 생각 없이 1.0사용하다가
“그래 오래된거는 좀 버리고 최신버전 좀 돌려보자” 라는 생각에 기본 샘플 프레임(?) 하나 올려보다가

옛날에는 별 생각없이 쓰던것들이 요즘엔 저걸 왜 저렇게 쓰나 라는 의문점이 퐁퐁 솟아 오른다.
그래서 이래저래 고민해보다가 깨닮음을 여기 정리해봄.


크리에이티브 커먼즈 라이선스Linsoo의 저작물인 이 저작물은(는)크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

댓글 남기기

이메일은 공개되지 않습니다.

This site uses Akismet to reduce spam. Learn how your comment data is processed.