숏컷 코드
카메라에서 안 보일 후면 삼각형은
-> rasterization 전에 제외문법과 예시
닫힌 메시에서 뒷면을 그릴 이유가 없기 때문에 culling이 효과적이다
완전히 닫힌 불투명 메시라면, 카메라에서 볼 때 뒷면 삼각형은 항상 앞면 삼각형에 가려집니다. 뒷면을 굳이 rasterization 단계까지 보내지 않으면 fragment 처리 비용을 절반 가까이 줄일 수 있습니다. 이 단순한 사실이 backface culling의 존재 이유입니다. 단, 투명한 물체나 한쪽 면만 있는 평면(잎사귀, 풀, 천 등)은 뒤에서도 보여야 하므로 culling을 끄거나 양면 material을 써야 합니다. 잘못 끄면 불필요한 overdraw가 늘고, 잘못 켜면 메시가 카메라에 따라 사라집니다.
winding order가 앞면과 뒷면을 결정하는 유일한 기준이다
삼각형의 세 정점이 화면 기준으로 어느 순서로 나열되는지가 front face를 판정합니다. 반시계(CCW, Counter-Clockwise) 순으로 정점이 보이면 OpenGL 기본값에서는 앞면이 됩니다. DirectX는 기본값이 CW입니다. 중요한 것은 이 판정이 로컬 공간이 아니라 화면에 투영된 후 view space 기준으로 이루어진다는 점입니다. 메시를 모델러에서 만들 때 CCW로 설정했더라도, 음수 scale을 적용하거나 좌표계가 뒤집힌 transform을 거치면 최종 화면에서 winding 방향이 뒤집힐 수 있습니다.
OpenGL 기본: CCW = front face
DirectX 기본: CW = front face
음수 scale 적용 시 -> winding이 뒤집힘 -> 앞면이 뒷면으로 판정됨음수 scale과 transform 계층이 winding 버그의 주된 원인이다
가장 자주 보이는 culling 버그는 음수 scale입니다. (-1, 1, 1) scale로 오브젝트를 좌우 반전시키면 정점 순서가 뒤집히고, 렌더러는 앞면과 뒷면을 반대로 판정합니다. 결과적으로 메시가 보여야 할 곳에서 사라집니다. 이 경우 normal 방향도 함께 뒤집히기 때문에 조명 계산도 잘못됩니다. 이를 방지하려면 음수 scale보다 rotation이나 별도 mirrored mesh를 사용하는 것이 안전합니다. Transform 계층에서 부모에 음수 scale이 있으면 자식 메시 전체에 영향을 주므로 계층 전체를 점검해야 합니다.
culling 설정은 성능 최적화인 동시에 그래픽 버그의 진단 단서다
모델을 import한 직후 한쪽 면이 사라지면, 많은 개발자가 material이나 shader 문제로 먼저 의심합니다. 실제로는 winding 방향이 엔진 기본값과 반대인 경우가 대부분입니다. 이때 culling을 일시적으로 끄면(Cull Off) 양면이 모두 보이므로 winding 문제임을 빠르게 확인할 수 있습니다. 확인 후에는 mesh importer의 "Flip Normals" 또는 "Flip Winding"으로 소스를 수정하고 culling을 다시 켜는 것이 올바른 수순입니다.
후면 판정과 winding을 읽을 때 핵심
| 상황 | 적합한 선택 |
|---|---|
| 닫힌 불투명 메시 | backface culling 켜기, 성능과 가시성 모두 이득 |
| 잎사귀, 천, 평면 메시 | culling 끄거나 양면 material 사용 |
| import 후 한쪽 면이 사라짐 | winding 방향 확인, mesh importer에서 flip 처리 |
| 음수 scale 적용 후 사라짐 | scale 대신 rotation 또는 mirrored mesh 사용 |
| OpenGL ↔ DirectX 전환 시 | front-face 기본값 차이 확인 후 명시적 설정 |
특이 케이스와 주의할 점
backface culling 버그는 대부분 "왜 메시가 사라졌나"로 발견됩니다. 원인은 shader보다 winding 방향 불일치,
음수 scale, 좌표계 전환 중 하나인 경우가 많습니다. 디버깅 첫 단계로 Cull Off를 임시로 설정해서 양면이 모두
보이는지 확인하세요. 양면이 보이면 winding 문제, 여전히 사라지면 다른 원인(clip 범위 밖, 레이어 설정 등)을
살펴야 합니다.
참고 링크
2 sources