스펙트럴 Ray Tracing 기술 도입
(larswander.com)- 스펙트럴 ray tracing은 RGB 값만 운반하는 광선 대신 파장과 위상까지 다뤄, 픽셀별 스펙트럼 전력 분포(SPD) 를 생성하는 방식임
- 일반적인 ray tracing은 성능을 위해 카메라에서 광원 방향으로 역추적하고, 광선을 RGB 벡터를 가진 입자처럼 단순화함
- 사람의 눈은 짧은·중간·긴 파장에 민감한 세 종류의 원추세포 반응으로 색을 만들며, 같은 색도 서로 다른 SPD에서 나올 수 있음
- 분산이나 얇은 막 간섭처럼 파장이 빛의 경로와 색에 영향을 주는 장면에서는 RGB 근사만으로 부족해질 수 있음
- JavaScript와 GLSL로 만든 무의존성 스펙트럴 ray tracer는 빛의 법칙을 일부러 바꾼 컴퓨터 아트에서 비현실적인 색과 움직임을 만드는 도구로 쓰임
코드로 만든 카메라와 ray tracing
- 컴퓨터 아트에서는 장면과 카메라를 모두 코드로 만들고, 렌더링 결과를 RGB 값 배열로 변환함
- ray tracing은 가상 객체 사이에서 광선을 튕기며, 시뮬레이션된 카메라와 광원 사이를 지나는 빛의 경로를 모델링함
- 성능 때문에 실제 빛의 이동을 그대로 추적하지 않고 여러 단순화를 사용함
- 대부분의 광원 광선은 카메라에 도달하지 않으므로, 광원에서 출발하지 않고 카메라 시점에서 역방향으로 추적함
- 이 역방향 추적은 빛의 전달 법칙이 시간 방향에 대해 대칭이라는 T-symmetry 가정 아래 물리적으로 타당함
- 더 큰 단순화는 광선을 파동이 아니라 RGB 색 벡터를 가진 입자처럼 다루는 방식임
- 빛의 파동성을 무시하지만, 많은 장면에서 물리적으로 그럴듯한 결과를 냄
- 사람 눈에 짧은·중간·긴 파장에 민감한 세 종류의 색 감지 세포가 있다는 점이 이 근사를 가능하게 함
눈은 RGB가 아니라 스펙트럼에 반응함
- 현실의 빛은 보통 단일 파장이 아니라 여러 파장이 섞인 스펙트럼 전력 분포(SPD) 로 구성됨
- 사람이 보는 하나의 색에는 수많은 SPD가 대응할 수 있으며, 이 현상은 metamerism이라고 불림
- 예를 들어 노란색은 약 580nm 부근의 단일 파장으로도 볼 수 있음
- 컴퓨터 모니터처럼 RGB만 사용하는 장치에서는 빨간색과 초록색 빛의 조합으로도 노란색을 재현함
- 마젠타처럼 단일 파장으로 만들 수 없는 비분광색도 있음
- 마젠타는 스펙트럼 위의 단일 위치에 있지 않음
- 낮은 파장과 높은 파장, 즉 파란색과 빨간색 빛의 조합이 필요함
- SPD를 색으로 바꾸는 과정은 수학적으로 처리 가능함
- 물리, 생리학, 주관적 색 경험을 잇는 정량적 연결이 존재함
- 이 연결은 1931년에 만들어진 CIE 1931 color spaces에 담겨 있음
- 직접 구현하려면 Physically Based Rendering의 색 관련 장을 참고할 수 있음
파장이 결과를 바꾸는 장면
- ray tracing에서 항상 전체 스펙트럼이나 개별 광선의 파장을 고려할 필요는 없음
- 다만 일부 장면에서는 빛의 파동적 성질이 경로에 직접 영향을 주고, 결과적으로 보이는 색도 달라짐
- 대표적인 예는 분산임
- 빛의 진행 경로가 파장에 따라 다르게 휘어짐
- 프리즘이 흰빛을 구성 주파수로 나누는 현상이 여기에 해당함
- 또 다른 예는 얇은 막 간섭(thin film interference) 임
- 비눗방울에서 보이는 무지개 같은 패턴을 설명함
- 비누 경계의 위쪽과 아래쪽 층에서 반사된 빛이 보강·상쇄 간섭을 일으킴
- 이 과정은 스펙트럼을 단일 파장으로 분리하기보다, 스펙트럼 일부의 기여를 키우거나 줄임
- 그 결과 청록, 틸, 마젠타, 갈색 같은 비분광색이 자주 만들어짐
스펙트럴 ray tracing이 다루는 것
- 스펙트럴 ray tracing은 빛의 파동적 성질을 고려하는 ray tracing임
- RGB 색으로만 세계를 계산하지 않고, 장면의 각 픽셀에 대해 스펙트럼 전력 분포를 생성함
- 광선의 파장과 위상을 함께 사용해, 이 정보가 중요한 상황에서 색을 더 잘 추정함
- 분산이나 얇은 막 간섭처럼 파장과 위상이 결과 색을 바꾸는 경우에 특히 유용함
컴퓨터 아트에서의 활용
- 최근 작업에서는 빛이 움직이는 법칙을 일부러 깨고, 현실과 조금 다른 우주의 카메라를 코드로 만드는 방식이 사용됨
- 전체 빛 스펙트럼의 풍부함을 다루면서, 빛 전달 규칙을 비현실적인 방식으로 바꿀 수 있음
- 공개된 출력물들은 손으로 작성한 무의존성 JavaScript 및 GLSL 스펙트럴 ray tracer로 생성됨
- 예시 작업에는 다음이 포함됨
- Light Doesn't Bend That Way #1, 2023
- 반사각을 파장의 함수로 만들어 생성됨
- 이 과정은 분광색만 생성하는 것처럼 보임
- Untitled, 2023
- FULL_SPECTRUM 시리즈를 위한 작업 중인 작품이며, 2023년 도쿄에서 공개됨
- Untitled, 2023
- Video 3로 제공됨
- 이 시스템에서 작품을 움직이게 만드는 과정이 특히 중요하게 다뤄짐
- Untitled, 2024
- Light Doesn't Bend That Way #1, 2023
댓글과 토론
Hacker News 의견들
-
직접 만들어 보고 싶다면 무료 전자책 Ray Tracing Gems II 1가 최신 API와 하드웨어 가속 기반 실시간 GPU 레이 트레이싱을 다루고, 스펙트럴 렌더링 장도 있음
특히 42장 “Efficient spectral rendering on the GPU for predictive rendering”이 해당됨1 https://www.realtimerendering.com/raytracinggems/rtg2/
-
아주 빠른 입문으로는 Ray Tracing in One Weekend 1도 추천하고, 이후 깊게 파고들고 싶다면 Physically Based Rendering [2]가 좋음
-
레이 트레이싱을 직접 만질 시간은 없지만 책 앞부분을 훑어보니 별칭 표본추출(alias sampling) 이 아주 우아하고 좋은 기법이었음
그래픽스보다 훨씬 넓은 맥락에서 유용하니 더 일찍 알았으면 좋았겠다는 생각이 듦
-
-
스펙트럴 레이 트레이서 예시로는 몇 가지가 있음
Mitsuba는 미분 가능 렌더링 같은 멋진 기능이 많은 오픈소스 연구용 렌더러임 https://www.mitsuba-renderer.org/
Maxwell은 정확도가 다른 두 가지 스펙트럴 모드가 있고, 더 복잡한 방식은 광학 쪽에서 자주 쓰임 https://maxwellrender.com/
Wētā FX의 Manuka는 스펙트럴 렌더러이며 여러 장편 영화에 쓰였음 https://dl.acm.org/doi/10.1145/3182161 및 https://www.wetafx.co.nz/research-and-tech/technology/manuka-
내부 구조를 보고 싶은데 대규모 프로덕션용은 너무 복잡하다면 이 구현을 들여다보는 걸 추천함
스펙트럴 경로 추적기의 최소 구성에 가까운 훌륭한 예시임 https://github.com/TomCrypto/Lambda -
Indigo Renderer와 오픈소스 LuxRender도 있음
-
-
내 생각에 스펙트럴 렌더링은 레이 트레이싱 자체가 렌더링의 종착점이 아니라 출발점에 가깝다는 좋은 예시임
가끔 실시간 레이 트레이싱으로 렌더링 문제가 해결됐다는 분위기를 보지만, 사실과는 거리가 멀다고 봄
대부분의 스펙트럴 렌더링 시스템은 얇은 막 간섭이나 다른 파동 기반 효과를 처리하지 않는 것으로 알고 있어서, 그쪽도 또 다른 개척지임
현실에는 놀랄 만큼 많은 디테일이 있음-
렌더링이 기저의 물리 원리에 가까워질수록 게임 엔진은 점점 세계 시뮬레이션 엔진이 될 것임
오늘날 흔히 나뉘어 있는 여러 엔진 구성요소가 공통 지점으로 수렴하면서, 예를 들어 물리 계층과 렌더링 계층의 구분이 줄어들게 될 수 있음
이런 흐름이 지금도 어느 정도 관찰되는지 궁금함
계산 성능이 몇 자릿수 더 커지고 나면, 현재의 추상화도 30년 전 최신 기술을 보듯 과거의 기술적 제약이 만든 형태로 보일 것임 -
프랙털 같아서 더 가까이 볼수록 우리가 보는 것에 영향을 주는 세부가 더 많이 드러남
100% 물리적으로 정확한 렌더링에 조금씩 다가가고 있지만, 아마 100%에는 도달하지 못하고 계속 작은 비율들을 더해 갈 것 같음 -
현실에는 놀랄 만큼 많은 디테일이 있다는 말에 더해, 구현하는 곳은 적지만 특정 장면에서 꽤 눈에 띄는 효과를 내는 것으로 빛의 편광1도 있음
-
-
훌륭한 스펙트럴 레이 트레이싱 엔진으로 LuxRender가 있음: https://luxcorerender.org/
단, 예전 버전 기준이고 최신 LuxCore 렌더러는 완전한 스펙트럴 지원이 없음
여기 나온 효과 외에도 스펙트럴 렌더링에는 장점이 더 있음
빛 추적 방식으로 구현하면 나중에 광원의 색, 스펙트럼, 세기를 바꿀 수 있고, 많은 장면에서 간접 조명도 훨씬 정확해짐 -
레이 트레이싱 구현을 가지고 놀고 싶다면 직접 작성하는 일이 의외로 쉬움
좋은 무료 책(https://raytracing.github.io/books/RayTracingInOneWeekend.ht...)이 있고, Unity를 조금 안다면 GPU 기반 튜토리얼(https://medium.com/@jcowles/gpu-ray-tracing-in-one-weekend-3...)도 좋음
Unity 버전은 장면 미리보기와 카메라 이동을 쉽게 해주는 GUI가 있어 만지기 더 편함
처음부터 쓰고 싶지 않다면 이런 자료를 기반으로 한 구현도 많지만, 직접 해볼 가치는 확실히 있음
기본 구현을 가지고 놀면서 광선을 입자처럼 움직이게 해 물체 쪽으로 또는 반대로 경로를 휘게 하거나, 마지막 반사 각도를 기억해 다음 재질 충돌에 쓰게 해봤음
대부분 결과는 별로였지만 보고 있는 대상에 대한 직관은 생겼고, 카메라를 살짝 움직여 보는 것도 큰 도움이 됨
작은 취미 프로그래밍 프로젝트로 정말 재미있음
단, 물체와 교차하면 광선 최대 길이를 작게 설정하고 그 지점에서 여러 광선을 주변으로 쏜 뒤 각 충돌에 중력 방정식과 비슷한 것을 적용하는 식임
물론 느리고 근사일 뿐이지만 쉽고, 장면 속 빛을 휘게 하는 블랙홀 객체 같은 것도 구현할 수 있음-
첫 레이 트레이서를 썼을 때 주말 내내 걸리지 않았고, 하룻밤에 작성한 C 코드 네 쪽 정도였음
http://canonical.org/~kragen/sw/aspmisc/my-very-first-raytra...
이후 Clojure와 Lua로 레이 트레이서를, JavaScript로 레이 행진기(ray marcher)를 만들었는데, 아주 작고 단순할 수 있음
어젯밤에는 mentor/TBC의 Spongy https://www.pouet.net/prod.php?which=53871를 봤는데, 안개가 있는 프랙털 애니메이션 레이 트레이서가 기계어 명령 65개로 되어 있고 MS-DOS 실행 파일은 128바이트임
레이 트레이싱 이미지가 워낙 멋지다 보니 이를 만드는 알고리즘과 자료구조도 매우 어려울 거라고 압도되기 쉬운데, 3차원 벡터를 이미 안다면 실제로는 꽤 단순함
SDF 레이 행진은 전통적인 Whitted 방식 레이 트레이서보다 더 단순하다고 느끼는데, 장면 기하와의 정확한 교차를 풀기 위한 복잡한 수학 대부분을 아주 단순한 순차 근사 알고리즘으로 대체하기 때문임
Spongy나 Oscar Toledo G.의 bootsector raytracer https://github.com/nanochess/RayTracer처럼 극도로 작은 레이 트레이서는 조금 더 큰 구현보다 오히려 이해하기 어려운 경우가 많음
그렇게 작게 만들려면 많은 트릭이 필요하고, 그 트릭이 단순한 코드보다 이해하기 어렵기 때문임
-
-
끝까지 가려면 각 광선의 파장뿐 아니라 편광과 위상도 추적해야 함
이런 속성이 실제 인간 지각에 영향을 주는 경우는 얇은 막이나 회절격자처럼 드물지만, 분명 존재함 -
수학과 물리학이 실제로 작동하는 아름다움이 보임
아름다움을 위해 넣은 일부 조정이 다른 시각화 방식에도 유용할 수 있을지 궁금함
Apple II에서 다성 음악을 만들려고 책의 코드를 베껴 치던 때도 떠오름
실행해 보니 분명 뭔가 잘못됐는데, 거친 잡음 대신 묘하게 아름다운 음 패턴이 나왔고, 그 우연한 실수가 꽤 매혹적이었음 -
초분광 이미지처럼 3채널을 훨씬 넘는 이미지를 만들 수 있지 않을까 싶음
아이들에게 색을 더 잘 가르치기 위해 스펙트럼을 강조하는 용도로 살펴본 적이 있음
예를 들어 이미지1 위에서 픽셀에 마우스를 올리면 스펙트럼을 보여줘 색과 스펙트럼의 연관을 강화하는 방식임
하지만 초분광 이미지는 드물고, 전통적으로 카메라[2]가 비쌌음
그렇다면 합성 초분광 이미지는 어떨까?
아주 낮은 해상도의 브라우저 렌더러라면 조명과 재질을 상호작용하며 가지고 놀 만큼 빠를 수도 있음
또 색각 이상, “백내장 수정체 제거 후 UV를 볼 수 있는” 인간, 이색형 비영장류 포유류(쥐/개), 사색형 제브라피시의 시점도 구현해 볼 수 있을 듯함1 http://www.ok.sc.e.titech.ac.jp/res/MSI/MSIdata31.html
[2] 시간 다중화된 협대역 조명을 쓰는 저렴한 다중분광 카메라: https://ubicomplab.cs.washington.edu/publications/hypercam/- 빛 추적을 쓰면 이를 효율적으로 구현할 수 있음
이미지의 최종값은 각 광원의 기여분을 변환한 값이고, 광원의 스펙트럼을 알고 있으니 픽셀의 스펙트럼도 가질 수 있음
다만 유의미한 분산이나 얇은 막 효과를 만나면 각 경로마다 파장을 표본추출해야 해서, 더 근사적인 방식이 됨
- 빛 추적을 쓰면 이를 효율적으로 구현할 수 있음
-
내 분포 레이 트레이서에 굴절을 구현해 볼까 생각 중이었음
확률적 방식이지 병렬 방식은 아님 https://en.m.wikipedia.org/wiki/Distributed_ray_tracing
주파수를 무작위로 표본추출하고 그 색을 계산한 뒤 광선 색을 조절하는 데 쓰면 될 것 같음
순수 굴절 색이 밝기의 1/3이 되는 것을 보정하려면 결과에 3을 곱해야 함- “분포 레이 트레이싱”이라는 용어는 Whitted 레이 트레이싱에서 오늘날의 경로 추적(path tracing) 으로 진화하던 중간 시점의 표현에 가까웠던 것 같음
기억하기로는 Rob Cook의 SIGGRAPH 논문 중 하나에서 나온 용어임
더 일반적이고 통합된 개념으로는 경로 추적 쪽으로 옮겨 가는 게 좋고, 검색하거나 조사할 때 팁과 기법을 찾기도 쉬움
스펙트럴 렌더링과 굴절을 결합할 때는 분포를 표본추출해 주파수를 골라야 하는 게 맞음
일반적으로는 까다로울 수 있으니 단계적으로 쌓아 가는 편이 좋음
반사도 마찬가지지만, 두 경우 모두에서 주파수 의존 재질을 쓸지는 선택에 달려 있음
단순화된 재질을 쓰더라도 스펙트럴 방식을 쓸 이유는 여전히 있음
- “분포 레이 트레이싱”이라는 용어는 Whitted 레이 트레이싱에서 오늘날의 경로 추적(path tracing) 으로 진화하던 중간 시점의 표현에 가까웠던 것 같음