OptiX

**OptiX**는 2009년경 처음 개발된 광선 추적 API이다. 계산은 CUDA와 함께 도입된 저수준 또는 고수준 API를 통해 GPU로 오프로드된다. CUDA는 엔비디아의 그래픽 제품에서만 사용할 수 있다. 엔비디아 OptiX는 엔비디아 게임웍스의 일부이다. OptiX는 고수준 또는 "알고리즘 중심" API로, 광선 추적 자체만이 아니라 광선 추적이 포함된 전체 알고리즘을 캡슐화하도록 설계되었다. 이는 OptiX 엔진이 애플리케이션 측 변경 없이 더 큰 알고리즘을 매우 유연하게 실행할 수 있도록 하기 위함이다.

일반적으로 비디오 게임은 렌더링에 광선 추적 대신 래스터화를 사용한다.

엔비디아에 따르면, OptiX는 "절차적 정의 및 하이브리드 렌더링 방식"에 충분히 유연하도록 설계되었다. 컴퓨터 그래픽스 렌더링 외에도 OptiX는 광학 및 음향 설계, 방사선 및 전자기파 연구, 인공지능 쿼리 및 충돌 분석에도 도움이 된다.

## OptiX를 사용한 광선 추적
[섬네일|left|엔비디아 OptiX로 그려진 [쥘리아 집합 (이것은 SDK의 샘플이다.)]]
OptiX는 사용자가 제공한 지침(CUDA 커널 형식)을 사용하여 특정 상황에서 광선이 완전한 추적 프로세스를 시뮬레이션하기 위해 무엇을 해야 하는지 작동한다.

광선(또는 다른 종류의 광선)은 다른 표면이 아닌 특정 표면에 부딪힐 때 다른 동작을 할 수 있으며, OptiX는 사용자 제공 프로그램으로 이러한 히트 조건을 사용자 지정할 수 있도록 한다. 이 프로그램은 CUDA C 또는 직접 PTX 코드로 작성되며 OptiX 엔진에서 사용할 때 함께 연결된다.

OptiX를 사용하려면 시스템에 CUDA 지원 GPU가 있어야 하며 CUDA 툴킷이 설치되어 있어야 한다.

광선 추적 애플리케이션에서 OptiX 엔진을 사용하는 것은 일반적으로 다음 단계를 포함한다.

* 광선 생성 프로그램(예: 광선은 평행하게, 원근법 방식으로 또는 기울기 필드처럼 발사될 수 있다), 광선 누락(광선이 어떤 객체와도 교차하지 않을 때), 선택적 예외 프로그램(어떤 이유로 광선이 발사될 수 없을 때), 경계 상자 프로그램(주어진 객체에 대한 경계 상자 교차 테스트를 제공하는 프로그램) 및 교차 프로그램에 대한 프로그램 정의.

이러한 프로그램에 대한 몇 가지 예는 프로그램의 SDK와 함께 제공된다.


```cpp
// 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-트리 또는 경계 볼륨 계층과 같은 가속 구조 내에서 광선 추적 프로세스를 가속화하는 데 사용되는 경계 볼륨을 정의하는 데 사용된다.

* 재료 히트 및 가장 가까운 히트 프로그램 생성: 이 두 프로그램은 광선이 첫 번째 교차(가장 가까운 히트) 또는 일반적인 교차(모든 히트)를 만날 때의 광선 동작을 결정한다.


```cpp
// 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를 위한 샘플 [그래프 이론#트리|그래프 트리]]

복잡한 장면을 렌더링하거나 어떤 광선에 대해 다른 경로를 추적하기 위해 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를 지원한다.
* 블렌더 애드온 D-NOISE는 AI 가속 디노이징을 위해 OptiX 바이너리를 사용한다.
* SIGGRAPH 2011에서 어도비는 모션 그래픽을 위한 GPU 광선 추적 기술 데모에서 OptiX를 선보였다.
* SIGGRAPH 2013에서 OptiX는 픽사의 실시간 GPU 기반 조명 미리 보기 도구에 소개되었다.
* OptiX는 PhysX 및 기타 CUDA 기반 그래픽 엔진 및 프레임워크와 함께 게임웍스 개발자 라이브러리에 통합되었다.
* 어도비 애프터 이펙트 CC
* Daz Studio는 Iray 통합 이후 OptiX Prime 가속을 지원했지만, 버전 4.12.1.8에서는 지원이 제거되었다.
* Luxrender 2.5: 최대 600% 가속

## 같이 보기

* CUDA
* 엔비디아 RTX

## 각주

## 외부 링크
* NVIDIA OptiX 애플리케이션 가속 엔진 메인 페이지
* OptiX 프로그래밍 가이드 및 OptiX SDK
* OptiX 지원 포럼
* OptiX 7 코스 튜토리얼 코드

분류:엔비디아 소프트웨어