깊이를 이용해서 관측자로부터 보이지 않는 면을 숨기는 기능은 시각적으로 뛰어난 효과를 내지만, 모든 픽셀마다 깊이 값을 주고 비교해야하는 작업은 성능에 부담을 주게 된다. 이 때문에 나온 기능이 추려내기 기능으로
절대로 화면에 표시될 일이 없는 면을 그리지도록한다. 추려내기 기능을 활성화 하는 함수가 바로 glEnable(GL_CULL_FACE); 이고 glFrontFace(
GLenum 모드); 와 함께 사용된다. 여기서 glFrontFace(
GLenum 모드); 의 경우 와인딩에 따라서 앞면을 정해주는 레퍼런스이다. 인자로 들어가는 모드에는 GL_CW와 GL_CCW가 있는데, GL_CW는 시계 방향의 와인딩을 앞면으로 간주하고, GL_CCW는 반시계 방향을 앞면으로 간주하도록 한다. (참고로 와인딩이란 폴리곤 타입의 주요 특성으로 폴리곤의 버텍스가 지정된 순서와 방향을 말한다.)
우선 추려내기 기능을 사용하지 않고 의 사각형을 하나 그려보자. 이 폴리곤의 와인딩은 시계 방향으로 그렸다고 가정을 하겠다. 회전을 시켜보면 앞면과 뒷면이 정상적으로 잘 보이게 될 것이다. 이제 추려내기 기능을 활성화 시키고 앞면 지정을 GL_CW로 하고 다시 그려보면 회전시 앞면은 보이지만 뒷면은 보이지 않게 될것이다. 반대로 GL_CCW로 했다면 앞면은 안보이고 뒷면만 보이게 될 것이다. 사각형 하나만 봐서는 이게 왜 필요한가 감이 별로 안 올것이다.
이제 정육면체를 사각 폴리곤 6개를 합쳐서 그려보도록 하겠다. 그냥 좌표값들과 깊이를 주면 정상적으로 우리가 원하는 정육면체가 그려질 것이다. 하지만 아까 사각형에서 봐서 알수듯이 추려내기 기능을 사용하지 않으면 보이지는 않지만 정육면체의 내부면도 그려지게 될 것이다. 보이지도 않는 면을 그리는 쓸데 없는 일을 하게 되는데, 이런 낭비를 없애기 위해서 추려내기 기능을 사용하게 되는 것이다. 폴리곤을 정면에서 보았을때의 버텍스 방향에 따라서 이면을 그려야 할지 말아야 할지를 결정하게 되므로 이를 생각하고 좌표를 설정 해주면 되겠다.
와인딩이 시계방향이고 시계방향일때만 그려야한다고 설정해 두었다고 가정해보자. 정육면체의 앞면이 정면에서 보이면 당연히 이 앞면은 그려질 것이다. 만약 정육면체를 회전해서 앞면이 뒤로가게 한다고 하면 정면에 보이는건 앞면의 뒷모습일 것이다. 이 앞면의 뒷 모습은 정면에서 봤을때 버텍스 방향이 반시계 방향이므로 드로잉 되지 않게 되는 것이다.
이를 이용하면 간단한 경우에는(위의 정육면체 정도의) 깊이 테스트를 하지 않고도 면이 겹쳐지지 않게 정상적으로 그려 낼 수 있다.
==== GL_DITHER ====
분리된 색상을 사용해서 넓은 범위의 색상표현
회색을 표현할 때 굳이 회색을 쓰지 않고 검은색 도트와 흰색 도트만을 적절히 배치해서 회색을 표현할 수 있으며 흰색을 많이 배치하면 밝은 회색, 검은 색을 많이 넣으면 짙은 회색을 표현할 수 있다.
높은 해상도에서는 굳이 DITHERING을 사용할 필요가 없지만 8비트 또는 16비트 색상을 사용하는 경우에는 유용하게 사용될 수 있겠다. (아주 미세하게 관찰할 경우 분리된 도트가 보이겠지만 보통은 그렇게 보는 경우는 없을 것이므로 유용한 방법이라 할 수 있겠다.)