OptiX
| 개발자 | 엔비디아 |
|---|---|
| 안정화 버전 | 9.0
/ 2025년 2월 |
| 저장소 |
|
| 프로그래밍 언어 | C / C++ |
| 엔진 | |
| 운영 체제 | 리눅스, OS X, 윈도우 7 이상 |
| 종류 | 광선 추적 |
| 라이선스 | 사유 소프트웨어, 상업용 무료 |
| 웹사이트 | Nvidia OptiX 개발자 사이트 |
OptiX는 2009년경 처음 개발된 광선 추적 API이다.[1] 계산은 CUDA와 함께 도입된 저수준 또는 고수준 API를 통해 GPU로 오프로드된다. CUDA는 엔비디아의 그래픽 제품에서만 사용할 수 있다. 엔비디아 OptiX는 엔비디아 게임웍스의 일부이다. OptiX는 고수준 또는 "알고리즘 중심" API로, 광선 추적 자체만이 아니라 광선 추적이 포함된 전체 알고리즘을 캡슐화하도록 설계되었다. 이는 OptiX 엔진이 애플리케이션 측 변경 없이 더 큰 알고리즘을 매우 유연하게 실행할 수 있도록 하기 위함이다.
일반적으로 비디오 게임은 렌더링에 광선 추적 대신 래스터화를 사용한다.
엔비디아에 따르면, OptiX는 "절차적 정의 및 하이브리드 렌더링 방식"에 충분히 유연하도록 설계되었다. 컴퓨터 그래픽스 렌더링 외에도 OptiX는 광학 및 음향 설계, 방사선 및 전자기파 연구,[2] 인공지능 쿼리 및 충돌 분석에도 도움이 된다.[3]
OptiX를 사용한 광선 추적

OptiX는 사용자가 제공한 지침(CUDA 커널 형식)을 사용하여 특정 상황에서 광선이 완전한 추적 프로세스를 시뮬레이션하기 위해 무엇을 해야 하는지 작동한다.[4]
광선(또는 다른 종류의 광선)은 다른 표면이 아닌 특정 표면에 부딪힐 때 다른 동작을 할 수 있으며, OptiX는 사용자 제공 프로그램으로 이러한 히트 조건을 사용자 지정할 수 있도록 한다. 이 프로그램은 CUDA C 또는 직접 PTX 코드로 작성되며 OptiX 엔진에서 사용할 때 함께 연결된다.
OptiX를 사용하려면 시스템에 CUDA 지원 GPU가 있어야 하며 CUDA 툴킷이 설치되어 있어야 한다.
광선 추적 애플리케이션에서 OptiX 엔진을 사용하는 것은 일반적으로 다음 단계를 포함한다.
- 광선 생성 프로그램(예: 광선은 평행하게, 원근법 방식으로 또는 기울기 필드처럼 발사될 수 있다), 광선 누락(광선이 어떤 객체와도 교차하지 않을 때), 선택적 예외 프로그램(어떤 이유로 광선이 발사될 수 없을 때), 경계 상자 프로그램(주어진 객체에 대한 경계 상자 교차 테스트를 제공하는 프로그램) 및 교차 프로그램에 대한 프로그램 정의.
이러한 프로그램에 대한 몇 가지 예는 프로그램의 SDK와 함께 제공된다.
// Sample code using OptiX APIs //
/* Ray generation program */
rtProgramCreateFromPTXFile( *context, path_to_ptx, "pinhole_camera", &ray_gen_program );
rtContextSetRayGenerationProgram( *context, 0, ray_gen_program );
/* Miss program */
rtProgramCreateFromPTXFile( *context, path_to_ptx, "miss", &miss_program );
rtContextSetMissProgram( *context, 0, miss_program );
/* Bounding box and intersection program */
rtProgramCreateFromPTXFile( context, path_to_ptx, "box_bounds", &box_bounding_box_program );
rtGeometrySetBoundingBoxProgram( *box, box_bounding_box_program );
rtProgramCreateFromPTXFile( context, path_to_ptx, "box_intersect", &box_intersection_program );
rtGeometrySetIntersectionProgram( *box, box_intersection_program );
경계 상자 프로그램은 kd-트리 또는 경계 볼륨 계층과 같은 가속 구조 내에서 광선 추적 프로세스를 가속화하는 데 사용되는 경계 볼륨을 정의하는 데 사용된다.
- 재료 히트 및 가장 가까운 히트 프로그램 생성: 이 두 프로그램은 광선이 첫 번째 교차(가장 가까운 히트) 또는 일반적인 교차(모든 히트)를 만날 때의 광선 동작을 결정한다.
// Sample code using OptiX APIs //
rtProgramCreateFromPTXFile( context, path_to_ptx, "closest_hit_radiance", &closest_hit_program );
rtProgramCreateFromPTXFile( context, path_to_ptx, "any_hit_shadow", &any_hit_program );
/* Associate closest hit and any hit program with a material */
rtMaterialCreate( context, material );
rtMaterialSetClosestHitProgram( *material, 0, closest_hit_program );
rtMaterialSetAnyHitProgram( *material, 1, any_hit_program );
- 제공된 프로그램 내에서 사용될 수 있는 버퍼, 변수 정의. 버퍼는 호스트 코드(즉, 일반 CPU 코드)가 장치 코드(즉, GPU에서 실행되는 코드)와 통신하고 그 반대로도 통신할 수 있는 메모리 영역이다. 변수는 OptiX가 데이터를 주고받기 위해 버퍼를 통신하고 사용하는 내부 방식이다.
- 기하학적 객체, 그룹, 셀렉터 및 기타 노드의 OptiX 계층을 정의하여 렌더링될 전체 장면의 트리 그래프를 생성한다.
복잡한 장면을 렌더링하거나 어떤 광선에 대해 다른 경로를 추적하기 위해 OptiX는 엔비디아 CUDA 플랫폼을 활용하여 GPGPU 컴퓨팅을 활용한다. 광선 발사 및 동작 설정 프로세스는 고도로 사용자 정의가 가능하므로 OptiX는 광선 추적 외에도 다양한 다른 응용 프로그램에서 사용될 수 있다.
OptiX Prime
OptiX 3.5.0부터 OptiX Prime이라는 두 번째 라이브러리가 번들에 추가되었는데, 이는 광선 추적을 위한 빠르고 저수준의 API를 제공하는 것을 목표로 한다. 즉, 가속 구조 구축, 가속 구조 탐색 및 광선-삼각형 교차를 포함한다. Prime은 또한 시스템에서 호환되는 GPU를 찾을 수 없을 때 CPU 폴백 기능을 제공한다. OptiX와 달리 Prime은 프로그래밍 가능한 API가 아니므로 사용자 정의 비삼각형 프리미티브 및 셰이딩에 대한 지원이 부족하다. 프로그래밍이 불가능하기 때문에 OptiX Prime은 광선 추적이 포함된 전체 알고리즘을 캡슐화하지 않는다. 따라서 Prime은 새로운 GPU를 위해 알고리즘을 다시 컴파일하거나, 성능을 위해 계산을 재구성하거나, Quadro VCA와 같은 네트워크 어플라이언스를 사용할 수 없다.
OptiX를 사용하는 소프트웨어
- 블렌더는 버전 2.81(2.92에서는 7.1)부터 OptiX를 지원한다.[5]
- 블렌더 애드온 D-NOISE는 AI 가속 디노이징을 위해 OptiX 바이너리를 사용한다.[6]
- SIGGRAPH 2011에서 어도비는 모션 그래픽을 위한 GPU 광선 추적 기술 데모에서 OptiX를 선보였다.[7]
- SIGGRAPH 2013에서 OptiX는 픽사의 실시간 GPU 기반 조명 미리 보기 도구에 소개되었다.
- OptiX는 PhysX 및 기타 CUDA 기반 그래픽 엔진 및 프레임워크와 함께 게임웍스 개발자 라이브러리에 통합되었다.[8]
- 어도비 애프터 이펙트 CC[9]
- Daz Studio는 Iray 통합 이후 OptiX Prime 가속을 지원했지만, 버전 4.12.1.8에서는 지원이 제거되었다.[10]
- Luxrender 2.5: 최대 600% 가속[11]
같이 보기
각주
- ↑ “Scheduling in OptiX, the Nvidia ray tracing engine” (PDF). 2009년 8월 15일.
- ↑ Felbecker, Robert; Raschkowski, Leszek; Keusgen, Wilhelm; Peter, Michael (2012). 〈Electromagnetic wave propagation in the millimeter wave band using the NVIDIA OptiX GPU ray tracing engine〉. 《2012 6th European Conference on Antennas and Propagation (EUCAP)》. IEEE Xplore. 488–492쪽. doi:10.1109/EuCAP.2012.6206198. ISBN 978-1-4577-0920-3. S2CID 45563615.
- ↑ Steven G. Parker; Heiko Friedrich; David Luebke; Keith Morley; James Bigler; Jared Hoberock; David McAllister; Austin Robison; Andreas Dietrich; Greg Humphreys; Morgan McGuire; Martin Stich (2013). 《Magazine Communications of the ACM - GPU ray tracing》. 《Communications of the ACM》 56 (ACM). 93–101쪽. doi:10.1145/2447976.2447997. S2CID 17174671. 2013년 8월 14일에 확인함.
- ↑ Steven G. Parker; James Bigler; Andreas Dietrich; Heiko Friedrich; Jared Hoberock; David Luebke; David McAllister; Morgan McGuire; Keith Morely; Austin Robison; Martin Stich (2010). 《OptiX: a general purpose ray tracing engine》. 《ACM Transactions on Graphics》 29 (ACM). 66:1–66:13쪽. doi:10.1145/1778765.1778803. 2013년 8월 14일에 확인함.
- ↑ “Blender 2.81 Benchmarks On 19 NVIDIA Graphics Cards - RTX OptiX Rendering Performance Is Incredible”. phoronix.com. 2019. 2019년 11월 26일에 확인함.
- ↑ “D-NOISE: Rapid AI Denoising for Blender”. 《Remington Creative》. 2019년 7월 20일. 2019년 12월 14일에 확인함.
- ↑ “Adobe showcasing OptiX in a technology demo for ray tracing motion graphics with GPUs”. NVIDIA. 2013. 2011년 8월 17일에 원본 문서에서 보존된 문서. 2013년 8월 14일에 확인함.
- ↑ “Nvidia announces Gameworks Program at Montreal 2013; supports SteamOS”. NVIDIA. 2013. 2013년 11월 1일에 원본 문서에서 보존된 문서. 2013년 10월 29일에 확인함.
- ↑ “GPU changes (for CUDA and OpenGL) in After Effects CC (12.1) | After Effects region of interest”. 2015년 2월 22일에 확인함.
- ↑ “Daz Studio Changelog”. 《DAZ 3D》. 2019년 12월 14일에 확인함.
- ↑ “New Features in v2.5 – LuxCoreRender”.
외부 링크
- 스크립트 오류가 있는 문서
- 위키데이터 속성 P18을 사용하는 문서
- 위키데이터 속성 P41을 사용하는 문서
- 위키데이터 속성 P94를 사용하는 문서
- 위키데이터 속성 P117을 사용하는 문서
- 위키데이터 속성 P154를 사용하는 문서
- 위키데이터 속성 P213을 사용하는 문서
- 위키데이터 속성 P227을 사용하는 문서
- 위키데이터 속성 P242를 사용하는 문서
- 위키데이터 속성 P244를 사용하는 문서
- 위키데이터 속성 P245를 사용하는 문서
- 위키데이터 속성 P268을 사용하는 문서
- 위키데이터 속성 P269를 사용하는 문서
- 위키데이터 속성 P271을 사용하는 문서
- 위키데이터 속성 P347을 사용하는 문서
- 위키데이터 속성 P349를 사용하는 문서
- 위키데이터 속성 P350을 사용하는 문서
- 위키데이터 속성 P373을 사용하는 문서
- 위키데이터 속성 P380을 사용하는 문서
- 위키데이터 속성 P396을 사용하는 문서
- 위키데이터 속성 P409를 사용하는 문서
- 위키데이터 속성 P428을 사용하는 문서
- 위키데이터 속성 P434를 사용하는 문서
- 위키데이터 속성 P435를 사용하는 문서
- 위키데이터 속성 P436을 사용하는 문서
- 위키데이터 속성 P454를 사용하는 문서
- 위키데이터 속성 P496을 사용하는 문서
- 위키데이터 속성 P549를 사용하는 문서
- 위키데이터 속성 P650을 사용하는 문서
- 위키데이터 속성 P651을 사용하는 문서
- 위키데이터 속성 P691을 사용하는 문서
- 위키데이터 속성 P716을 사용하는 문서
- 위키데이터 속성 P781을 사용하는 문서
- 위키데이터 속성 P791을 사용하는 문서
- 위키데이터 속성 P864를 사용하는 문서
- 위키데이터 속성 P865를 사용하는 문서
- 위키데이터 속성 P886을 사용하는 문서
- 위키데이터 속성 P902를 사용하는 문서
- 위키데이터 속성 P906을 사용하는 문서
- 위키데이터 속성 P947을 사용하는 문서
- 위키데이터 속성 P950을 사용하는 문서
- 위키데이터 속성 P966을 사용하는 문서
- 위키데이터 속성 P982를 사용하는 문서
- 위키데이터 속성 P1003을 사용하는 문서
- 위키데이터 속성 P1004를 사용하는 문서
- 위키데이터 속성 P1005를 사용하는 문서
- 위키데이터 속성 P1006을 사용하는 문서
- 위키데이터 속성 P1015를 사용하는 문서
- 위키데이터 속성 P1045를 사용하는 문서
- 위키데이터 속성 P1048을 사용하는 문서
- 위키데이터 속성 P1053을 사용하는 문서
- 위키데이터 속성 P1146을 사용하는 문서
- 위키데이터 속성 P1153을 사용하는 문서
- 위키데이터 속성 P1157을 사용하는 문서
- 위키데이터 속성 P1186을 사용하는 문서
- 위키데이터 속성 P1225를 사용하는 문서
- 위키데이터 속성 P1248을 사용하는 문서
- 위키데이터 속성 P1273을 사용하는 문서
- 위키데이터 속성 P1315를 사용하는 문서
- 위키데이터 속성 P1323을 사용하는 문서
- 위키데이터 속성 P1330을 사용하는 문서
- 위키데이터 속성 P1362를 사용하는 문서
- 위키데이터 속성 P1368을 사용하는 문서
- 위키데이터 속성 P1375를 사용하는 문서
- 위키데이터 속성 P1407을 사용하는 문서
- 위키데이터 속성 P1556을 사용하는 문서
- 위키데이터 속성 P1584를 사용하는 문서
- 위키데이터 속성 P1695를 사용하는 문서
- 위키데이터 속성 P1707을 사용하는 문서
- 위키데이터 속성 P1736을 사용하는 문서
- 위키데이터 속성 P1886을 사용하는 문서
- 위키데이터 속성 P1890을 사용하는 문서
- 위키데이터 속성 P1907을 사용하는 문서
- 위키데이터 속성 P1908을 사용하는 문서
- 위키데이터 속성 P1960을 사용하는 문서
- 위키데이터 속성 P1986을 사용하는 문서
- 위키데이터 속성 P2041을 사용하는 문서
- 위키데이터 속성 P2163을 사용하는 문서
- 위키데이터 속성 P2174를 사용하는 문서
- 위키데이터 속성 P2268을 사용하는 문서
- 위키데이터 속성 P2349를 사용하는 문서
- 위키데이터 속성 P2418을 사용하는 문서
- 위키데이터 속성 P2456을 사용하는 문서
- 위키데이터 속성 P2484를 사용하는 문서
- 위키데이터 속성 P2558을 사용하는 문서
- 위키데이터 속성 P2750을 사용하는 문서
- 위키데이터 속성 P2980을 사용하는 문서
- 위키데이터 속성 P3223을 사용하는 문서
- 위키데이터 속성 P3233을 사용하는 문서
- 위키데이터 속성 P3348을 사용하는 문서
- 위키데이터 속성 P3372를 사용하는 문서
- 위키데이터 속성 P3407을 사용하는 문서
- 위키데이터 속성 P3430을 사용하는 문서
- 위키데이터 속성 P3544를 사용하는 문서
- 위키데이터 속성 P3562를 사용하는 문서
- 위키데이터 속성 P3563을 사용하는 문서
- 위키데이터 속성 P3601을 사용하는 문서
- 위키데이터 속성 P3723을 사용하는 문서
- 위키데이터 속성 P3788을 사용하는 문서
- 위키데이터 속성 P3829를 사용하는 문서
- 위키데이터 속성 P3863을 사용하는 문서
- 위키데이터 속성 P3920을 사용하는 문서
- 위키데이터 속성 P3993을 사용하는 문서
- 위키데이터 속성 P4038을 사용하는 문서
- 위키데이터 속성 P4055를 사용하는 문서
- 위키데이터 속성 P4114를 사용하는 문서
- 위키데이터 속성 P4143을 사용하는 문서
- 위키데이터 속성 P4186을 사용하는 문서
- 위키데이터 속성 P4423을 사용하는 문서
- 위키데이터 속성 P4457을 사용하는 문서
- 위키데이터 속성 P4534를 사용하는 문서
- 위키데이터 속성 P4535를 사용하는 문서
- 위키데이터 속성 P4581을 사용하는 문서
- 위키데이터 속성 P4613을 사용하는 문서
- 위키데이터 속성 P4955를 사용하는 문서
- 위키데이터 속성 P5034를 사용하는 문서
- 위키데이터 속성 P5226을 사용하는 문서
- 위키데이터 속성 P5288을 사용하는 문서
- 위키데이터 속성 P5302를 사용하는 문서
- 위키데이터 속성 P5321을 사용하는 문서
- 위키데이터 속성 P5368을 사용하는 문서
- 위키데이터 속성 P5504를 사용하는 문서
- 위키데이터 속성 P5587을 사용하는 문서
- 위키데이터 속성 P5736을 사용하는 문서
- 위키데이터 속성 P5818을 사용하는 문서
- 위키데이터 속성 P6213을 사용하는 문서
- 위키데이터 속성 P6734를 사용하는 문서
- 위키데이터 속성 P6792를 사용하는 문서
- 위키데이터 속성 P6804를 사용하는 문서
- 위키데이터 속성 P6829를 사용하는 문서
- 위키데이터 속성 P7293을 사용하는 문서
- 위키데이터 속성 P7303을 사용하는 문서
- 위키데이터 속성 P7314를 사용하는 문서
- 위키데이터 속성 P7902를 사용하는 문서
- 위키데이터 속성 P8034를 사용하는 문서
- 위키데이터 속성 P8189를 사용하는 문서
- 위키데이터 속성 P8381을 사용하는 문서
- 위키데이터 속성 P8671을 사용하는 문서
- 위키데이터 속성 P8980을 사용하는 문서
- 위키데이터 속성 P9070을 사용하는 문서
- 위키데이터 속성 P9692를 사용하는 문서
- 위키데이터 속성 P9725를 사용하는 문서
- 위키데이터 속성 P9984를 사용하는 문서
- 위키데이터 속성 P10020을 사용하는 문서
- 위키데이터 속성 P10299를 사용하는 문서
- 위키데이터 속성 P10608을 사용하는 문서
- 위키데이터 속성 P10832를 사용하는 문서
- 위키데이터 속성 P11249를 사용하는 문서
- 위키데이터 속성 P11646을 사용하는 문서
- 위키데이터 속성 P11729를 사용하는 문서
- 위키데이터 속성 P12204를 사용하는 문서
- 위키데이터 속성 P12362를 사용하는 문서
- 위키데이터 속성 P12754를 사용하는 문서
- 위키데이터 속성 P13049를 사용하는 문서
- 엔비디아 소프트웨어