• 이전 글: ❎ Direct3D 11 Graphics Pipeline - 4. Rasterizer 스테이지

  • Rasterizer는 픽셀 자체를 생산하지 않고, 픽셀로 그릴지 말지 결정될 픽셀 후보들(fragments)을 생성함

  • Pixel Shader(PS, Fragment Shader)는 실제 그려질 픽셀의 색을 결정하는 셰이더로, Rasterizer가 만들어낸 fragment 하나 당 PS가 1회 실행됨

    • 출력 결과는 Render Target(SV_Target)에 기록됨
  • 정리하자면, VS는 정점의 위치와 속성 계산, Rasterizer는 삼각형을 픽셀 단위로 분해, PS는 각 픽셀의 색 계산

1. 입력과 출력

  • PS의 입력은 VS 출력을 Rasterizer에서 보간한 결과

    struct PSInput {
        float4 position: SV_POSITION;
        float4 color: COLOR;
        float2 uv: TEXCOORD0;
    };
    
  • 출력으로는 RGBA 색상(8 * 4 = 32bit)을 반환하며, Render Target(보통 백버퍼)에 기록

    float4 PSMain(PSInput input): SV_Target {
        return input.color;
    }
    
    • 색상의 범위는 0.0 ~ 1.0이며, 범위를 벗어나면 자동으로 clamp됨
  • Pixel Shader는 최종 색을 계산만 수행하고, 실제 프레임 버퍼에 기록되는 과정은 Output Merger(OM) 스테이지에서 수행

Multiple Render Targets(MRT)

  • PS는 한 번에 여러 Render Target에 동시 출력이 가능함

    struct PSOutput {
        float4 color0: SV_Target0;
        float4 color1: SV_Target1;
    };
    
  • G-Buffer, Deffered Rendering 등 고급 렌더링에서 사용

2. PS에서 가능한 연산들

  • PS는 가장 자유도가 높은 셰이더로, 다음과 같은 작업들이 가능함

    • 색 계산(Diffuse, Ambient 등)

    • 텍스처 샘플링

    • 조명 계산

    • 알파 블랜딩용 값 생성

    • 마스크 처리

Texture Sampling

  • 텍스처의 좌표 자체는 VS에서 잡아주고, Rasterizer에서 보간되어 PS로 입력됨

  • 입력된 UV(텍스처 내 좌표)를 이용해 실제 색을 샘플링하는 작업은 PS에서 수행

    Texture2D diffuseTex: register(t0);
    SamplerState samp: register(s0);
    
    float4 PSMain(PSInput input): SV_Target {
        return diffuseTex.Sample(sample, input.uv);
    }
    
    • SamplerState는 텍스처 필터링 / 래핑 모드 정의

3. 성능 관점

  • PS 또한 VS와 마찬가지로 동시에 대량 병렬 실행되는 구조임

  • PS는 fragment마다 실행되며 화면 해상도에 비례하다보니 가장 비싼 셰이더이면서 복잡한 연산을 추가하면 프레임이 급감하게 됨

  • PS 작성 시 불필요한 분기는 최소화하고 간단한 연산 위주로 구성하는 것이 중요

  • GPU는 CPU처럼 한 스레드 = 한 코어 구조가 아니며, 하나의 연산 유닛이 여러 데이터를 동시 처리함

    • SIMD(Single Instruction, Multiple Data) 그룹 단위로 실행됨
  • 셰이더 코드 내에서 분기가 발생하면 GPU는 어느 데이터가 어느 쪽으로 분기될 지 모르니 두 경로를 모두 실행시키며, 각 fragment들이 자기 경로의 결과만 취하기 때문에 분기가 많아질 수록 실행 경로가 폭발적으로 증가하는 분기 발산(branch divergence)이 발생

  • 다음 글: ❎ Direct3D 11 Graphics Pipeline - 6. Output-Merger 스테이지