Ray Tracing

Ray Tracing(2) - Shader Table, Root Signature, RTPSO

NyumMa 2026. 6. 20. 20:10

Intro 

이전 글에서는 DXR Pipeline의 기본 흐름을 다음과 같이 정리했다.

DispatchRays 실행

RayGen Shader 실행
RayDesc 구조체 생성
Payload 초기화

TraceRay 함수 실행

Acceleration Structure Traversal
Any hit shader - optional
Closest hit,  Miss shader
Payload 반환

Output Texture 기록

 

과정을 간략화 해 본다면

RayGen -> TraceRay -> Any hit shader(optional) -> Closest hit, Miss shader -> Payload 반환

의 흐름이다.

 

이번에는 Hit 했을 시에 shader를 실행해야 하기 위한 목록에 대한 사전 내용인 Shader Table에 대해 정리한다.

 

이전까지는 TraceRay 함수가 hit을 찾으면 Closest hit shader가 호출되고,

hit이 없으면 Miss shader가 호출된다고 이해했다.

 

하지만 실제 scene에는 여러 object, material, shader가 존재한다.

그렇다면 DXR은 ray가 어떤 geometry를 hit했을 때 어떤 Closest hit shader를 실행해야 하는지,

어떤 Any hit shader가 필요한지, 어떤 material data를 참조해야 하는지 어떻게 알 수 있을까?

 

단순한 scene에 구체 하나와 material 하나만 있다면 다음과 같은 흐름으로 충분해 보일 수 있다.

RayGen에서 TraceRay 함수를 실행하여 intersection 검사를 수행하고,

실제로 hit 하였으면 Closest hit Shader를 실행,

hit 하지 않았으면 Miss Shader를 실행하여

Payload의 값을 갱신하기만 하면 된다.

 

하지만 실제 World를 구성하는 Scene Instance들은 훨씬 복잡하다.

가상 World에는 바닥, 건물, 산, 하늘 등과 같은 여러 오브젝트들과 물성 및 특성들이 제각각 다르다. 

Rasterizer에서도 Material에 따라서 실행되는 Shader가 다른 것처럼

Ray Tracing 또한 Hit, Miss 시에 실행되어야 하는 Shader의 종류가 제각각 다를 수 있을 것이다. 

 

DXR은 hit한 geometry에 대해 제각각 일치하는 정보를 찾아야 한다.

이 연결을 담당하는 구조가 Shader Table이다.


먼저 기본 실행 단위를 나타내는 Shader InvocationDispatchRays에 대하여 다시 정리한다.

 

A shader invocation is a single, independent execution of a shader program on the GPU.

-> Shader Invocation은 셰이더 코드가 특정 입력 단위에 대해 한 번 실행되는 논리적 실행 인스턴스이다.

 

Vertex Shader - vertex 하나에 대해 실행되는 VS invocation
Pixel Shader - fragment 또는 pixel sample 하나에 대해 실행되는 PS invocation
Compute Shader - GPU thread 하나에 대해 실행되는 CS invocation
DXR RayGen Shader - DispatchRays grid의 한 칸에 대해 실행되는 RayGen invocation

 

DXR에서 DispatchRays는 Ray Generation에 대한 Shader invocation grid를 실행하는 명령이다.

그리고 실제 ray tracing의 ray traversal에 대해서는 RayGen shader 안에서 호출되는 TraceRay함수가 담당한다.


CPU Setup vs GPU Execution

그래픽스 파이프라인을 이해할 때는 Rasterizer Pipeline을 다루었을때도 설명하였다 싶이

CPU에서 준비하는 pipeline, resource binding 단계와

GPU에서 실제로 실행되는 ray tracing 단계를 구분해야 한다.

 

이전 챕터에서 설명하였던

DispatchRays 이후의

 

RayGen Shader 실행

TraceRay 호출

TLAS, BLAS Acceleration Structure

Ray Yraversal

Any hit, Closest hit, Miss shader 실행

Payload 반환

 

등의 과정은

GPU에서 수행되는 DXR API의 실행 흐름이다.


이번 챕터에서 설명할 내용들은 GPU에서 동작하는 DXR Pipleline의 구조가 아닌

CPU에서 GPU로 명령을 전달하기 위한 준비 동작과 관련된 계층이다.

 

RTPSO

Shader Table

Shader Record

Shader Identifier

Root Signature

 

등의 내용은 

GPU가 DXR 실행을 하기 전에 CPU의 명령에 대해서

D3D12 쪽에서 미리 준비하고 Command List에 설정해줘야 하는 부분이다.

 

해당 명령들이 GPU의 Command Queue에 들어가서 

DXR API가 준비된 명령을 수행함으로써 GPU에서 Ray Tracing의 Ray Traversal 과정이 수행되게  된다.


Shader Table(SBT, Shader Binding Table)

 

Shader Table은 DXR에서 ray tracing 중 실행할 shader와

shader가 사용할 object, material별 데이터를 연결해주는 테이블이다

 

조금 더 구체적으로 말하면, Shader Table은 Shader Record라고 하는 요소들의 연속된 GPU 메모리 영역이다.

 

DXR에서는 보통 Shader Table이라고 부르며, 

Vulkan이나 OptiX에서는

Shader Binding Table(SBT)이라는 표현도 자주 사용된다.


Shader Record

Shader Record는 Shader Table의 한 항목으로,

DXR이 실행할 shader 또는 hit group을 식별하는 정보와,

그 shader 실행에 필요한 object, material별 데이터를 함께 담는 record이다.

 

쉽게 말해서,

Hit, Miss에서 어떤 shader를 실행할지와 그 shader가 어떤 데이터를 보고 실행될지를묶어둔 것을 Shader Record라고 한다.

 

기본적으로 Shader Record는 다음 두 요소로 구성된다.

 

Shader Identifier: Shader Record가 가리키는 RayGeneration Shader, Miss Shader 또는 Hit Group을 식별하는 값

Local Root Arguments: 해당 shader 실행에 필요한 object, material등의 개별 정보

 

Scene에서 하나의 광선에 대해 같은 Closest hit shader를 사용하더라도

Hit한 오브젝트의 material 정보가 다르다면 다른 record를 통해서 shader를 실행하게 된다. 

즉, shader records는 per objectd에 따른 shader 실행 정보를 선택하기 위해 존재한다. 


Hit Group

Hit Group은 ray가 geometry에 hit했을 시에 사용할 shader 묶음이다.

TraceRay 함수에서 primitives와 충돌을 하지 않으면 miss shader가 실행되고

충돌했을 시에는 any hit shader로 필터링을 거쳐 closest hit shader가 실행된다고 설명하였는데,

Hit Group은 any hit shader, closest hit shader를 통틀어서 말하는 묶음이다.

 

자세하게 들어가서 Hit Group의 구성요소는

 

intersection shader

any hit shader

closest hit shader

 

의 3개가 있다.


Intersection Shader

DXR은 triangle primtives에 대해서 기본적으로 ray triangle intersection을 처리하도록 되어 있다.

따라서 triangle mesh용 hit group에서는 보통 Intersection Shader가 필요하지 않다.

 

예를 들어 불투명한 바닥 object라면 closest hit shader에 대한 단순한 hit group을 가질 수 있다.

반면, hair, leaf card처럼 alpha test가 필요한 object라면 Any hit shader가 함께 포함될 수 있다.

이 경우 ray가 나뭇잎 카드의 사각형 mesh와 교차하더라도, Any hit shader에서

texture alpha 값을 확인해 투명한 영역이라면 IgnoreHit 함수를 호출해 해당 hit를 사전에 필터링 할 수 있다.

 

반면 SDF(Signed Distance Field), Triangle이 아닌 custom primitive처럼 procedual geometry 방식으로 생성되어 

triangle primitives가 아닌 geometry의 경우에는 ray와의 intersection방식에 대해서  직접 정의해야 할 수 있다.

이때 필요한 것이 intersection shader 이다.

 

즉 triangle mesh는 DXR의 기본 default인 ray triangle intersection을 사용할 수 있지만,

procedural한 방식으로 생성된 geometry와 같은 경우에는 직접 intersection shader를 작성해야 할 수 있다.

https://learn.microsoft.com/ko-kr/windows/win32/direct3d12/intersection-shader


RTPSO

RTPSO는 Ray Tracing Pipeline State Object를 의미한다.

 

D3D12의 일반 PSO가

VS, PS, blend, rasterizer, depth stencil같은 graphics pipeline 상태를 묶는 객체라면,

 

DXR에서는 ray tracing pipeline에 필요한 shader library, hit group, shader config, pipeline config, root signature 등을 묶어 raytracing state object를 만든다.

 

일반적인 Graphics Pipline의 PSO가 DrawIndexed 전에 사전에 미리 설정되듯이

ray tracing 쪽의 RTPSO또한 DispatchRays 실행 전에 미리 설정된다.

General PSO
  Vertex Shader
  Pixel Shader
  Input Layout
  Rasterizer State
  Alpha Blend State
  Depth Stencil State
  Render Target
  Root Signature

RTPSO
  RayGen Shader
  Miss Shader
  Any hit Shader
  Closest hit Shader
  Hit Group
  Global Root Signature
  Local Root Signature

Root Signature

DX12에서 Root Signature는 shader가 사용할 resource binding layout이다.

 

즉 실행되는 shader가 어떤

CBV(Constant Buffer View),

SRV(Shader Resource View),

UAV(Unordered Access View),

서술자 테이블(Descriptor table) 등을

떤 방식으로 참조할 수 있는지 정의하는 구조이다.

 

DXR shader들은 다음과 같은 resource들을 필요로 할 수 있다.

 

TLAS
UAV Texture
Camera Constant Buffer
Material Buffer
Descriptor Heap
Texture Sampler

 

Root Signature는 이런 resource들이 shader에서 어떻게 보이는지를 정한다.

한편, Root Arguments들은 Root Signature에서 설정한 binding 구조에 맞추어서 실제로 전달되는 값을 의미한다.


Global Root Signature

Global Root Signature는 ray tracing pipeline 전체에서 공통으로 접근하는 resource binding 구조이다.

 

예를 들면 다음과 같은 resource들이 Global Root Signature에 정의되고,
실제 실행 시점에는 이에 대응하는 Global Root Arguments로 바인딩될 수 있다.

Global Root Signature
 TLAS
 Output UAV
 Camera Constant Buffer
 Scene Light Buffer
 Global Texture Descriptor Heap

즉,  Global Root Signature를 설정함으로써  모든 RayGen, Miss shader, Closest hit shader가

공통으로 필요로 하는 데이터에 대해서 접근할 수 있다.


Local Root Signature

Local Root Signature

각각의 shader record, object, material로 다른 데이터를 전달하기 위한 binding 구조이다.

 

예를 들면 다음과 같은 것들이 local root arguments로 들어갈 수 있다.

Local Root Arguments
 Object Constant Buffer 주소
 Material Index
 Vertex Buffer 주소
 Index Buffer 주소
 Texture Index
 Normal Map Index

즉, 같은 hit groupd을 쓰더라도, Shader Table record의 Local Root Arguments에 따라서

서로 다른 object나 material처럼 처리될 수 있도록 한다. 

 

Global Root Signature와 Local Root Signature의 핵심 동작 측면에서의 차이점은

Global Root Signature의 경우 CPU에서 초기화, 기록하는 command list에서 공통으로 바인딩이 되고
Local Root Signature은 Shader Table record 안의 Local Root Arguments와 연결되어

per object, per material로 개별적으로 참조가 된다는 점이다. 

 


RTPSO와 Shader Table의 관계

RTPSO와 Shader Table은 서로 다른 역할을 한다.

 

RTPSO가 어떤 shader들이 존재하는지, 어떤 hit group이 있는지 정의한다면
Shader Table은 shader들 중 어떤 것을 RayGen, Miss, Hit 상황에서 실행할지 record로 배치한다.

 

흐름은 다음과 같다.

 

1. RTPSO에 RayGen, Miss, Hit Group shader들을 포함시킨다.
2. RTPSO에서 각 shader 또는 hit group의 Shader Identifier를 얻는다.
3. Shader Identifier를 Shader Table record에 복사한다.
4. 필요한 경우 record 뒤에 Local Root Arguments를 붙인다.
5. DispatchRays가 Shader Table 주소를 보고 RayGen, Miss, Hit Group을 실행한다.


Acceleration Structure와 Shader Table

DXR에서 Acceleration Structure는 이전 챕터에서 앞서 설명하였듯이 크게

TLASBLAS로 나뉜다.

 

TraceRay 함수가 호출되면 ray는 먼저 TLAS를 기준으로 scene 안의 instance들과 교차(interesection) 가능성을 검사하고,

이후 해당 instance가 참조하는 BLAS 내부 geometry와의 intersection을 탐색한다.

 

이 과정에서 TLAS, BLAS는 ray가 어떤 instance, 어떤 geometry를 hit했는지를 결정한다.

 

하지만 이것만으로는 어떤 shader를 실행해야 하는지 알 수 없다.

같은 mesh라고 해도 material이 다를 수 있고,

어떤 object는 설계된 의도에 따라서 alpha test가 필요한 Any hit shader를 사용할 수 있으며,

어떤 object는 다른 Closest hit shader를 사용할 수도 있다.

 

따라서 hit된 geometry는 Shader Table의 Hit Group Record와 연결되어야 한다.

 

즉, Acceleration Structure가 어디에 맞았는가를 찾는 구조라면,

Shader Table은 맞은 대상에 대해 어떤 shader를 실행하고

어떤 material, object data를 사용할 것인가를 연결하는 구조이다.

 

흐름으로 보면 다음과 같다.

TraceRay
 TLAS traversal
 instance 후보 탐색
 BLAS traversal
 geometry hit 확인
 hit된 geometry에 대응하는 Hit Group Record 선택
 Hit Group의 Any hit, Closest hit, Intersection shader 실행
 Local Root Arguments를 통해 material/object data 참조
 Payload에 결과 기록

 

 

정리하면, DXR에서 TraceRay 함수는

Acceleration Structure를 통해 hit 대상을 찾고,

Shader Table을 통해 그 대상에 맞는 Hit Group과 local data를 선택한다.

 

이 과정을 통해 ray가 어떤 object를 맞았는지뿐만 아니라,

그 object를 어떤 shader와 material로 처리할지도 결정된다.


정리

이번 공부 챕터의 핵심은 다음과 같다.

 

1. Shader Table은 shader record들의 연속된 GPU 메모리 영역이다.
2. Shader Record는 Shader Identifier와 Local Root Arguments로 구성된다.
3. Shader Identifier는 실행할 shader 또는hit group을 식별한다.

 

4. Hit Group은 hit 발생 시 사용할 Intersection, Any hit, Closest hit shader의 묶음이다.

5.Triangle mesh는 보통 built-in ray-triangle intersection을 사용하므로 별도 Intersection Shader가 필요하지 않다.
6. Procedural geometry는 직접 intersection을 정의하기 위해 Intersection Shader를 사용할 수 있다.

 

7. Global Root Signature는 pipeline 전체 공통 resource binding이다.

8. Local Root Signature는 Shader Table record별 object, material data binding과 연결된다.

9. Local Root Arguments는 per object, material의 데이터를 전달한다.


10. RTPSO는 ray tracing pipeline에 필요한 shader와 state 조합을 묶은 객체이다.

 

이번 공부를 통해서 DXR에서 TraceRay함수가 hit을 찾으면,

DXR은 단순히 임의의 Closest hit shader를 실행하는 것이 아니라

Shader Table을 통해 적절한 Hit Group Record를 선택한다는 것을 확인하였다.

 

Shader Record는 실행할 shader 또는 hit group을 식별하는 Shader Identifier와,

해당 shader가 사용할 object/material별 데이터를 담는 Local Root Arguments로 구성된다.

 

RTPSO는 ray tracing pipeline에서 사용할 shader와 hit group, root signature 등의 state를

DispatchRay 실행 이전에 정의한다.

 

Shader Table은 그 안의 shader identifier를 record로 배치하여

raygen, miss, hit 상황에서 어떤 shader와 데이터를 사용할지를 연결한다.


다음 공부할 부분

Shader Table, Hit Group, RTPSO, Root Signature까지 정리하면

DXR의 흐름에 대해서는 표면적으로 draft하게 파악해 보았다고 할 수 있을 것이다.

 

앞으로는 이런 구조에 대한 다른 층위에서

실제 Ray Tracing이 렌더러에서 어떻게 데이터가 활용되고 계산되는지를 살펴 볼 것이다.

 

1. Radiometry
2. Radiance, Irradiance, Solid Angle
3. Kajiya Rendering Equation
4. Monte Carlo Integration
5. Path Tracing

 

지금까지 정리한 DXR은 ray가 scene의 어디에 hit했는지를 찾고,
그 결과에 따라 적절한 shader를 실행하기 위한 D3D12의 ray tracing API, Pipeline이다.

 

실제 빛에 대한 반응을 산하는 Rendering Equation은

hit 지점에서의 빛에 대해서 어떻게 계산할지 설명하는 이론이다.

 

Path tracing은 DXR API에서의 ray tracing 질의를 반복적으로 사용하여

Rendering Equation의 적분을 Monte Carlo 방식으로 추정하는 알고리즘으로

현대의 컴퓨터 그래픽스 계산에서 Photorealistic한 결과물을 만들기 위한 가장 유력한 후보 방법 중 하나이다.

 

따라서, 다음 공부 단계에서는 Radiometry, Rendering Equation등을 공부해보고 정리하며

ray가 맞은 지점에서 빛의 반응과 색상을 어떻게 계산하는지에 대해 알아보고자 한다.

'Ray Tracing' 카테고리의 다른 글

Ray Tracing(3-1) - Radiometry  (0) 2026.07.09
Ray Tracing(1) - Introduction to ray tracing pipeline  (0) 2026.06.18
Before Studing Ray Tracing  (0) 2026.06.02