4. 셰이더

  1. 셰이더(Shader)
  2. 시멘틱(Semantic)
  3. 셰이더의 종류



1. 셰이더(Shader)

셰이더(Shader)는 그래픽 카드(GPU)에서 실행되는 작은 프로그램으로, 그래픽 렌더링 파이프라인의 특정 단계를 처리한다. 셰이더는 주로 HLSL(High-Level Shading Language) 또는 GLSL 같은 셰이더 언어로 작성되며, 3D 그래픽스와 시각 효과를 구현하는 핵심 요소이다.

셰이더는 3D 모델의 정점(Vertex)과 픽셀(Pixel)에 대해 계산을 수행하여 화면에 렌더링되는 최종 이미지를 생성한다. 이 과정에서 조명, 색상, 텍스처 매핑, 그림자, 반사 등 다양한 시각 효과를 구현할 수 있다.

HLSL 및 D3D11은 기본적으로 #pragma pack(1) 이 선언되어 있어 구조체 크기가 1바이트 기준으로 계산되며, 셰이더 파일의 경우, 메인 프로그램의 실행 도중 D3DCompileFromFile() 함수를 통해 컴파일되어 ID3DBlob 타입 클래스에 저장된다.




2. 시멘틱(Semantic)

시멘틱(Semantic)은 셰이더에서 데이터의 의미를 명시적으로 지정하는 데 사용되는 키워드이다.

DirectX에서는 시멘틱을 통해 GPU 파이프라인의 특정 단계에서 데이터의 역할과 위치를 정의한다. 이는 셰이더가 입력 데이터를 처리하고 출력 데이터를 다른 셰이더 단계로 전달하는 데 사용된다. 따라서 HLSL 코드에 정의되는 변수 중 여러 파이프라인 단계를 넘나드는 변수의 경우 해당 변수의 용도를 설명해 주는 시멘틱(Semantic)이 필요하며, 특정 파이프라인 단계에서만 내부적으로 사용되는 변수 또는 셰이더에서 정의된 함수에서 사용되는 변수는 시멘틱이 필요하지 않다.

시멘틱은 변수 뒤에 붙으면 해당 변수를 수식하고, 함수 뒤에 붙으면 함수의 반환값을 수식한다. 버퍼로 전달받는 데이터의 경우 Input Layout 의 SemanticName 멤버 변수와 일치하여야 하며, 셰이더 내부에서는 일치하는 시멘틱으로 버퍼의 각 요소를 구분한다.


정리하면 다음과 같다:

시멘틱의 역할

  1. 입력/출력 연결
    • 셰이더 입력 및 출력 데이터를 그래픽 파이프라인의 다른 단계와 매핑.
    • 예: 정점 셰이더가 출력한 데이터를 픽셀 셰이더가 받을 때, 동일한 시멘틱 이름을 사용.
  2. 데이터의 역할 명시
    • 특정 데이터가 위치, 색상, 텍스처 좌표 등 무엇을 나타내는지 정의.
  3. GPU 파이프라인과의 상호작용
    • GPU가 데이터를 정확히 처리하도록 위치, 색상, 텍스처 정보 등을 구분.


추가로, 일반적인 시멘틱은 Input Layout과 일치한다는 전제 하에 이름을 바꿀 수 있지만, SV 가 앞에 붙은 System Value 시멘틱은 파이프라인에 의해 특별히 예약된 시멘틱이므로 불가능하다.


3. 셰이더의 종류

셰이더는 크게 렌더링을 담당하는 그래픽 셰이더(Graphic Shader)와 계산, GP(General Purpose) 용도로 사용되는 컴퓨트 셰이더(Compute Shader)로 나눌 수 있다.


  1. 그래픽 셰이더(Graphic Shader)
    • 정점 셰이더(Vertex Shader) : 정점 데이터를 변환(모델 공간 → 화면 공간), 조명 계산, 정점의 속성(예: 텍스처 좌표)을 출력
    • 픽셀 셰이더(Pixel Shader) : 최종 픽셀 색상을 계산, 텍스처, 조명, 그림자 등 시각 효과를 적용
    • 지오메트리 셰이더(Geometry Shader) : 입력된 도형을 변형하거나 새로운 도형을 생성(예: 테셀레이션, 그림자 생성)
    • 헐 셰이더(Hull Shader) : 패치를 받아 세부 분할 수준을 결정
    • 도메인 셰이더(Domain Shader) : 헐 셰이더에서 결정된 패치의 세부 정보를 기반으로 정점 계산

그래픽 셰이더의 각 단계에 대한 설명은 [DirectX 1. 그래픽 파이프라인][1] 글을 참고.


  1. 컴퓨트 셰이더(Compute Shader)
    • 렌더링과는 별개로 데이터 병렬 처리를 수행(예: 물리 시뮬레이션, 입자 효과, 딥러닝)

1