CS/그래픽스

[Rendering Pipeline] Stage 4 : Geometry Shader

tae-woong 2025. 12. 25. 00:27

렌더링 파이프라인이란 3차원 상의 물체를 2차원의 컴퓨터 화면에 표현하기 위한 과정

0. 도형의 동적 생성과 파괴 (Primitive Manipulation & Generation)

Geometry Shader는 테셀레이션 단계(혹은 사용하지 않는다면 버텍스 쉐이더)를 거쳐 나온 도형(점, 선, 삼각형) 전체를 입력으로 받는 프로그래밍 가능 단계입니다.

 

정점 하나만 보고 연산하던 이전 단계들과 달리, 삼각형을 이루는 정점 3개를 동시에 보며 새로운 기하 구조를 만들거나 기존 구조를 제거할 수 있습니다.

 

1. Geometry Shader의 핵심 임무 : 도형의 재구성

이 단계의 가장 독특한 점은 입력받은 도형을 바탕으로 ★ 0개 이상의 출력을 내보낼 수 있다는 것입니다.

  • Creation : 입력받은 하나의 점을 사각형(Quad)으로 확장하거나, 삼각형 하나를 여러 개의 파편으로 쪼갤 수 있습니다.
  • Destruction : 특정 조건에 맞는 삼각형을 출력하지 않음으로써 화면에서 완전히 제거(Discard)할 수 있습니다.
  • Stream Out : 계산된 정점 데이터를 래스터라이저로 보내지 않고 VRAM의 특정 버퍼로 다시 써서(Output) 나중에 재사용할 수 있게 합니다.

 

2. 주요 활용 사례 : 실시간 기하 효과

Displacement Shader / Grass Shader

클라이언트 개발자가 지오메트리 쉐이더를 활용하면 CPU의 개입 없이 다음과 같은 효과를 구현할 수 있습니다.

 

  • Displacement Shader : 하이트 맵(Height Map) 데이터를 기반으로 평면적인 정점들에 물리적인 높낮이를 부여하여 실제 굴곡을 생성합니다. (Tessellation과 병행하거나 GS 단독으로도 구조 변형이 가능합니다.)
  • Motion Blur (Geometry-based) : 물체가 빠르게 움직일 때, 움직임 벡터(Velocity Vector)를 따라 삼각형의 에지를 연장(Extrude)하여 물리적인 잔상 면을 생성합니다. 이는 프래그먼트 방식보다 사양을 타지만 더 정확한 실루엣 잔상을 만듭니다.
  • Fur / Grass Simulation : 표면 정점에서 짧은 선분들을 대량으로 생성(Emit)하여 털이나 풀의 질감을 물리적으로 구현합니다.
  • Billboard Particles : CPU에서 사각형 폴리곤 데이터를 보낼 필요 없이, 하나의 점(Point) 데이터만 보내면 지오메트리 쉐이더가 카메라를 향하는 사각형으로 확장시켜 줍니다.
  • Wireframe Rendering : 삼각형의 가장자리를 계산하여 외곽선을 그려주는 효과를 만듭니다.
  • Shadow Volume : 물체의 실루엣을 따라 그림자 체적(Volume)을 생성하여 정교한 스텐실 그림자를 구현할 때 사용됩니다.

 

 

3. 병렬 처리의 한계와 성능 고려 사항

지오메트리 쉐이더는 매우 강력하지만, 남용할 경우 파이프라인 전체의 병목 지점(Bottleneck)이 될 수 있습니다.

  • Variable Output : 출력되는 정점의 개수가 가변적이기 때문에, GPU 입장에서는 메모리 할당을 미리 최적화하기 어렵습니다.
  • Performance Hit : 너무 많은 정점을 생성(Emitting)하면 연산 유닛과 하드웨어 버퍼에 과부하가 걸려 성능이 급격히 떨어집니다.
  • Modern Trend : 최근에는 지오메트리 쉐이더의 성능 문제 때문에, 단순한 확장 작업은 Tessellation이나 Compute Shader를 활용하는 방향으로 대체되기도 합니다.

 

4. 게임 클라이언트 개발자 관점의 포인트 (Optimization)

실무에서 지오메트리 쉐이더를 다룰 때는 다음을 항상 염두에 두어야 합니다.

  1. Max Vertex Count : 쉐이더 코드 상단에 출력할 최대 정점 수를 명시해야 하며, 이 값이 클수록 GPU 오버헤드가 증가합니다.
  2. Culling Efficiency : GPU 단에서 기하학적으로 완벽히 가려진 물체를 이 단계에서 직접 연산하여 폐기할 수도 있지만, 가급적 Stage 0의 CPU 컬링에서 먼저 걸러내는 것이 훨씬 효율적입니다.
  3. Draw Call vs Geometry Generation : 수많은 작은 물체를 개별 Draw Call로 그리는 것보다, 지오메트리 쉐이더에서 한 번에 생성하는 것이 유리할 때가 있습니다.

 

5. 핵심 요약 및 시사점

Geometry Shader는 파이프라인 내에서 기하 구조를 최종적으로 조립하고 변형하는 '커스텀 대장간'과 같습니다.

  • Primitive Input : 점, 선, 삼각형 단위를 통째로 다룹니다.
  • Dynamic Generation : 실행 시간에 정점을 추가하거나 삭제하는 유일한 단계입니다.
  • Cautious Use : 강력한 기능을 제공하지만 성능 비용이 높으므로 신중하게 설계해야 합니다.