개발/OpenGL / / 2022. 4. 1. 20:34

OpenGL 공부일지 - OpenGL Super Bible 버텍스 프로세싱 및 드로잉 커맨드 - 5

반응형

Clipping

클리핑은 어떤 프리미티브가 완전히 혹은 부분적으로 보이는 지를 결정하고, 뷰포트 안에 들어가는 일련의 프리미티브를 구성하는 것이다.

 

점에 대한 클리핑은 이렇다. 점의 좌표가 영역 안에 있으면 처리하고, 밖에 있다면 버린다.

선에 대한 클리핑은 위 그림과 같다. 양 끝 점이 클리핑 볼륨 평면 밖에 있으면 버리고(B,E), 두 끝 점이 안에 있으면 통과된다(A). 한 쪽만 안에 있는 경우 혹은 끝 점들이 클리핑 볼륨경계에 이는 경우 볼륨에 대해 클리핑되어 내부에 짧은 선이 생성된다(C,D).

 

삼각형도 비슷하지만 복잡하다. 모든 버텍스가 동일 클리핑 평면의 바깥에 있으면 버린다(B). 모든 버텍스가 안에있으면 통과된다(A). 부분적으로 안과 밖에 있는 경우 여러 작은 삼각형을 볼륨에 맞게 잘라 클리핑한다. 

The Guard Band

여러 작은 삼각형으로 클리핑하는 것은 성능 저하 요인이 될 수 있다. 클리핑 대신 래스터라이저에서 보이지 않는 부분을 버리는 방식으로 빠르게 처리하는 법도 있다.

위 그림을 보면 보호 띠 밖으로 버텍스가 나온 경우 클리핑을 하고(E), 보호띠 안에 포함되는 경우 클리핑 없이 분할없이 보이지 않는 부분만 래스터라이저에서 제거된다(C,D). 

 

User-Defined Clipping

점과 평면사이의 부호있는 거리를 계산해서 점이 평면의 어느쪽에 놓여있는지 결정할 수 있다. 이를 통해 절댓값으로 점과 평면의 거리도 알 수 있다. 이러한 방식으로 자신만의 뷰 볼륨 클리핑을 만드는 것도 가능하다.

 

뷰 절두체의 클리핑 평면에 대한 거리들을 버텍스 쉐이더나 지오메트리 쉐이더 안에서 기록할 수 있다. gl_ClipDistance[]를 사용해서 클립 거리값을 쓸 수 있다. 

glEnable(GL_CLIP_DISTANCE0 + n);

위와 같은 함수를 통해 사용자 클립 거리를 활성화시킬 수 있다.

 

내장 클리핑 평면에 대해 gl_ClipDistance[] 배열에 써지는 거리의 부호를 사용해서 버텍스가 사용자 정의 클리핑 볼륨의 안쪽에 있는지 바깥쪽에 있는지 판별할 수 있다.  삼각형의 모든 버텍스에 대한 거리가 음수라면 클리핑 된다. 렌더링 결과는 버텍스 쉐이더에서 수행하는 버텍스별 거리 함수에 대한 선형 추정값이다. 

버텍스 쉐이더가 임의의 평면들로 지오메트리를 클리핑할 수 있다. 

 

gl_ClipDistance[] 배열을 프래그먼트 쉐이더의 입력으로 사용할 수도 있는데, 프래그먼트를 점진적으로 희미해지게 만들어서 클리핑되는 프리미티미티비의 경계를 부드럽게 희미해지게 만들거나 안티에일리어싱되게 할 수 있다.

 

#version 450 core

// More uniforms here

// Clip plane
uniform vec4 clip_plane = vec4(1.0, 1.0, 0.0, 0.85);
uniform vec4 clip_sphere = vec4(0.0, 0.0, 0.0, 4.0);

void main(void)
{
    // Lighting code goes here
    
    // Write clip distances
    gl_ClipDistance[0] = dot(position, clip_plane);
    gl_ClipDistance[1] = length(position.xyz / position.w -
        clip_sphere.xyz) - clip_sphere.w;
    
    // Calculate the clip-space position of each vertex
    gl_Position = proj_matrix * P;
}

위 코드는 버텍스 쉐이더가 두 개의 클립 거리를 사용해서 clip_plane과 clip_sphere로 인하여 평면과 구의 형태로 클리핑하는 코드이다.

sbm파일이 없어 직접 컴파일 할 수는 없다.

 

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유