Computer/그래픽스

가시성 판단(Visibility Detection)

에린_1 2023. 1. 18. 13:36
728x90

가시성 판단

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

벡터

후면제거(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를 그리는 방식을 구분할 때 사용

절단(Clipping)

  • Cohen-sutherland 알고리즘

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

 

 

  • Liang-Barsky 알고리즘
    • clipping rectangle의 모든 변을 대상으로 교차점을 계산
    • 장점 : 절단 함수를 재귀적으로 호출할 필요 없이 어디에서 어디까지가 살아남을 구간인지를 한 번에 판단해냄

 

 

  • Sutherland-Hodgman 알고리즘
    • 내부 → 외부 / 외부 → 내부로 진행할 때 교차점이 발생하는 것이 핵심
    • 장점 - 하드웨어로 구현하기 적합
    • 단점 - 볼록 다각형만을 처리대상으로 함
      • Tessellation을 한 후 각각의 삼각형에 알고리즘 적용

 

 

  • Weiler-Atherton 알고리즘
    • Sutherland-Hodgman 알고리즘의 일반화. Tessellation에 의하지 않고 오목 다각형을 절단할 수 있다.
    • 내부로 들어가는 순간부터 나오는 순간까지 추가된 모든 정점이 하나의 다각형을 구성
    • 다음 다각형 생성시 지금까지 추가된 모든 정점을 삭제
    • 처리되지 않은 교차점이 더 이상 없을 때까지 반복되고 그때마다 새로운 다각형 생성

GL의 절단(Clipping)

은면 제거(Hidden Surface Removal)

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

  • 페인터 알고리즘
    • 멀리 있는 것 부터 그리기
    • 깊이 정렬 시간 - O(NlogN), O(N^2) N - 물체 면의 개수
    • Object Space 알고리즘 - 물체 단위로 판단하는 알고리즘. 물체 하나하나에 대해서 다른 물체 앞에 있느냐를 판단.

 

  • Z-버퍼 알고리즘
    • Image Space 알고리즘 - 화소단위로 은면을 판단
    • 시점에서 나오는 광선은 모든 화소에 대해 화면에 수직
    • 광선의 수 - 화면의 화소 수
    • 알고리즘 복잡도 - O
    • 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) : 프로그램 실행도중 프레임 버퍼에 쓰기 활성화 / 비활성화
728x90

'Computer > 그래픽스' 카테고리의 다른 글

게임그래픽프로그래밍 주제 1. introduction  (0) 2024.07.01
래스터변환(Rasterization)  (0) 2023.01.19
투상변환과 뷰포트변환  (0) 2023.01.17
모델 변환과 시점 변환  (0) 2023.01.17
OpenGL API  (0) 2023.01.13