CURVED LIGHT
warp_dq[] cube proxy seg[] attenuation Dual Quaternion cluster light
Rendering System · Curved Light

Curved Light
via Warped Cube Proxies

입력 커브를 warped cube proxy 체인으로 변환하여 기존 라이트 파이프라인 안에서 실시간 비직선형 광원을 렌더링하는 방식

Dual Quaternion Cube Proxy Forward Forward+ / Deferred+
scroll

처리 파이프라인

입력 커브는 직접 픽셀 단계에서 해석하지 않습니다. GPU가 처리하는 대상은 커브 자체가 아니라, 곡선을 근사하는 다수의 warped cube proxy 집합입니다.

curve
원본 spline
seg[]
선형 세그먼트
T / B / N
로컬 프레임
warp_dq[]
DQ transform
cube[]
proxy volume
// 변환 흐름
curveseg[]tangent[] + bitangent[] + normal[]
              → warp_dq[] + cube[]

Curved Light는 "curve light"가 아닌 "curve-generated warped cube light set"으로 해석합니다.

커브 분할

입력 커브는 일정 거리 또는 적응형 거리 기준으로 분할됩니다. 세그먼트 수가 많을수록 원본 곡선에 가까워지며, 적을수록 비용이 감소합니다.

시작점 / 끝점
float3 start, end
길이
float length
중심 위치
float3 center
영향 반경
float radius
방향 벡터
float3 direction

로컬 프레임

각 세그먼트에는 직교 프레임이 생성됩니다. 이 프레임은 cube proxy의 방향 정렬과 로컬 라이팅 좌표계의 기준이 됩니다.

Tangent
진행 방향 — 세그먼트의 이동 방향
Normal
법선 — Tangent에 수직인 주축
Bitangent
이중 접선 — T × N 외적으로 결정
Frame Continuity — 인접 세그먼트 사이의 연속성이 중요합니다. frame flip이나 twist를 최소화하는 안정적인 생성 방식이 권장됩니다.

Dual Quaternion 기반 변환

세그먼트의 위치와 회전을 표현하기 위해 Dual Quaternion 기반 transform을 구성합니다. 기본 cube mesh를 곡선 경로를 따라 자연스럽게 배치할 수 있습니다.

🔄
회전 + 이동 결합
단일 DQ 구조로 회전과 이동을 동시에 표현합니다.
안정적인 Rigid Transform
행렬 보간 대비 왜곡이 감소합니다. 선형 보간에서도 안정적인 결과를 냅니다.
세그먼트 연결부 처리
인접 세그먼트 방향 변화를 자연스럽게 표현합니다.
// Dual Quaternion 구성
dq = q_rot + ε · q_trans

// q_rot : 세그먼트 로컬 프레임 회전
// q_trans : 세그먼트 중심 위치 이동

Proxy Cube Chain

각 세그먼트는 하나의 cube volume으로 표현됩니다. 이 cube는 광원 형상이 아니라 영향 범위를 나타내는 라이트 볼륨입니다.

seg 0 seg 1 seg 2 seg n-2 seg n-1 seg n

Cube 크기 결정 요소

세그먼트 길이
cube의 Z축 길이를 결정
광원 반경
cube의 X·Y 크기를 결정
감쇄 범위
영향 볼륨의 외곽 확장
쿠키 투영 여유
패턴 투영 클리핑 방지 마진

조명 평가 함수

각 cube proxy 내부 픽셀은 해당 cube의 로컬 공간에서 평가됩니다. 렌더링 파이프라인과 무관하게 동일한 함수를 사용합니다.

01
Distance Attenuation
로컬 축 기준 캡슐 형태 감쇄를 계산합니다.
  • 중심축 — 최대 광량
  • 반경 외곽 — 점진적 감소
  • tube light 유사 분포
03
Shadow Term
엔진의 local light shadow 시스템과 결합 가능합니다.
  • 기존 shadow map 파이프라인 연동
  • per-proxy shadow 또는 공유 shadow

렌더링 통합 방식

핵심은 "cube proxy를 어떻게 렌더링 파이프라인에 넣는가"이며, 파이프라인에 따라 방식이 달라집니다. 단, cube가 광원 표현 단위라는 점은 동일합니다.

Forward 직접 Additive 드로우
1warped cube proxy mesh를 직접 드로우
2해당 픽셀에 조명 additive 누적
3광원 수만큼 draw call 또는 instancing
Forward+ / Deferred+ Clustered Enumeration
1cube bounds를 tile / cluster에 등록
2화면 타일별 영향 cube 목록 생성
3픽셀 shading 시 목록 순회하며 누적

성능 특성

세그먼트 수는 품질과 성능을 동시에 결정하는 핵심 파라미터입니다.

Preprocess / Update
curve segmentation
local frame 생성
warp DQ 생성
cube proxy 갱신
Runtime (Forward+ / Deferred+)
cluster build cost
light list traversal
shading accumulation
overdraw (Forward)

장점

고려사항

세그먼트 밀도 LOD — 곡선 근사 정밀도와 렌더링 비용을 동시에 결정하므로, 장면 조건에 맞는 LOD 제어가 중요합니다.
급곡률 Subdivision — 급곡률 구간은 추가 subdivision을 적용하면 형태 정확도와 조명 연속성을 효과적으로 유지할 수 있습니다.
클러스터 등록 비용 — Forward+ / Deferred+ 환경에서 세그먼트 수 증가에 따라 클러스터 등록 및 light list 관리 비용이 함께 증가할 수 있습니다.
연결부 조도 연속성 — 세그먼트 연결부에서는 감쇄 함수와 쿠키 투영 결과에 따라 조도 연속성 보정이 필요할 수 있습니다.
핵심 요약

Curved Light는 입력 커브를 다수의 warped cube proxy로 변환하여 렌더링하는 시스템입니다.

Forward에서는 cube volume을 직접 additive 드로우하고, Forward+ / Deferred+에서는 cube proxy를 클러스터링하여 enumerative additive 방식으로 처리합니다.

커브는 제작 데이터이며, 실제 GPU 렌더링 단위는 warped cube light volumes입니다.