상세 컨텐츠

본문 제목

Geometry Processing - Clipping

Computer Graphics/Graphics Pipeline

by Banjosh 2024. 11. 29. 15:24

본문

Geometry Processing의 네 번째 단계: Clipping

이번에는 Geometry Processing의 네 번째 단계인 Clipping에 대해 알아보자.
Clipping은 clip 좌표계에서 카메라 시야 밖에 있는 기하학적 객체를 제거하거나, 화면에 보이지 않는 부분을 제외하는 과정이다.
이 단계에서 정점의 x, y, z 값이 특정 영역에 포함되어 있는지를 확인하고, 영역 밖의 정점이나 프리미티브를 처리한다. 이 과정은 GPU가 자동으로 처리하며, 프로그래머는 간접적으로만 관여할 수 있다.


Clipping 기준

  1. x, y 좌표
    • Viewport의 FOV(Field of View)에 따라 x, y 좌표의 클리핑 범위가 설정된다.
      FOV에 따라 카메라 시야의 폭과 높이가 결정되므로, 해당 영역에 포함되지 않은 객체는 제거된다.
  2. z 좌표
    • OpenGL: z 좌표는 [-1.0 ~ 1.0]의 범위를 가진다.
    • Vulkan: z 좌표는 [0.0 ~ 1.0]의 범위를 가진다.
    • 투영 행렬(Projection Matrix)에서 near와 far 변수를 조정하여 클리핑 범위를 설정할 수 있다.
      이를 통해 화면에 렌더링할 깊이 영역을 조절할 수 있다.

Clipping 유형

  1. 프리미티브의 정점이 모두 영역에 포함된 경우
    • 프리미티브 전체가 렌더링된다.
    • 이 경우 클리핑 작업은 필요하지 않다.
  2. 프리미티브의 정점 일부만 영역에 포함된 경우
    • 영역 밖에 있는 정점은 삭제된다.
    • 정점을 연결하는 선분과 카메라 영역 경계가 만나는 지점에 새로운 정점이 추가된다.
    • 새로 생성된 정점을 포함하여 새로운 프리미티브를 생성한다.
  3. 프리미티브가 영역 밖에 완전히 벗어난 경우
    • 프리미티브 전체가 클리핑 처리되어 렌더링되지 않는다.

Clipping 작업에 관여하는 방법

Clipping은 보통 GPU가 자동으로 처리하지만, 프로그래머가 일부 관여할 수 있는 방법도 있다:

사용자 정의 Clipping 평면 설정

  • gl_ClipDistance[]: GLSL 내장 변수를 통해 사용자 정의 클리핑 평면을 추가할 수 있다.
    이 변수에 값을 설정하여 원하는 방식으로 클리핑 규칙을 추가할 수 있다.
  • 사용자 정의 클리핑 평면 규칙을 활성화하면, 해당 평면 기준으로 정점이
    평면의 어느쪽에 있는지에 따라 렌더링 여부를 결정할 수 있다.

주요 사용법:

  1. 클리핑 평면 추가
    • 클리핑 평면 식과 정점의 위치를 기준으로 클리핑 여부를 결정.
      gl_ClipDistance[0] = dot(vertexPosition, clippingPlane);
      
  2. OpenGL에서 클리핑 활성화
    • gl_ClipDistance[0]에서 정의한 클리핑 규칙을 활성화.
      glEnable(GL_CLIP_DISTANCE0);

Clipping의 장점

Clipping은 화면에 보이지 않는 영역을 다음 단계로 넘기지 않음으로써 렌더링 효율을 높이는 중요한 과정이다.
특히, 불필요한 프리미티브를 제거해 GPU 부하를 줄이고 성능을 향상시킬 수 있다.
보통 GPU가 알아서 처리하는 영역이지만, 이를 이해하면 렌더링 과정에 대해 더 깊이 알 수 있다.


Clipping의 핵심

Clipping은 Geometry Processing의 마지막 단계로, 카메라 시야에 포함된 객체만 다음 단계로 넘기는 필터 역할을 한다.
이를 통해 렌더링 최적화를 도와주며, 필요에 따라 프로그래머가 사용자 정의 Clipping 평면을 추가하여 원하는 효과를 낼 수도 있다.
렌더링 과정의 효율성을 높이는 이 과정을 제대로 이해해두면, 더 정교한 그래픽 작업에 응용할 수 있을 것이다.

관련글 더보기