본문 바로가기

만들기 / Programming/그래픽,영상처리 OpenGL /OpenCV

[추려내기] 면 숨기기를 통한 성능 향상 OpenGL

[추려내기] 면 숨기기를 통한 성능 향상 OpenGL

2007/05/13 13:33

복사 http://blog.naver.com/guzayoul/100037380548

◆ glEnable(GL_CULL_FACE);

 깊이를 이용해서 관측자로부터 보이지 않는 면을 숨기는 기능은 시각적으로 뛰어난 효과를 내

지만, 모든 픽셀마다 깊이 값을 주고 비교해야하는 작업은 성능에 부담을 주게 된다. 이 때문에

나온 기능이 추려내기 기능으로 절대로 화면에 표시될 일이 없는 면을 그리지 도록한다.

 추려내기 기능을 활성화 하는 함수가 바로 glEnable(GL_CULL_FACE); 이고 

glFrontFace(GLenum 모드); 와 함께 사용된다.

 

 여기서 glFrontFace(GLenum 모드); 의 경우 와인딩에 따라서 앞면을 정해주는 레퍼런스이

다. 인자로 들어가는 모드에는 GL_CWGL_CCW가 있는데, GL_CW는 시계 방향의 와인딩을

앞면으로 간주하고, GL_CCW는 반시계 방향을 앞면으로 간주하도록 한다. (참고로 와인딩

란 폴리곤 타입의 주요 특성으로 폴리곤의 버텍스가 지정된 순서와 방향을 말한다.)

 

 우선 추려내기 기능을 사용하지 않고 의 사각형을 하나 그려보자. 이 폴리곤의 와인딩은 시

계 방향으로 그렸다고 가정을 하겠다. 회전을 시켜보면 앞면과 뒷면이 정상적으로 잘 보이게

될 것이다. 이제 추려내기 기능을 활성화 시키고 앞면 지정을 GL_CW로 하고 다시 그려보면 회

전시 앞면은 보이지만 뒷면은 보이지 않게 될것이다. 반대로 GL_CCW로 했다면 앞면은 안보

이고 뒷면만 보이게 될 것이다. 사각형 하나만 봐서는 이게 왜 필요한가 감이 별로 안 올것이

다.

 

 이제 정육면체를 사각 폴리곤 6개를 합쳐서 그려보도록 하겠다. 그냥 좌표값들과 깊이를 주면

정상적으로 우리가 원하는 정육면체가 그려질 것이다. 하지만 아까 사각형에서 봐서 알수듯이 추려내기 기능을 사용하지 않으면 보이지는 않지만 정육면체의 내부면도 그려지게 될 것이

다. 보이지도 않는 면을 그리는 쓸데 없는 일을 하게 되는데, 이런 낭비를 없애기 위해서 추려

내기 기능을 사용하게 되는 것이다. 폴리곤을 정면에서 보았을때의 버텍스 방향에 따라서 이면

을 그려야 할지 말아야 할지를 결정하게 되므로  이를 생각하고 좌표를 설정 해주면 되겠다.

 와인딩이 시계방향이고 시계방향일때만 그려야한다고 설정해 두었다고 가정해보자. 정육면체

의 앞면이 정면에서 보이면 당연히 이 앞면은 그려질 것이다. 만약 정육면체를 회전해서 앞면

이 뒤로가게 한다고 하면 정면에 보이는건 앞면의 뒷모습일 것이다. 이 앞면의 뒷 모습은 정면

에서 봤을때 버텍스 방향이 반시계 방향이므로 드로잉 되지 않게 되는 것이다.

 

 이를 이용하면 간단한 경우에는(위의 정육면체 정도의) 깊이 테스트를 하지 않고도 면이 겹쳐

지지 않게 정상적으로 그려 낼 수 있다.