TrueTrace: 고성능 Compute Shader 기반 Unity Pathtracer
요약
TrueTrace는 고성능 Compute Shader 기반으로 Unity에서 인터랙티브 패스 트레이싱을 구현한 프로젝트입니다. RT 코어 유무와 관계없이 작동하며, Disney BSDF, ReSTIR GI 등 다양한 고급 기능을 지원합니다. Built-in, HDRP, URP를 모두 지원하여 광범위하게 활용 가능합니다.
핵심 포인트
- RT 코어 없이도 고성능 패스 트레이싱 구현
- Disney BSDF 및 ReSTIR GI 등 고급 렌더링 기능 제공
- Built-in, HDRP, URP 등 다양한 Unity 파이프라인 지원
- 다양한 디노이징(ASVGF/OIDN) 및 샘플링 기법 적용
TrueTrace: 고성능 Compute Shader 기반 Unity Pathtracer

하드웨어 사양에 관계없이 누구나 Unity에서 인터랙티브 패스 트레이싱을 경험할 수 있도록 목표로 진행해 온 열정적인 프로젝트입니다.
Discord 서버: https://discord.gg/4Yh7AZuhcD
데모: https://drive.google.com/file/d/1moYUEW5wUuqavgsFLSbgZLzVnMvBjBnl/view?usp=sharing
기능 (Features):
<ul> <li>RT 코어 없이 고성능 Compute Shader 기반 패스 트레이싱</li> <li>고성능 소프트웨어 RT(RT 코어 없음)를 위한 압축 Wide Bounding Volume Hierarchy</li> <li>특정 GPU 벤더가 필요하지 않음 (원한다면 통합 그래픽으로 실행 가능, 즉 RTX 코어가 필요하지 않음)</li> <li>최신 카드용 하드웨어 RT 지원</li> <li>재질을 위한 전체 Disney BSDF</li> <li>복잡한 발광(emissive) 메시에 대한 전체 지원</li> <li>런타임 오브젝트 변환, 추가 및 제거</li> <li>런타임 수정 가능한 재질</li> <li>실시간 디노이징을 위한 ASVGF</li> <li>오프라인 디노이징을 위한 OIDN</li> <li>PBR 텍스처 지원</li> <li>다중 중요도 샘플링(Multiple Importance Sampling)을 사용한 다음 이벤트 추정(Next Event Estimation)</li> <li>다음 이벤트 추정을 위한 구면 가우시안 라이트 트리 또는 Light BVH</li> <li>모든 기본 Unity 라이트 지원 (다음 이벤트 추정 사용)</li> <li>Bloom, Depth of Field, AutoExposure, TAA, Tonemapping</li> <li>하늘을 위한 사전 계산된 다중 대기 산란(Precomputed Multiple Atmospheric Scattering)</li> <li>오브젝트 인스턴싱 (RT 코어 없이)</li> <li>ReSTIR GI (복잡한 구현)</li> <li>간단한 업스케일링 기능</li> <li>Built-in, HDRP, URP를 지원</li> <li>전체 스킨 메시 지원</li> <li>변형 가능한 표준 메시 지원</li> <li>Unity 높이맵 지형 및 높이맵 트리 지원</li> <li>환경 맵 중요도 샘플링 (Environment Map Importance Sampling)</li> <li>Radiance Cache</li> <li>재질 프리셋 시스템</li> <li>효율적인 파노라마 렌더링</li> <li>스포트라이트를 위한 IES</li> <li>True Bindless texturing (Meetem 덕분에)</li> </ul> <li>Convolution Bloom (직접 구현하지 않음)</li> <li>Vulkan 및 Metal 지원 (환경에 따라 다를 수 있음)</li> <li>SDF를 사용한 메쉬 슬라이싱 (메쉬 자체는 수정하지 않고, 단면(cross-sections)처럼 렌더링 커트용임)</li> <li>Lambert 또는 EON 확산 모델</li> <li>색수차(Chromatic Aberation), 채도(Saturation), 색상 비네팅(Colored Vignette)</li> <li>전체 다중 산란 안개(Full Multiscatter Fog) (실시간 아님)</li> <li>정투영 카메라 지원(Orthographic Camera Support)</li> <li>빠르지만 실시간은 아닌 카스틱을 위한 포톤 매핑(Photon Mapping)</li> <li>애니메이션 가능한 재질 속성(Animatable Material Properties)</li> </ul>Unity에 bindless textures를 도입해 준 Alex Bakanov (AKA Meetem)에게 진심으로 감사드립니다!
<br>Ylitie et al<br>ebruneton<br>Convolutional Bloom<br>Spherical Gaussian Light Tree<br>Light BVH (PBRT 4)<br>vMF 확산 모델<br>EON 확산 모델<br>URP 호환 스크립트 영감<br>색수차(Chromatic Aberation)<br>대비/채도(Contrast/Saturation)<br>비네팅 기본<br>비네팅 색상
제가 하는 작업이 마음에 드시고 저나 이 프로젝트를 지원하고 싶으시다면, Github Sponsor 또는 patreon.com/Pjbomb2에서 후원자(Patron)가 되어주시는 것을 고려해 주세요! 이렇게 하면 제가 이것을 모두에게 무료로 유지할 수 있습니다!
버그, 아이디어 또는 프로젝트에 대한 생각을 가지고 계신 경우, 위에 있는 디스코드 서버나 twitter를 통해 저에게 연락하시는 것이 가장 쉽습니다!
첫 설치 시 주의사항 (First Install Note)
<ul> <li>TrueTrace를 처음 설치한 후에는 바인드리스 플러그인(bindless plugin)이 제대로 초기화되도록 유니티 프로젝트를 한 번 재시작해야 합니다.</li> </ul>새 오브젝트 추가하기 (Adding new objects)
자동 방식 (Automatic methods)
<ul> <li>먼저, 게임 오브젝트들을 TrueTrace가 생성한 "Scene" 게임 오브젝트의 자식으로 추가합니다.</li> <li>전역 설정: TrueTrace 설정 메뉴에서 "Auto Assign Scripts"를 누릅니다.</li> <li>로컬 설정: TrueTrace 설정 메뉴에서 "Hierarchy Options"로 이동합니다. </li> <li>추가한 루트 게임 오브젝트를 "Selective Auto Assign Scripts" 섹션으로 드래그합니다.</li> <li>"Selective Auto Assign"를 클릭합니다.</li> </ul> <br>수동 방식 (Manual method)
<ul> <li>먼저, 메쉬(mesh)를 포함하는 각 게임 오브젝트에 "RayTracingObject" 스크립트를 추가해야 합니다. (이는 개별 메쉬의 재질을 추적합니다.)</li> <li>스킨이 없는 메쉬의 경우: </li> <ul> <li>다음 중 하나에 "ParentObject" 스크립트를 추가합니다:</li> <ul> <li>"RayTracingObject" 스크립트가 있는 각 게임 오브젝트</li> <li>또는</li> <li>"RayTracingObject" 스크립트가 있는 게임 오브젝트들의 직접적인 부모(Direct Parent) 게임 오브젝트 (메쉬들을 그룹화하여 성능을 향상시킵니다)</li> </ul> </ul> <li>스킨이 적용된 메쉬의 경우:</li> <ul> <li>RayTracingObjects의 모든 부모 게임 오브젝트 (모든 스킨 자식(Skinned Children)들을 그룹화합니다)</li> </ul> <li>기본 유니티 라이트(default unity lights)의 경우, 각 라이트에 "RayTracingLight" 스크립트를 추가하기만 하면 됩니다.</li> </ul>일반 사용/참고 사항
<ul> <li>DX12를 사용하는 것이 권장됩니다. DX12는 OIDN, Bindless texturing, RT Cores 및 더 높은 성능을 사용할 수 있게 합니다.</li> <li>렌더링할 카메라에 RenderHandler 스크립트를 부착합니다 (MainCamera 태그가 지정된 카메라가 있는 경우 자동으로 처리됩니다).</li> <li>녹색/빨간색 사각형은 가속 구조(acceleration structure) 빌드가 완료되었는지 여부를 보여줍니다. 빨간색은 아직 완료되지 않았음을 의미하고, 녹색은 빌드가 완료되었음을 의미합니다. 15초 이상 걸릴 경우 알림음이 울립니다 (Truetrace Settings -> Functionality Settings에서 설정).</li> <li>객체는 계층 구조(hierarchy)에서 ParentObject 스크립트를 사용하여 연결된 GameObject를 켜고 끄기만 하면 자유롭게 추가 및 제거할 수 있습니다 (복잡한 자식 객체를 가진 부모 객체를 클릭하면 지연될 수 있음). 하지만 가속 구조가 재빌드되어야 하므로 나타나는 데 시간이 걸립니다.</li> <li>Emissive 메시(Emissive meshes)는 NEE와 함께 작동하려면 빌드 또는 재빌드 시 0이 아닌 emissive 값을 가져야 하지만, 그 이후에는 임의로 emissiveness를 변경할 수 있습니다.</li> <li>DEFAULT BIRP 머티리얼을 사용하여 PBR을 설정하려면 모든 텍스처가 올바른 이름에 들어가야 하며, Roughness는 Occlusion 텍스처에 들어갑니다 (이는 MaterialPairing 메뉴에서 변경 가능합니다).</li> <li>스킨된 메시(skinned mesh)의 지오메트리(geometry)를 변경하기 위해 블렌드셰이프(blendshapes)를 사용하는 경우, 해당 객체의 임포트 설정(inspector)으로 이동하여 Legacy Blendshape Normals를 끄고 모든 노멀(normals)이 계산(calculated)된 것이 아니라 임포트(imported)되었는지 확인해야 합니다. 그렇지 않으면 블렌드셰이프의 노멀이 잘못될 수 있습니다.</li> <li>HDRIs 또는 스카이박스용 CubeMaps를 사용하는 경우, 이미지 인스펙터에서 Texture2D 형식으로 포맷해야 합니다. Unity가 자동으로 변환할 것이며, 이후 TrueTrace 설정 메뉴의TT Material 애니메이션
<ul> <li>truetrace material의 속성을 애니메이션하려면, RayTracingObject와 동일한 게임 오브젝트에 "MaterialAnimationView" 스크립트를 추가해야 합니다.</li> <li>다음으로, 새로 추가된 스크립트의 드롭다운 메뉴에서 대상 서브머티리얼을 선택해야 합니다.</li> <li>마지막으로, SelectedMaterial 속성을 애니메이션하여 모든 머티리얼 속성을 애니메이션할 수 있습니다.</li> </ul>URP 설정
<ul> <li>현재 사용 중인 렌더러에 renderfeature로 URPTTInjectPass를 추가해야 합니다 (이름은 Camera에서 확인할 수 있습니다).</li> </ul>비표준 이미지 생성
<ul> <li>계층 구조의 모든 게임 오브젝트에 "TTAdvancedImageGen" 스크립트를 첨부하고 원하는 설정을 채우면 됩니다.</li> </ul>인스턴싱 사용
<ul> <li>HWRT와 함께 사용하려면 unity 6000.0.31f1 이상이 필요하며, 그렇지 않으면 SWRT에서만 작동합니다.</li> <li>먼저, 인스턴스화된 객체의 소스가 될 모든 오브젝트는 InstancedStorage 아래에 위치해야 하며 단일 동적 오브젝트로 배열될 수 있습니다 (ParentObject와 RayTracingObject 스크립트 모두 메시가 있는 동일한 게임 오브젝트에 배치).</li> <li>그런 다음, 객체를 인스턴스화하려면 Scene GameObject 아래에 InstanceObject 스크립트가 첨부된 게임 오브젝트만 있으면 되고, 원하는 객체 인스턴스를 계층 구조에서 InstanceObject 스크립트의 Instance Parent 슬롯으로 드래그하면 됩니다.</li> </ul>TrueTrace에 셰이더 텍스처 연결하기
<ul> <li>이 작업은 머티리얼(material)마다 할 필요 없이, 셰이더(SHADER)당 한 번만 수행하면 됩니다. 설정되지 않은 셰이더는 truetrace에서 흰색으로 나타날 것입니다.</li> <li>PathTracingSettings에서 "Material Pair Options"이라는 탭을 클릭합니다.</li> <li>원하는 셰이더를 가진 머티리얼을 해당 슬롯에 드래그합니다.</li> <li>여기서 3개의 버튼이 보일 것이니, 이 버튼들을 클릭하여 입력 유형(input type)을 추가하고 출력 탭(output tab)에 연결합니다. 예를 들어 기본 셰이더를 사용하는 아무 머티리얼로 이 작업을 수행해 보세요.</li> <li>이 작업이 완료되면 "Apply Material Links"를 클릭하고, "Main Options" 탭에서 BVH를 재구축하여 장면의 오브젝트들을 업데이트합니다.</li> </ul>AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub ML Hardware의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기