오다기리 박의 알고리즘 노트

[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 08. 가시성 판단 (Visibility Detection) 본문

컴퓨터 그래픽스/OpenGL

[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 08. 가시성 판단 (Visibility Detection)

오다기리 박 2019. 2. 14. 21:12

OpenGL로 배우는 3차원 컴퓨터 그래픽스


Chapter 08. 가시성 판단 (Visibility Detection)

(후면제거 - 절단 - 은면제거)


Section 01. 벡터

Section 02. 후면제거 (Backface Culling)

  • 후면제거 (Backface Culling)

    • 후면을 판단하고 제거하는 과정

    • void glEnable(GL_CULL_FACE);
      void glCullFace(GLenum mode);
      void glDisable(GL_CULL_FACE);

  • Front face, Back face

    • void glFrontFace(GLenum mode) : Front face, Back face를 설정

    • void glPolygonMode(GLenum face, GLenum mode) : Front face, Back face를 그리는 방식을 구분할 때 사용


Section 03. 절단 (Clipping)

  • Cohen-Sutherland 알고리즘


    • 장점 : 상대적으로 간단한 계산에 의해 많은 선분이 제거됨

  • Liang-Barsky 알고리즘

    • clipping rectangle의 모든 변을 대상으로 교차점을 계산

    • 장점 : 절단 함수를 재귀적으로 호출할 필요 없이 어디에서 어디까지가 살아남을 구간인지를 한 번에 판단해냄

  • Sutherland-Hodgman 알고리즘

    • 내부 -> 외부 / 외부 -> 내부 로 진행할 때 교차점이 발생하는 것이 핵심

    • 장점 : 하드웨어로 구현하기 적합

    • 단점 : 볼록 다각형만을 처리대상으로 함

      • 해결법 : Tessellation을 한 후 각각의 삼각형에 알고리즘 적용

  • Weiler-Atherton 알고리즘

    • Sutherland-Hodgman 알고리즘의 일반화. Tessellation 에 의하지 않고 오목 다각형을 절단할 수 있다.

    • 내부로 들어가는 순간부터 나오는 순간까지 추가된 모든 정점이 하나의 다각형을 구성

    • 다음 다각형 생성시 지금까지 추가된 모든 정점을 삭제

    • 처리되지 않은 교차점이 더 이상 없을 때까지 반복되고 그때마다 새로운 다각형 생성

  • 내외부 판정 및 교차점

    • 정점의 내외부 판정

      • Ax + By +Cz +D > 0 iff P가 Clip plane 외부에 있다

      • Ax + By +Cz +D = 0 iff P가 Clip plane 위에 있다

      • Ax + By +Cz +D < 0 iff P가 Clip plane 내부에 있다

    • 선분과 Clip plane 의 교차점


Section 04. GL의 절단 (Clipping)


Section 05. 은면 제거 (Hidden Surface Removal)

정규화 장치 좌표계에서 2차원 투상 직전에 은면제거가 이루어진다.

  • 페인터 알고리즘

    • 멀리 있는 것부터 그리기

    • 깊이 정렬 시간 : O(NlogN), O(N^2) (N : 물체면의 개수)

    • Object Space 알고리즘이다 : 물체 단위로 판단하는 알고리즘 . 물체 하나하나에 대해서 다른 물체 앞에 있느냐를 판단한다.

    • 결과

  • Z - 버퍼 알고리즘

    • Image Space 알고리즘이다 : 화소단위로 은면을 판단.

    • 시점에서 나오는 광선은 모든 화소에 대해 화면에 수직

    • 광선의 수 = 화면의 화소 수

    • 알고리즘 복잡도 : O(화소수x물체면의 개수)

    • Z - 버퍼(depth 버퍼) : 은면제거의 속도를 높이기 위한 메모리. 모든 화소에 대해서 현재 광선과 교차된 물체면의 깊이를 저장.

    • 알고리즘

      • 초기화

      • 물체 처리

  • GL의 Z - 버퍼

    • void glGetIntegerv(GLenum pname, GLint *params) : 사용중인 그래픽 카드의 depth 버퍼의 화소당 비트수 검색

    • GL의 depth 버퍼 사용을 위한 함수들

      • void glutInitDisplayMode(GLUT_DEPTH) : 윈도우에서 depth 버퍼 모드를 사용할 수 있도록 초기화

      • void glEnable(GL_DEPTH_TEST) : depth 를 비교하는 모드를 활성화

      • void glClear(GL_DEPTH_BUFFER_BIT) : depth 버퍼 내용을 z=1로 초기화. 새로운 프레임을 그릴 때에만 호출

      • void glDisabled(GL_DEPTH_TEST) : depth버퍼 비활성화

      • void glDepthFunc(GLenum func) : depth 테스트에 사용되는 비교함수를 설정

      • void glDepthMask(GLboolean flag) : 프로그램 실행도중 depth 버퍼에 쓰기 활성화/비활성화

      • void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) : 프로그램 실행도중 프레임 버퍼에 쓰기 활성화 / 비활성화