3D Graphics

Geometry Shader

hunhun4949 2024. 9. 12. 10:28

Geometry Shader셰이더 파이프라인의 한 단계로, VS(VertexShader) 이후에 실행된다.

주 역할은 프리미티브(점, 선, 삼각형, 등)을 입력받아 프리미티브를 추가하거나 변형을 해준다.

이 기능은 DirectX10이상에서만 지원된다.

 

Geometry Shader 주요 특징

  • 입력과 출력
    • 입력 : GS는 하나 이상의 프리미티브를 입력으로 받는다. 예를 들어 VS에서 출력된 삼각형이 GS로 전당된다.
    • 출력 : 입력된 프리미티브를 변형하거나 새로운 프리미티브를 추가 생성할 수 있다. 즉, 입력으로 삼각형 하나가 들어와도 여러 개의 삼각형을 출력할 수 있다.
  • 프리미티브 증분
    • GS는 입력된 정점 데이터를 기반으로 프리미티브를 새로 생성할 수 있다. 예를 들어, 삼각형이 들어오면 이를 여러 개의 삼각형으로 나누거나, 점이 들어오면 그 점을 기점으로 선이나 삼각형, 사각형으로 변환할 수 있다.
    • 이 기능을 통해 디테일한 지오메트리 효과(실시간으로 나뭇잎을 생성하거나 폭발 이펙트에서 파편을 생성하는 효과)를 만들 수 있다.
  • 스트림 출력(Stream Output)
    • GS의 출력을 메모리 버퍼에 직접 기록할 수 있다. 이를 통해 다음 렌더링 패스에서 다시 사용하거나 후처리에 활용할 수 있따.
    • 이 기능은 입력된 데이터의 변형 결과를 저장하여 나중에 사용해야 할 때 유용하다.

Geometry Shader의 주요 사용 사례

  • 쉐도우 볼륨 생성
    • 그림자를 생성할때 주로 두 가지 방법을 사용하는데 하나는 쉐도우 매핑을 사용하는것이고 다른 하나가 바로 쉐도우 볼륨을 사용하는것이다. GS를 사용해서 물체의 쉐도우 볼륨을 생성할 수 있으며 이를 활용해 더욱 사실적인 그림자 표현이 가능하다. 
  • 입자 시스템(Particle System)
    • Geometry Shader를 사용해 입자 효과를 생성할 수 있다. 예를 들어 정점 하나를 입력받아 그 위치에서 여러 개의 입자를 생성하고 출력하는 방식으로 사용할 수 있다.
  • LOD(Level of Detail) 처리:
    • Geometry Shader는 물체의 상세도를 줄이거나 높이는데 사용할 수 있다. 멀리 있는 물체는 삼각형의 개수를 줄이고, 가까이 있는 물체는 더 많은 삼각형을 추가하여 렌더링 선을을 최적화할 수 있다.

Geometry Shader의 동작 과정

  • 정잠 셰이더 실행 후
    • GS는 VS에서 처리된 데이터를 입력받는다. 정점 셰이더가 처리한 점, 선, 삼각형 같은 기본적인 프리미티브가 GS의 입력이 된다.
  • 프리미티브 처리
    • GS는 입력된 프리미티브를 기반으로 변형하거나 추가 프리미티브를 생성한다.
  • 출력
    • GS는 변형된 프리미티브를 다음 파이프라인 단계로 전달하거나 스트림 출력을 통해 GPU 메모리 버퍼에 기록할 수 있다.

 

Geomerty Shader의 예시(DirectX HLSL)

아래는 입력된 삼각형을 기반으로 추가적인 프리미티브를 생성하는 간단한 GS예시다

struct VS_OUTPUT
{
    float4 pos : SV_POSITION;
    float3 normal : NORMAL;
};

[maxvertexcount(4)] // 최대 4개의 정점을 출력할 수 있음을 명시
void GS(triangle VS_OUTPUT input[3], inout TriangleStream<VS_OUTPUT> OutputStream)
{
    VS_OUTPUT output;

    // 첫 번째 삼각형의 정점
    for (int i = 0; i < 3; ++i)
    {
        output = input[i]; // 입력된 정점 그대로 출력
        OutputStream.Append(output); // 정점을 출력 스트림에 추가
    }

    // 추가적인 프리미티브 생성 (이 경우, 정점을 추가로 생성하여 네 번째 정점)
    output.pos = float4(0.0f, 0.0f, 0.0f, 1.0f);
    OutputStream.Append(output);

    OutputStream.RestartStrip(); // 새로운 스트립 시작
}

 

 

Geometry Shader의 장단점

  • 장점
    • 입력된 프리미티브 변형 또는 추가를 통해 복잡한 기하 구조를 동적으로 생성할 수 있다.
    • 폭팔, 파편, 그림자, 입자 등을 효과적으로 렌더링할 수 있다.
  • 단점
    • GS에서 프리미티브 생성은 과도하게 하면 성능저하를 일으킬 수도 있다.
    • 프리미티브 처리의 복잡성이 높아 VS나 PS보다 느리다.

결론

Geomerty Shader는 프리미티브의 동적 생성 및 변형이 필요한 상황에 매우 유용하다. 하지만 이는 연산을 많이 잡아먹어서 꼭 필요한 상황에서만 사용하는 것이 좋다.