레이 트레이싱 파이프라인
고친 사람 github-actions[bot]
레이 트레이싱 파이프라인은 그래픽 카드가 광선을 쏘아 장면을 그리게 해 줍니다. 광선이 어느 물체에 맞았는지 보고 그 물체 몫의 프로그램을 골라 돌립니다. 이 프로그램들을 실행 전에 한 덩어리로 묶어 둔 것이 레이 트레이싱 파이프라인입니다.
쉽고 빠른 이해
레이 트레이싱 파이프라인은 광선이 맞은 물체에 따라 알맞은 프로그램을 그래픽 카드가 스스로 골라 돌리게 합니다. 화면의 점마다 광선을 쏩니다. 거울 공에 맞으면 거울 공 프로그램이 돕니다. 나무 바닥에 맞으면 바닥 프로그램이 돕니다.
어느 물체에 맞을지는 광선을 쏴 봐야 압니다. 미리 묶어 두지 않으면 모든 물체의 처리를 커다란 프로그램 하나에 몰아 적어야 합니다.
어떻게 도나:
- 시작할 때 물체별 프로그램을 모아 파이프라인을 만듭니다. 물체와 프로그램을 잇는 표도 적습니다
- 화면의 점마다 광선을 쏩니다
- 광선이 맞은 물체를 찾으면 표에서 그 물체의 프로그램을 골라 돌립니다
대가가 있습니다. 만드는 데 오래 걸립니다. 한번 만들면 못 고칩니다. 물체와 광선 종류가 늘면 표도 함께 커집니다.
반사와 그림자를 그릴 때 씁니다. 화면 전체는 물체를 하나씩 찍어 칠하는 방식이 더 적은 계산으로 그립니다. 광선이 막혔는지만 물을 때는 표 없이 광선을 쏘고 답을 바로 받는 수단을 씁니다.
상세
이 절은 레이 트레이싱 파이프라인에 무엇이 묶이는지, 광선 하나가 어떤 차례로 프로그램을 부르는지, 왜 이런 묶음이 따로 필요한지를 봅니다. 방 안에 거울 공 하나와 나무 바닥 하나가 놓인 장면을 줄곧 예로 씁니다.
GPU(Graphics Processing Unit, 그래픽 처리 장치)는 같은 계산을 동시에 아주 많이 돌리도록 만든 칩입니다. 화면의 점 수백만 개의 색을 한꺼번에 정하려고 만들었습니다.
셰이더는 GPU 에서 도는 작은 프로그램입니다. 점 하나의 색을 셈하는 식의 계산을 셰이더에 적어 GPU 에 넘깁니다.
레이 트레이싱은 눈에서 화면의 점 하나를 지나는 직선을 쏘아 그 점의 색을 정하는 그리기 방식입니다. 이 직선을 광선이라고 부릅니다. 광선이 거울 공에 맞으면 그 점에 공이 칠해집니다. 아무것에도 안 맞으면 배경이 칠해집니다.
광선이 맞은 곳에서 광선을 또 쏠 수 있습니다. 거울 공에서 반사 방향으로 하나를 더 쏘면 공에 비친 바닥이 나옵니다. 바닥에서 전등 쪽으로 하나를 쏘면 그곳이 그림자 안인지 압니다. 반사와 그림자를 따로 흉내 내지 않고 광선을 더 쏘는 것으로 얻습니다.
게임 화면을 그리는 흔한 방식은 래스터화입니다. 물체를 하나씩 화면에 눌러 찍어 그 물체가 덮는 점을 칠합니다. 물체 하나를 칠할 때 다른 물체를 보지 않으므로 비친 모습과 그림자는 따로 흉내 내야 합니다.
GPU 에 일을 시키려면 셰이더와 설정을 미리 한 덩어리로 묶어 둡니다. 이 덩어리를 파이프라인이라고 부릅니다. 셰이더를 칩의 기계어로 옮기는 일과 설정이 맞는지 검사하는 일은 느립니다. 그래서 실행 전에 한 번만 해 둡니다.
그리기용으로 묶은 것이 그래픽스 파이프라인입니다. 계산용으로 묶은 것은 컴퓨트 파이프라인입니다. 광선을 쏘는 일에 쓰려고 묶은 것이 레이 트레이싱 파이프라인입니다.
회사 대표 전화의 자동 응답을 떠올려 보면 됩니다. 1번을 누르면 배송 담당에게, 2번을 누르면 환불 담당에게 이어집니다. 어느 번호가 눌릴지는 전화가 와 봐야 압니다. 번호마다 누구에게 이을지는 문을 열기 전에 정해 둡니다.
레이 트레이싱 파이프라인은 담당자들을 미리 모아 두는 일에 해당합니다. 광선이 어느 물체에 맞을지는 쏴 봐야 압니다. 물체마다 어느 셰이더를 돌릴지는 실행 전에 정해 둡니다.
번호와 담당자를 잇는 연결표는 따로 만듭니다. 이 연결표는 아래 「셰이더 바인딩 테이블」 소절에서 풉니다.
광선 하나가 부르는 셰이더 다섯
레이 트레이싱 파이프라인에는 하는 일이 다른 셰이더가 다섯 종류 들어갑니다. 광선을 쏠 때, 물체와 겹치는지 볼 때, 맞은 뒤, 빗나간 뒤에 저마다 다른 셰이더가 돕니다.
광선 생성 셰이더(ray generation shader)는 광선을 쏘는 셰이더입니다. 화면의 점 하나마다 한 번씩 돕니다. 자기가 맡은 점을 지나는 광선을 만들어 쏩니다. 돌아온 결과로 그 점의 색을 씁니다.
광선을 쏠 때는 값을 담을 작은 상자를 같이 실어 보냅니다. 이 상자를 페이로드라고 부릅니다. 맞은 곳의 셰이더가 여기에 색을 적어 두면 광선 생성 셰이더가 돌아온 페이로드에서 읽습니다.
광선은 뚫고 지나가는 선이라 겹치는 물체가 여럿일 수 있습니다. 그중 눈에서 가장 가까운 것이 보이는 물체입니다. 가장 가까운 적중이 정해진 뒤 한 번 도는 셰이더가 최근접 적중 셰이더(closest-hit shader)입니다.
거울 공의 최근접 적중 셰이더는 반사 방향으로 광선을 하나 더 쏩니다. 나무 바닥의 최근접 적중 셰이더는 나뭇결 색을 페이로드에 적습니다. 물체마다 다른 최근접 적중 셰이더를 둘 수 있다는 것이 이 파이프라인의 핵심입니다.
광선이 아무것에도 안 맞으면 미스 셰이더(miss shader)가 돕니다. 대개 배경색을 페이로드에 적습니다. 그림자를 보려고 쏜 광선이라면 「전등까지 막힌 것이 없다」를 적는 데 씁니다.
임의 적중 셰이더(any-hit shader)는 가장 가까운 적중을 찾는 도중에 물체와 겹칠 때마다 돕니다. 이 겹침을 적중으로 칠지 말지를 정합니다. 나뭇잎 그림처럼 구멍이 뚫린 물체에 씁니다. 구멍 쪽에 맞았으면 이 겹침을 무시하라고 알려 광선이 뚫고 지나가게 합니다.
입체 모델은 대개 작은 삼각형 수만 개를 이어 붙여 만듭니다. 광선과 삼각형이 겹치는지는 GPU 가 스스로 계산합니다. 그래서 삼각형만 쓰는 장면에는 교차 셰이더(intersection shader)가 필요 없습니다.
교차 셰이더는 삼각형이 아닌 모양을 쓸 때 필요합니다. 구나 곡면처럼 수식으로 적은 모양과 광선이 겹치는지를 직접 계산해 알립니다.
다섯을 거울 공 장면에 맞춰 한 표로 모으면 이렇습니다.
| 셰이더 | 언제 도나 | 거울 공 장면에서 |
|---|---|---|
| 광선 생성 | 화면의 점마다 한 번 | 점을 지나는 광선을 쏘고 결과 색을 쓴다 |
| 최근접 적중 | 가장 가까운 적중이 정해진 뒤 | 공은 반사 광선을 쏘고, 바닥은 나뭇결 색을 적는다 |
| 미스 | 아무것에도 안 맞았을 때 | 배경색을 적는다 |
| 임의 적중 | 겹칠 때마다 | 구멍 뚫린 물체가 없으면 안 쓴다 |
| 교차 | 삼각형이 아닌 모양과 겹치는지 볼 때 | 공을 삼각형으로 만들었으면 안 쓴다 |
여섯째로 호출 가능 셰이더(callable shader)가 있습니다. 광선과 상관없이 다른 셰이더가 함수처럼 불러 쓰는 셰이더입니다. 없어도 파이프라인이 섭니다.
광선 하나가 지나가는 길
이 소절은 광선 하나가 쏘아진 뒤 셰이더들이 어떤 차례로 도는지 봅니다. 위에서 쉬운 순서로 본 다섯이 실제로는 아래 차례로 불립니다.
flowchart TD
A["광선 생성 셰이더 · 광선을 쏜다"] --> B["GPU 가 광선과 겹칠 만한 물체를 찾는다"]
B --> C["겹침 계산 · 삼각형이 아니면 교차 셰이더"]
C --> D["임의 적중 셰이더 · 이 겹침을 칠지 정한다"]
D -->|"남은 물체가 있으면"| B
D -->|"다 봤으면"| E{"맞은 것이 있나"}
E -->|"있다"| F["최근접 적중 셰이더"]
E -->|"없다"| G["미스 셰이더"]
임의 적중 셰이더가 받아들이지 않은 겹침은 적중에서 빠집니다. GPU 는 그 겹침을 잊고 다음 물체로 넘어갑니다. 가장 가까운 적중은 남은 물체를 다 본 뒤에야 정해집니다.
광선 하나에서 최근접 적중 셰이더와 미스 셰이더는 둘 중 하나만 돕니다. 어느 쪽이든 페이로드에 결과를 적습니다. 그 셰이더가 끝나면 광선을 쏜 셰이더로 돌아갑니다.
가속 구조
광선 하나가 장면의 삼각형 수백만 개와 하나하나 겹침을 따지면 너무 느립니다. 그래서 찾기용 구조를 미리 만들어 둡니다. 가속 구조는 물체들을 상자에 나눠 담아 광선이 맞을 만한 물체를 빨리 찾게 하는 구조입니다.
가속 구조는 큰 상자 안에 작은 상자가 드는 트리 모양입니다. 광선이 큰 상자를 빗나가면 그 안의 삼각형은 전부 건너뜁니다. 이런 상자 트리를 BVH(Bounding Volume Hierarchy, 경계 볼륨 계층)라고 부릅니다.
가속 구조는 두 층으로 짓습니다. 아래층은 물체 하나의 모양을 담습니다. 위층은 그 모양을 장면 어디에 놓을지를 담습니다. 의자 모양 하나를 아래층에 한 번 담아 두고 위층에서 열 군데에 놓을 수 있습니다.
의자 열 개와 거울 공 하나가 놓인 장면이면 두 층은 이렇게 생깁니다.
flowchart TD
subgraph TOP["위층 · 어디에 놓나"]
C1["의자 1"]
C2["의자 2"]
CR["의자 3~10"]
BP["거울 공"]
end
subgraph BOT["아래층 · 물체 하나의 모양"]
CM["의자 모양 · 큰 상자"]
BM["공 모양"]
K1["작은 상자"]
K2["작은 상자"]
T1["삼각형 몇 개"]
T2["삼각형 몇 개"]
end
C1 --> CM
C2 --> CM
CR --> CM
BP --> BM
CM --> K1
CM --> K2
K1 --> T1
K2 --> T2
위층의 의자 열 개가 모두 아래층의 의자 모양 하나를 가리킵니다. 모양은 한 번만 담기므로 의자를 더 놓아도 아래층은 커지지 않습니다.
레이 트레이싱을 지원하는 GPU 는 대개 이 상자 트리를 따라 내려가는 일과 삼각형 겹침 계산만 맡는 전용 회로를 갖고 있습니다. 「광선 하나가 지나가는 길」 그림의 「물체를 찾는다」와 「겹침 계산」이 이 회로의 몫입니다.
가속 구조는 파이프라인에 들어가지 않습니다. 물체가 움직이면 화면을 한 장 그릴 때마다 고쳐 지어야 하기 때문입니다. 그래서 광선을 쏠 때마다 자원으로 따로 넘깁니다.
자원은 셰이더가 읽고 쓰는 GPU 메모리 속 데이터입니다. 값을 늘어놓은 버퍼, 결과 색을 써넣을 이미지, 가속 구조가 모두 자원입니다.
파이프라인에 묶이는 것
레이 트레이싱 파이프라인을 만들 때 넘기는 것은 넷입니다. 셰이더들, 그 셰이더를 묶은 셰이더 그룹, 자원 배치, 재귀 깊이 한도입니다.
셰이더는 장면에서 쓰일 수 있는 것을 전부 넘깁니다. 광선이 어느 물체에 맞을지 모르므로 어느 셰이더든 곧바로 돌 수 있어야 합니다.
드라이버는 프로그램의 명령을 칩이 알아듣는 꼴로 바꿔 주는 소프트웨어입니다. 파이프라인을 만들 때 드라이버가 넘겨받은 셰이더 전부를 미리 기계어로 옮겨 둡니다. 앞에서 본, 느려서 실행 전에 한 번만 해 두는 일이 이것입니다.
적중에 관한 셰이더 셋은 한 물체 몫으로 묶어 다룹니다. 교차 · 임의 적중 · 최근접 적중 셰이더를 묶은 것이 적중 그룹(hit group)입니다. 거울 공의 적중 그룹에는 반사 광선을 쏘는 최근접 적중 셰이더 하나만 들어 있습니다. 필요 없는 셰이더는 빼 둡니다.
광선 생성 · 미스 · 호출 가능 셰이더는 하나가 곧 한 그룹입니다. 적중 그룹과 이 그룹들을 통틀어 셰이더 그룹이라고 부릅니다. 뒤에서 볼 연결표는 셰이더 하나하나가 아니라 이 그룹을 가리킵니다.
자원 배치는 셰이더가 읽고 쓸 자원마다 번호를 매겨 둔 표입니다. 셰이더는 가속 구조와 결과 이미지를 이 자원 번호로 찾습니다. GPU 를 다루는 API(Application Programming Interface, 응용 프로그램 인터페이스)에서는 이 자원 배치를 파이프라인 레이아웃이라고 부릅니다.
재귀 깊이
최근접 적중 셰이더가 다시 광선을 쏘면 광선 하나를 처리하는 도중에 광선이 또 쏘아집니다. 이렇게 광선을 처리하다가 광선을 다시 쏘는 것을 재귀라고 부릅니다. 거울 공 장면에서는 광선이 이렇게 두 번 이어서 쏘아집니다.
sequenceDiagram
participant 생성 as 광선 생성 셰이더
participant 공 as 거울 공 적중 셰이더
participant 바닥 as 바닥 적중 셰이더
생성->>공: 첫 광선이 거울 공에 맞는다
공->>바닥: 반사 광선이 바닥에 맞는다
바닥-->>공: 페이로드에 나뭇결 색을 적어 돌려준다
공-->>생성: 비친 바닥 색을 돌려준다
Note over 생성: 그 점의 색으로 쓴다
그림의 「적중 셰이더」는 둘 다 최근접 적중 셰이더입니다. 반사 광선을 쏜 거울 공 셰이더는 바닥 쪽 결과가 올 때까지 기다렸다가 이어서 돕니다.
광선을 다시 쏠 때마다 GPU 는 돌아올 곳과 페이로드를 쌓아 둘 메모리가 필요합니다. 거울 두 장을 마주 세우면 광선이 끝없이 튕길 수도 있습니다. 그래서 파이프라인을 만들 때 광선을 몇 번까지 거듭 쏠지 한도를 적습니다.
드라이버는 그 한도에 맞춰 메모리를 잡아 둡니다. 한도는 작게 잡을수록 메모리가 적게 듭니다.
한도를 넘겨 광선을 쏘면 결과를 믿을 수 없게 됩니다. 그래서 셰이더 쪽에서 거듭 쏜 횟수를 세다가 한도에 닿으면 더 쏘지 않게 적어 둡니다.
셰이더 바인딩 테이블
광선이 거울 공에 맞았을 때 GPU 는 어느 적중 그룹을 돌릴지 알아야 합니다. 이 답을 적어 둔 표가 셰이더 바인딩 테이블(shader binding table)입니다. 앞의 비유에서 번호와 담당자를 잇던 연결표가 이것입니다.
표의 한 칸에는 셰이더 그룹 하나를 가리키는 표식이 들어갑니다. 이 표식을 셰이더 그룹 핸들이라고 부릅니다. 핸들은 파이프라인을 만든 뒤 드라이버에게서 받아 옵니다.
칸에는 핸들 뒤에 그 물체가 쓸 값을 덧붙일 수도 있습니다. 거울 공의 칸에 반사율을 덧붙이는 식입니다.
표는 파이프라인 밖에 있는 GPU 메모리입니다. 그래서 파이프라인을 다시 만들지 않고 표만 고쳐 물체와 셰이더의 짝을 바꿀 수 있습니다.
표는 광선 생성 · 미스 · 적중 · 호출 가능의 네 구역으로 나뉩니다. 적중 구역만 표에서 찾는 것이 아닙니다. 처음 돌릴 광선 생성 셰이더도, 광선이 빗나갔을 때 부를 미스 셰이더도 GPU 는 저마다의 구역에서 찾습니다. 다른 셰이더가 호출 가능 셰이더를 부를 때는 호출 가능 구역에서 찾습니다.
적중 구역의 칸 번호는 광선이 맞은 물체의 번호와 광선의 종류로 셈합니다. 같은 물체라도 색을 보려는 광선과 그림자를 보려는 광선은 다른 셰이더를 불러야 합니다. 그림자 광선은 막혔는지만 알면 됩니다. 색을 계산할 까닭이 없습니다.
흔히 쓰는 배치는 물체마다 광선 종류 수만큼 칸을 이어 붙이는 것입니다. 물체 셋에 광선 종류가 둘(색 · 그림자)이면 표는 이렇게 놓입니다. 물체 번호와 광선 종류 번호는 0 부터 셉니다.
block-beta columns 2 RG["광선 생성 구역"]:2 MS["미스 구역"]:2 HT["적중 구역 · 6칸"]:2 H0["0번 칸 · 물체 0 · 색"] H1["1번 칸 · 물체 0 · 그림자"] H2["2번 칸 · 물체 1 · 색"] H3["3번 칸 · 물체 1 · 그림자"] H4["4번 칸 · 물체 2 · 색<br/>핸들 + 덧붙인 값"] H5["5번 칸 · 물체 2 · 그림자"] CL["호출 가능 구역"]:2
칸 번호는 물체 번호에 광선 종류 수를 곱하고 광선 종류 번호를 더한 값입니다. 물체 2 의 색 광선은 2 × 2 + 0 으로 4번 칸입니다. 물체와 광선 종류 가운데 어느 쪽이 늘어도 칸 수는 곱으로 커집니다.
한 번의 실행이 도는 순서
광선을 쏘라는 명령에는 광선 수와 셰이더 바인딩 테이블 네 구역의 위치를 함께 싣습니다. 화면이 가로 1920 점, 세로 1080 점이면 1920 × 1080 개를 쏘라고 시킵니다. 광선 생성 셰이더가 그만큼 동시에 돕니다. 저마다 자기 점을 맡습니다.
명령을 내리기 전에 쓸 파이프라인을 고릅니다. 가속 구조는 자원 배치에서 정한 자원 번호에 끼워 넘깁니다.
flowchart TD
subgraph P["레이 트레이싱 파이프라인 · 만들 때 굳는다"]
S["셰이더들 · 미리 기계어로 옮겨 둠"]
H["셰이더 그룹 · 적중 그룹 포함"]
L["자원 배치 · 재귀 깊이 한도"]
end
subgraph R["실행할 때마다 정한다"]
A["가속 구조 · 물체가 움직이면 고쳐 짓는다"]
T["셰이더 바인딩 테이블 · 네 구역의 위치"]
N["광선 수 · 가로 1920 × 세로 1080"]
end
P --> X["광선을 쏘라는 명령 한 번"]
R --> X
위쪽 상자에 든 것은 한 번 만들면 안 바뀝니다. 아래쪽 상자에 든 것은 명령마다 새로 고릅니다. 물체가 움직여도 파이프라인은 그대로 두고 가속 구조만 고쳐 짓습니다.
그래픽스 · 컴퓨트 파이프라인과의 차이
그래픽스 파이프라인은 도형을 받아 화면에 칠할 점의 색을 내놓습니다. 단계마다 쓸 셰이더가 하나씩 정해져 있습니다. 파이프라인을 고르는 순간 어느 셰이더가 돌지가 이미 정해집니다.
레이 트레이싱 파이프라인은 어느 셰이더가 돌지를 광선이 맞은 뒤에야 압니다. 이것이 둘을 가르는 가장 큰 차이입니다. 컴퓨트 파이프라인은 셰이더 하나를 수많은 값에 돌리는 것이 전부입니다.
| 그래픽스 파이프라인 | 컴퓨트 파이프라인 | 레이 트레이싱 파이프라인 | |
|---|---|---|---|
| 받는 것 | 도형의 꼭짓점 | 버퍼 같은 자원 | 가속 구조 |
| 돌 셰이더가 정해지는 때 | 파이프라인을 고를 때 | 파이프라인을 고를 때 | 광선이 맞은 뒤 |
| 담는 셰이더 수 | 단계마다 하나 | 하나 | 장면의 물체 종류만큼 |
| 실행 명령 | 그리기 | 디스패치 | 광선 쏘기 |
컴퓨트 파이프라인으로도 레이 트레이싱을 할 수 있습니다. 이때는 물체 찾기와 모든 물체의 처리를 셰이더 하나에 적어야 합니다. 물체 종류가 늘수록 그 셰이더 안의 분기가 늘어납니다.
레이 트레이싱 파이프라인은 이 분기를 물체별 셰이더로 쪼갭니다. 물체 찾기는 GPU 에 맡깁니다. 두 쪽에서 분기가 어디에 있는지 그리면 이렇습니다.
flowchart TD
subgraph CP["컴퓨트 파이프라인 · 셰이더 하나"]
A1["물체 찾기 · 맞은 물체에 따라 갈린다"]
A1 --> A2["거울 공 처리"]
A1 --> A3["바닥 처리"]
A1 --> A4["나머지 물체 종류마다 한 갈래씩"]
end
subgraph RP["레이 트레이싱 파이프라인"]
B1["GPU 가 물체를 찾는다"] --> B2["셰이더 바인딩 테이블"]
B2 --> B3["거울 공 셰이더"]
B2 --> B4["바닥 셰이더"]
end
CP ~~~ RP
API 마다 부르는 이름
레이 트레이싱 파이프라인을 따로 둔 API 는 Vulkan과 Direct3D 12입니다. Direct3D 12 는 이 기능을 DXR(DirectX Raytracing)이라고 부릅니다.
| Vulkan | Direct3D 12 | |
|---|---|---|
| 파이프라인 객체 | VkPipeline |
ID3D12StateObject |
| 만드는 호출 | vkCreateRayTracingPipelinesKHR |
CreateStateObject |
| 광선 쏘기 명령 | vkCmdTraceRaysKHR |
DispatchRays |
| 셰이더 안에서 광선을 쏘는 함수 | traceRayEXT |
TraceRay |
Vulkan 은 세 파이프라인을 모두 같은 VkPipeline 형으로 다룹니다. 파이프라인을 고를 때 어느
쪽인지를 함께 밝힙니다. Direct3D 12 는 그래픽스 · 컴퓨트 파이프라인과 다른 형인 상태 객체로
만듭니다.
Metal은 레이 트레이싱을 위한 파이프라인 종류를 따로 두지 않습니다. 기존 셰이더 안에서 광선을 쏩니다.
쓸 때와 안 쓸 때
백엔드 개발자가 이 파이프라인을 손으로 만들 일은 드뭅니다. 게임 엔진이 안쪽에서 만듭니다. 엔진은 물체 종류마다 적중 그룹을 둡니다. 그리고 화면을 한 장 그릴 때마다 광선을 쏩니다.
반사 · 그림자 · 전역 조명처럼 물체끼리 빛을 주고받는 모습을 그릴 때 씁니다. 전역 조명은 빛이 여러 물체에 튕기며 퍼진 밝기까지 셈하는 조명입니다. 빛이 아닌 것에도 씁니다. 소리가 벽에 튕기며 퍼지는 길을 찾는 계산도 광선을 쏘는 모양이라 이 파이프라인에 올릴 수 있습니다.
화면 전체를 처음 칠하는 일은 대개 래스터화가 맡습니다. 눈에서 곧장 보이는 물체만 찾을 때는 래스터화가 더 적은 계산으로 끝냅니다.
그래서 둘을 섞어 씁니다. 화면은 래스터화로 그립니다. 반사와 그림자만 광선으로 보탭니다.
광선이 막혔는지만 묻는 일이 전부일 때는 이 파이프라인이 무겁습니다. 앞에서 본 그림자 광선은 색 광선과 한 파이프라인에서 함께 쏠 때의 이야기입니다. 그림자만 따로 볼 때는 적중 셰이더도 연결표도 쓸 일이 없습니다. 이럴 때는 보통 셰이더 안에서 광선을 쏘아 결과를 곧바로 받는 레이 쿼리를 씁니다.
레이 트레이싱을 지원하지 않는 GPU 와 드라이버에서는 이 파이프라인을 만들 수 없습니다. 그런 기계에서는 컴퓨트 파이프라인으로 광선을 쏘거나 래스터화만으로 흉내 냅니다.
관련 항목
레이 트레이싱 파이프라인을 이루는 셰이더
광선 생성 셰이더 · 최근접 적중 셰이더 · 임의 적중 셰이더 · 미스 셰이더 · 교차 셰이더 · 호출 가능 셰이더 · 적중 그룹 · 셰이더 그룹
레이 트레이싱 파이프라인에 묶이는 설정과 값
파이프라인 레이아웃 · 재귀 깊이 · 광선 페이로드 · 셰이더 모듈 · 특수화 상수 · 파이프라인 라이브러리 · 파이프라인 캐시
광선이 물체를 찾을 때 따라가는 가속 구조
가속 구조 · BVH · BLAS · TLAS · AABB · 인스턴스
레이 트레이싱 파이프라인을 실행시키는 명령과 표
셰이더 바인딩 테이블 · 셰이더 그룹 핸들 · 커맨드 버퍼 · 큐 · 자원 · 디스크립터 세트
레이 트레이싱 파이프라인과 같은 종류로 묶이는 파이프라인 객체
그래픽스 파이프라인 · 컴퓨트 파이프라인 · 렌더 파이프라인 · 파이프라인 상태 객체
레이 트레이싱 파이프라인 대신 광선을 쏘는 수단
레이 쿼리 · 인라인 레이 트레이싱 · 컴퓨트 셰이더 · 소프트웨어 레이 트레이싱
레이 트레이싱과 맞세워지는 그리기 방식
래스터화 · Z 버퍼 알고리즘 · 화가 알고리즘 · 스크린 공간 반사 · 섀도 맵
레이 트레이싱 파이프라인으로 그리는 효과
반사 · 그림자 · 전역 조명 · 앰비언트 오클루전 · 패스 트레이싱 · 디노이징
레이 트레이싱 파이프라인을 제공하는 그래픽스 API
Vulkan · Vulkan 확장 · Direct3D 12 · DXR · Metal
레이 트레이싱 셰이더를 적는 셰이더 언어
레이 트레이싱 파이프라인이 속하는 상위 분류
다른 이름: ray tracing pipeline · raytracing pipeline · 광선 추적 파이프라인 · 레이트레이싱 파이프라인