OpenGL

[펌][OpenGL] GL_CULL_FACE / GL_DEPTH_TEST

Binceline 2013. 12. 7. 20:45

참조: http://crownog.tistory.com/39?srchid=BR1http%3A%2F%2Fcrownog.tistory.com%2F39

 

보통 우리의 눈 이나 카메라는 보이는 물체의 모든것을 보지못한다. 그래픽스에서도 마찬가지로 보통 우리가 사용하는 출력 장치는 2D평면 이기 때문에 그리는 물체등의 앞면만 보이거나 다른물체에 가려 아예 안보일수도있다. 

1. 후면제거
후면제거란 말그대로 시점에서 보이는 곳을 앞면으로 놓고 보이지 않는곳을 후면으로 놓은후 보이지 않는 후면을 제거하는 방법이다.

OpenGL의 면제거
먼저 glEnable로 GL_CULL_FACE(후면제거)모드를 활성화해야 한다.  그후 glCullFace 함수로 제거할 면을 설정 해주면 된다.
(GL_FRONT 앞면, GL_BACK 후면, GL_FRONT_AND_BACK 앞후면전부);

일반적으로 물체는 우리 눈에 보이는 겉 표면과 반대쪽에 이면으로 이루어져 있다.  OpenGL에서는 다각형을 그릴때 시계방향으로 그렸는지 반시계방향으로 그렸는지에 따라 표면과 이면을 구분한다. 이때 방향을 바꿈으로서 포면과 이면을 바꿀수 있는대 glFrontFace란 함수를 사용 하여 반시계방향(기본값)은 GL_CCW를 시계방향은 GL_CW를 넘겨 주면된다.
그리고 OpenGL은 보통 표면과 이면을 같은 방식으로 그리지만 glPolygonMode함수를 통해 표면과 이면을 다른방식으로 그릴수 있다.

void glPolygonMode(GLenum face, GLenum mode)
face에는 GL_FRONT, GL_BACK, GL_FRONT_AND_BACK 중 하나를 mode에는 GL_POINT, GL_LINE, GL_FILL중 하나를 넘겨준다. 

OpenGL에서는 시야에 의한 절단외에 따로 직접 glClipPlane이라는 함수를 사용 하여 절단면을 설정할 수 있다.

void glClipPlane(GLenum plane, GLdouble* equation)
plane은 절단면의 식별자로 GL_CLIP_PLANE0번부터 5번까지 6개가 있으며 하드웨어에 따라 다를수도 있다.
equation에는 평면방정식의 계수이다. ( 예 : Ax+By+Cz+D = 0 이면 A,B,C,D를 배열에 차례대로 넣고 배열명을 넘겨주면된다.)

2. 은면제거
은면제거는 보이지 않는 면을 제거하기 위한 마지막 작업으로 다른 물체면에 가려서 보이지 않는 면을 제거하는 작업이다. 이 작업은 물체 정점의 깊이 즉, z좌표를 필요로 하기 때문에 2차원 투상 이전에 해야 한다.

 OpenGL에서는 GL_DEPTH_TEST를 활성화 시켜서 깊이버퍼를 활성화 시킬수 있다. 그리고 새로은 프레임을 그릴때는 항상 초기화 해주는 것이 좋다. OpenGL에서는 보통 Z값이 작으면 통과를 시키는대 이 테스트 조건을 glDepthFunc 함수를 통해 바꿀수 있다. 만약 프로그램 실행 도중 깊이버퍼의 쓰기를 금지 하려면 glDepthMask 함수를 호출하여 GL_FALSE는 쓰기 금지 GL_TURE는 쓰기 허용을 할수 있따다.

void glDepthFunc(GLenum func);
func에는 GL_NEVER, GL_LESS, GL_LEQUAL, GL_EQUAL, GL_GREATER, GL_NOTEQUAL, GL_GEQUAL, GL_ALWAYS중 하나를 사용하며 기본 값은 GL_LESS이다. 


반응형

'OpenGL' 카테고리의 다른 글

.OBJ 파일 포맷  (0) 2014.06.30
[펌][OpenGL Tip] OpenGL Font 재미있는 사실  (0) 2014.02.25
[OpenGL][Win32 api] Tutorial  (0) 2013.12.08