학습목표 8장. 가시성 판단 후면제거의 정의와 처리방법을 이해한다. 절단작업의 정의와 처리방법을 이해한다. 지엘의 절단 방법을 이해한다. 은면제거의 정의를 이해한다. 지-버퍼 알고리즘을 구체적으로 이해한다.
정규화 벡터(Normalized Vector) Section 01 벡터-벡터 정규화 벡터(Normalized Vector) 벡터의 크기(절대값) [그림 8-1] 좌표벡터 (8.2) (8.3)
내적(Inner Product, Dot Product) 벡터 내적과 외적 내적(Inner Product, Dot Product) 외적(Outer Product, Cross Product) 정규화 법선벡터 =정규화 외적벡터 (8.4) [그림 8-3] 벡터 내적 [그림 8-3] 벡터 내적 (8.5) (8.6) [그림 8-4] 벡터 외적
평면 표현 (8.7) (8.8) [그림 8-5] 평면 표현 (8.9) (8.10)
법선벡터 방향 지엘의 법선벡터 오른 손을 명시된 정점 순으로 감싸 쥐었을 때 엄지방향 (8.11) [그림 8-7] 법선벡터 [그림 8-8] 법선벡터 방향
후면제거(Backface Culling, Backface Removal) Section 02 후면제거-후면 전면과 후면 후면(Back-Facing Polygon) 전면(Front-Facing Polygon) 후면제거(Backface Culling, Backface Removal) 시점과 면의 오리엔테이션만으로 판단 보이지 않는 면의 거의 절반을 제거 [그림 8-9] 전면과 후면 (8.12) [그림 8-10] 시점벡터와 법선벡터
glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); 지엘의 후면제거 정규화 가시부피 법선벡터의 z 값만으로 판단가능 glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); [그림 8-11] 가시부피와 정규화 가시부피 [그림 8-12] 지엘의 후면제거
하나의 면 = 표면 + 이면 표면 표면과 이면 시계방향으로 정의된 면 반시계방향으로 정의된 면 glFrontFace(GL_CCW) 반시계방향으로 정의된 면 glFrontFace(GL_CW) [그림 8-13] 표면과 이면 [그림 8-14] 표면과 이면
후면의 이면 후면이면 = 표면 표면과 이면 시점이 결정되면 다각형의 표면과 이면 중 하나의 면만 보임. 지엘은 표면과 이면 중 하나만을 선택하여 그 면으로 해당 다각형을 대신함 후면이면 = 표면 [그림 8-16] 후면의 이면
Section 03 절단 알고리즘-절단(Clipping) 2차원 절단 윈도우(Window), 뷰포트(Viewport), 시저 박스(Scissor Box) 3차원 절단 가시부피(View Volume) 절단 다각형 절단 사각형(Clip Rectangle)
4비트 아웃코드(Outcode) 코헨-서더런드 알고리즘 테스트 1) E1 = E2 = 0000 완전히 사각형 내부 선분이므로 보이는 선분으로 판정한다. (선분 A) 테스트 2) E1 & E2 != 0000 선분이 온전히 절단 사각형 밖에 있으므로 제거한다. (선분 B) 테스트 3) E1 != 0000, E2 = 0000 (또는 그 반대) 교차점 계산에 의해 절단한다. (선분 C) 테스트 4) E1 & E2 = 0000 양끝점이 모두 절단 사각형 밖에 있지만 서로 다른 선분이다. 교차점 계산에 의해 절단한다. (선분 D, D') [그림 8-18] 코헨-서더런드 알고리즘
선분분할 분할된 선분을 대상으로 다시 테스트 코헨-서더런드 알고리즘 선분 D: E3 & E2 != 0000 이므로 온전히 외부 선분으로 무시 [그림 8-19] 선분분할 I [그림 8-20] 선분분할 II
교차점에서의 파라미터 값의 순서를 기준으로 여러 가지 경우를 판단 리앙-바스키 알고리즘 교차점에서의 파라미터 값의 순서를 기준으로 여러 가지 경우를 판단 [그림 8-22] 리앙-바스키 알고리즘
절단 다각형을 기준으로 순서대로 절단 절단 규칙 서더런드 핫지먼 알고리즘 [그림 8-23] 서더런드-핫지만 알고리즘의 처리순서 [그림 8-24] 서더런드-핫지먼 알고리즘의 절단규칙
Silicon Graphics의 Geometry Engine에 사용 서더런드 핫지먼 알고리즘 선분을 연장한 직선을 기준으로 절단 Ex. 좌변기준의 절단 3차원 절단 상, 하, 좌, 우, 전, 후의 6개의 면을 기준으로 절단 면을 기준으로 내외부 판정 Silicon Graphics의 Geometry Engine에 사용 [그림 8-25] 삼각형의 절단 [그림 8-26] 3차원 서더런드-핫지먼 알고리즘
해법 1: 다각형 분할(Tessellation) 볼록, 오목 서더런드-핫지먼 볼록 다각형에만 적용 하나의 다각형으로 취급 오목 다각형 처리결과: 오류 해법 1: 다각형 분할(Tessellation) 오목 -> 볼록 해법 2: 웨일러-애서톤 알고리즘 [그림 8-28] 오목 다각형 처리결과 [그림 8-29] 다각형 분할
웨일러-애서톤 알고리즘 내부에서 외부로 가는 교차점이 추가되면 즉시 그 교차점으로부터 절단 사각형을 따라서 반 시계 방향으로 간다. 즉, 가장 최근에 외부에서 내부로 들어온 교차점을 만날 때까지 간다. 1-C-D-2로 구성되는 하나의 다각형이 완성 분리된 여러 개의 다각형을 생성함 [그림 8-30] 웨일러-애서톤 알고리즘
정점의 내외부 판정 [그림 8-31] 정점의 내외부 판정 (8.13) (8.14) (8.15)
점과 평면간의 거리 동차좌표 사용 법선벡터 방향이 면의 외부로 정의됨 [그림 8-32] 점과 평면의 거리 (8.16) (8.17) (8.18) (8.19)
교차점 계산 (8.20) (8.21) (8.22) (8.23) (8.24) (8.25) (8.26) [그림 8-35] 교차점 계산 (8.27)
3차원좌표(x’, y’, z’) 정규화 장치좌표계 절단 좌표계 (동차 좌표) Section 04 지엘의 절단-지엘의 절단 (8.28) (8.29) [그림 8-38] 정규화 부피 (8.30)
서더런드 핫지만 알고리즘과 유사 내부점, 외부점, 동일점 지엘의 절단 지엘은 4차원 절단 4차원 교차점 계산이 필요 [그림 8-39] 동차좌표, 3차원 좌표 [그림 8-40] 내부점, 외부점 [그림 8-41] 동일점
선분의 절단 [그림 8-42] 선분절단 I [그림 8-43] 선분절단 II (8.31) (8.32) (8.33) (8.34) (8.35) (8.36)
Hidden Surface Removal Section 05 후면제거-은면제거 Hidden Surface Removal 앞 물체에 가려서 안 보이는 부분 물체의 깊이정보(z값)를 기준으로 판단 [그림 8-46] 가시성 [그림 8-47] 은면 I [그림 8-48] 은면 II
멀리 있는 배경위에 가까운 물체를 덧칠 페인터 알고리즘 깊이 정렬(Depth Sort)이 필요 Zmax를 기준으로 물체를 정렬 [그림 8-51] 물체면의 깊이 차이 I
B‘, B'‘ B B'‘ 페인터 알고리즘 Zmin이 A의 Zmin보다 앞에 있으면 그것을 나중에 그려야 함. x 또는 y 범위가 서로 중첩되지 않으므로 어느 것을 먼저 그리던지 무관함. [그림 8-52] 물체면의 깊이 차이 II
면의 분할 (1) (2) (3) 페인터 알고리즘 먼저 A, B를 Zmax 기준으로 그려냄. C와 D는 Zmax는 같지만 x(또는 y)의 범위가 중첩되지 않으니 어느 것을 먼저 그려도 무방함 (3) 최종결과 [그림 8-54] 면의 분할
가시성 사이클(Visibility Cycle)과 침투(Penetration) 페인터 알고리즘 가시성 사이클(Visibility Cycle)과 침투(Penetration) 페인터 알고리즘 물체공간 알고리즘(Object Space Algorithm) 정밀도는 높지만 실행속도가 느림 경우에 따른 처리가 매우 복잡함. [그림 8-55] 사이클과 침투
물체공간 vs. 화소공간 지-버퍼 알고리즘의 시선 지-버퍼 알고리즘 결국 화소공간으로 사상 화소공간 해상도로 은면을 판단하면 됨 지-버퍼 알고리즘의 시선 [그림 8-56] 물체공간, 화소공간 [그림 8-57] 지-버퍼 알고리즘의 시선
지-버퍼(Z-Buffer) 또는 깊이버퍼(Depth Buffer) 지-버퍼 알고리즘 Initialize Frame Buffer with Background Color; Initialize Z Buffer with Infinite Distance; for Each Polygon { for Each Pixel { Calculate z of Intersection if (Calculated z < Current z of Z-Buffer) { Update Z-Buffer with Calculate z; Update Frame Buffer with the Color of Current Polygon; } }
지-버퍼 알고리즘 [그림 8-58] 지-버퍼 알고리즘 [그림 8-59] 지-버퍼의 초기화 [그림 8-60] 갈색 삼각형 처리결과
지-버퍼 알고리즘 [그림 8-58] 지-버퍼 알고리즘 [그림 8-60] 갈색 삼각형 처리결과 [그림 8-61] 녹색 삼각형 처리결과
래스터 변환 단계에서 실행 선형보간 정점으로부터 내부점의 깊이(Depth)및 컬러(Color)를 보간 [그림 8-63] 선형보간
Thank you