https://raytracing-docs.nvidia.com/optix7/guide/index.html#basic_concepts_and_definitions#program
Program : GPU에서 특별한 shading(optix 계산)하는 코드 블록
DirectX, Vulkan에서는 shader라는 작업과 동일. Optix 문서에서는 program이라고 칭할 예정.
Optix는 8가지 타입의 프로그램으로 ray tracing pipeline을 제공함.
Ray generation : ray tracing의 접근점. 각 필셀에 대해서 병렬처리가 호출
Intersection : ray-primitive(ex> Triangle) test (순회)
Any-hit : (ex> 그림자 계산) '새로운' 근접할 확률이 높거나 교차 점을 ray가 찾을 경우 호출
Closest-hit : (ex> material shading) 근접한 교차 점을 ray가 찾을 경우 호출
Miss : scene에서 ray가 아무것도 교차하지 않을 경우 호출
Exception : stack over flow나 다른 오류가 발생할 경우의 Exception Handler 호출
Direct callables : CUDA function을 부르듯이 직접적으로 바로 호출
Continuation callables : direct callables와 다르게 스케줄러에 의해서 매번 호출된다.
ray tracing 파이프라인은 여덟 개의 프로그램의 구조체를 통해서 상호호출된다.
shader binding table은 geometric data를 programs와 파라미터로 연결시킨다.
record는 shader binding table의 하나의 컨포넌트이다.
record는 acceleration structures가 생성될 때, 그리고 runtime에 지정된 오프셋을 사용하여 선택된다.
record의 구성 요소는 두 가지 데이터로 나뉘며, header와 data로 구성되어 있다.
Record header
optixSbtRecordPackHeader 함수로 채워지며, application(Host)에서 값을 수정한다. (opaque)
이는 Optix에서 (프로그래밍적) 동작을 식별하기 위해 사용된다.
예를들면, 해당 primitive에 intersection, any-hit, closet-hit에 대해서 동작을 식별한다.
Record data
Optix(Device)에서 값을 수정한다. (opaque)
헤더에 의해 참조된 primitive, 혹은 프로그램 관련 사용자 데이터(program parameter values)를 저장할 수 있다.
정리하면, optix는 shader binding table의 구성요소인 record를 생성한다. 그리고 record를 통해서 primitive한 데이터, 파라미터를 채워 프로그램에 제공한다.
해당 함수는 Host 함수이다.
반환되는 값으로는 성공/오류 여부이다.
opaque data type이란 인터페이스에서 완전히 정의되지 않은 데이터 유형이다.
값은 누락된 정보에 접근할 수 있는 함수를 호출하여 조작할 수 있습니다.
이는 정보 은닉을 강제합니다.
즉, 그 값은 누락된 정보에 접근할 수 있는 함수를 호출하여 조작할 수 있습니다
ray payload는 ray traversal을 하는 동안에, optixTrace 함수와 프로그램 사이에 데이터 전달하는데 사용된다.
payload 값은 optixTrace 함수에 의해 전달되고(copy-in), 반환(copy-out)된다.
payload의 넘겨주는 값에(ex> float) 대한 제한이 있지만, 하나 이상의 값은 local 또는 global (stack)메모리에 대한 포인터일 수도 있다.
정리하면, record는 primitive(ex> triangle)들에 대한 정보들을 기록하고, optixTrace 함수를 통해서 Ray를 발사한다.
그리고, 반환 결과로 payload를 통해서 반환된다.
해당 함수는 Device 함수이다.
Attributes는 intersection program이 any-hit, closet-hit program으로 데이터를 전달하는데 사용된다.
삼각형 교차는 2차원(U,V)에 대해 미리 정의된 2가지 속성을 제공한다. 유저가 정의한 교차점은 특정한 primitive의 다른 attributes에 의해 숫자가 제한될 수 있다.
어떻게 쓰이는지 확실한 이해x 후에 수정 필요
Optix는 GPU 메모리에 대한 포인터로 GPU 정보를 나타낸다.
이 문서에서 버퍼라는 용어는 GPU 메모리 포인터 및 관련 메모리 내용을 의미한다. OptiX6와는 달리 버퍼의 할당 및 전송은 사용자 코드에 의해 명시적으로 제어된다.
Acceleration structures는 device에서 생성되는 opaque 데이터 구조체이다. (함수 호출로만 데이터를 채울 수 있는)
구조체는 Bounding Volumn Hierarchy(BVH) model을 베이스로 한다. 하지만 이러한 구조의 구현과 데이터 레이아웃은 GPU 아키텍처마다 다르다.
OptiX는 2가지 타입의 기본 acceleration structures를 제공한다.
Geometry accelertaion structures
primitives (ex> 삼각형, 곡선, 구, 유저 정의 primitives)
Instance acceleration structures
acceleration structures 또는 motion transform nodes과 같은 다른 오브젝트 위에 구축된 acceleration structures
인스턴스별 정적 변환을 통한 인스턴스화 허용
opacity micromaps는 Device에 의해 생성된 opaque data structures이다. 삼각형에 대한 opacity information 정보를 지정해준다.
삼각형 자체의 불투명도를 의미하는 것인가?
ray와 geometric 정보와의 교차점을 결정하기 위해 accelerataion structures와 transformation으로 구성된 graph node들을 검사한다.
이러한 행동을 traversal라고 부르고, graph 안의 노드들은 traversable objects 또는 traversables라고 부른다.
traversal objects는 다음과 같은 유형이다.
transformation traversables의 경우, 해당 변환을 모든 하위 자손 traversables에 적용한다.
geometry에 transformation을 적용하는 것은 순서에 따라 달라지고, motion transform은 시간에 따라 달라지므로, transform traversables는 motion이 있는 경우에만 사용해야 한다.
static transformation은 시간 종속성으로 인해 어떤 모션 변환과도 병합할 수 없지만 instance transformation(instance의 자식이 원하는 경우) 또는 static transformation과 병합해야 한다. (즉, 모션 변환 뒤에 정적 변환이 하나 이상 있어야 함.)
정확히는 이해가 되지 않는데, transformation은 (시간이 있는) 모션의 순서에 따라 영향을 받으므로, motion transformation을 사용해야 한다?
Optix는 traversable objects들에 대한 참조를 handles를 통해서 한다.
traversable handles는 그래프 노드에 대한 64-bit opaque value이고, device 메모리 포인터에서 생성된다.
핸들은 오브젝트간의 연결성을 식별한다.
optixTrace에 대한 모든 호출은 traversable handle로 부터 시작한다.
Note : DirectX와 VulkanRT는 top-level acceleration structures와 bottom-level acceleration structure 라는 용어를 사용한다.
bottom-level accelertion structure는 geometry accerlation structure와 같다.
반대로 top-level acceleration structure는 instance accelertation structure와 유사하다.
a single geometry acceleration structure와 motion transform nodes, nested instance accelertation structures(multi-level instancing)는 DirectX와 VulkanRT에서는 제공하지 않는다.
따라서 Optix에서는 DirectX와 VulkanRT에서 지원하는 top-bottom와 구분하기 위해서 용어를 다르게 했다.
(여기서 말하는 DirectX는 directX Raytracing을 얘기한다.)
Ray Tracing은 다음 4가지 구성 요소를 결합으로 구현한다.
Scene에서 하나 이상의 geometry meshs와 이러한 mesh의 instance 위에 하나 이상의 acceleration structure를 생성한다.
레이트레이싱 실행 중에 호출한 모든 프로그램을 포함하는 하나의 파이프라인을 생성한다.
이러한 프로그램과 파라미터를 포함하는 shader binding table을 생성한다. 그리고 acceleration structures의 instances와 geometries에 대한 shader binding table record를 선택 후 일치하는 데이터 레이아웃을 선택한다.
ray generation program을 호출하는 device 측 커널을 실행하여 optixTrace를 호출하는 여러 스레드로 traverse 및 다른 프로그램을 시작한다.
ray tracing은 데이터를 생성하고, 디바이스 간 데이터를 이동하고, 다른 그래픽 API로 데이터를 이동하기 위한 CUDA 작업과 같이 작업할 수 있다.
GPU에서 모든 작업을 조정하는 것은 Host의 역할이다.
OptiX는 다른 작업과 동기화되지 않는다.