Quick Syntax
// GL 3.3 Core, 반시계 방향을 앞면으로 쓰는 메시
glFrontFace(GL_CCW);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);메시가 사라지면 정점 순서·변환 뒤 방향·컬링 상태를 함께 확인합니다. 법선 벡터가 앞면 판정을 대신하지는 않습니다.
상태 인벤토리
| 상태 | 기본값 | 가능한 값·동작 |
|---|---|---|
| FRONT_FACE | CCW | CW 또는 CCW로 창 공간의 앞면 지정 |
| CULL_FACE enable | 비활성 | 켜면 지정한 방향의 면 제거 |
| CULL_FACE_MODE | BACK | FRONT·BACK·FRONT_AND_BACK |
| POLYGON_MODE | FILL | POINT·LINE·FILL, Core에서는 FRONT_AND_BACK 대상 |
| polygon offset | factor 0, units 0, 대상별 비활성 | 기울기·깊이 해상도 기반 편향 |
| point/line width | 1 | 구현 허용 범위·프로파일 제약 확인 |
양면 재질은 컬링을 끄거나 패스 설계에 따라 앞뒤를 나누어 처리합니다. FRONT_AND_BACK 컬링은 모든 삼각형 면을 제거하므로 숨기기 위한 설정인지 실수인지 구분합니다. wireframe은 디버그에 유용하지만 채운 면과 같은 깊이·가시성을 그대로 보장하지 않습니다.
뒤집힘과 깊이 편향
음수 스케일이나 좌표계 변환은 면 방향을 뒤집을 수 있습니다. 데이터가 CCW라고 기록되어 있어도 최종 투영·창 좌표 규약에서 의도와 맞는지 확인합니다. gl_FrontFacing으로 셰이더의 양면 처리를 작성할 수 있으나 컬링으로 제거된 면은 프래그먼트 단계에 도달하지 않습니다.
polygon offset은 겹친 면의 깊이를 분리하는 데 쓰지만 상수 하나가 모든 카메라 거리·표면 각도에서 통하는 해결책은 아닙니다. 해당 raster mode의 offset enable을 켜야 하고, 사용 후 복원합니다. 그림자 bias와 일반 z-fighting의 원인을 모두 같은 값으로 숨기지 않습니다.
점·선의 한계
glLineWidth가 임의의 두꺼운 선을 모든 환경에서 제공한다고 기대하지 않습니다. forward-compatible 컨텍스트 등에서는 wide line 지원이 제한됩니다. 일관된 굵기·끝 모양이 필요하면 삼각형 메시로 선을 만드는 방식을 고려합니다. 셰이더의 gl_PointSize를 사용할 때는 PROGRAM_POINT_SIZE 상태와 최대 크기를 확인합니다.
크기 한도는 지원되는 조회 항목으로 읽습니다. GL 3.3 Core에서 다음처럼 범위를 확인하고, 셰이더가 gl_PointSize를 쓰는 경우 해당 상태를 명시합니다.
GLfloat pointRange[2] = {}, lineRange[2] = {};
glGetFloatv(GL_POINT_SIZE_RANGE, pointRange);
glGetFloatv(GL_ALIASED_LINE_WIDTH_RANGE, lineRange);
glEnable(GL_PROGRAM_POINT_SIZE); // 초기에는 비활성조회 범위와 실제 프로파일의 허용 호출을 함께 봅니다.
버전과 구형 코드
앞면·컬링·채움은 1.0부터의 개념이지만 현대 Core에서 QUADS·POLYGON 같은 구형 topology를 사용할 수는 없습니다. 구형 앞뒤 면별 polygon mode 예제를 Core의 허용 대상으로 맞춥니다. 4.5 clip control의 원점 선택을 사용하는 렌더러는 면 방향과 화면 좌표 계약도 함께 점검합니다.
법선·카메라 수학은 Graphics 좌표 공간, 인덱스 연결은 프리미티브에 있습니다.
참고 링크
5 sources