OptiX 7 - Device-side function

선비Sunbei·2023년 8월 29일
0

OptiX

목록 보기
12/25

Optix device runtime은 ray tracing 상태를 설정 및 가져오고 user program들 내에서 새로운 ray tracing하는 기능을 제공한다. 다음 function은 모든 program type에서 사용할 수 있다.

optixGetTransformTypeFromHandle
optixGetInstanceChildFromHandle
optixGetInstanceIdFromHandle
optixGetInstanceTransformFromHandle
optixGetInstanceInverseTransformFromHandle
optixGetStaticTransformFromHandle
optixGetMatrixMotionTransformFromHandle
optixGetSRTMotionTransformFromHandle
optixGetGASMotionTimeBegin
optixGetGASMotionTimeEnd
optixGetGASMotionStepCount
optixGetPrimitiveType(hitKind)
optixIsFrontFaceHit(hitKind)
optixIsBackFaceHit(hitKind)
optixGetTriangleVertexData
optixGetLinearCurveVertexData
optixGetQuadraticBSplineVertexData
optixGetCubicBSplineVertexData
optixGetCatmullRomVertexData
optixGetCubicBezierVertexData
optixGetRibbonVertexData
optixGetRibbonNormal
optixGetSphereData
optixGetInstanceTraversableFromIAS
optixGetLaunchIndex
optixGetLaunchDimensions

다른 function은 특정 program type에서만 사용할 수 있다. 다음 표에는 OptiX device function이 유효한 program type이 나와있다.

Module의 모든 함수는 OptiX device-side function을 호출하는 caller에 인라인 처리된다.(아래 명시된 예외는 제외) 이 프로세스는 outermost function에만 이러한 함수 호출이 포함될 때까지 반복된다.

예를 들어, closest hit program이 computeValue라는 함수를 호출하고, 이 함수는 다시 computeDeeperValue를 호출하며, 이 함수는 다시 optixGetTriangleBarycentrics를 호출한다고 생각해보자. inlining process는 computeDeeperValue의 본문을 computeValue로 inlining하고, 이 inlining은 다시 가장 가까운 hit program으로 inlining이 된다. device-side api function을 호출하는 재귀 함수는 컴파일 오류를 생성한다.

다음 함수는 inline을 하지 않는다.

optixTexFootprint2D
optixGetInstanceChildFromHandle
optixTexFootprint2DGrad
optixTexFootprint2DLod

11.1 Launch index

launch index는 host에서 optixLaunch로 지정된 실행 크기 내에서 현재 스레드를 식별한다. launch index는 모든 program에서 사용할 수 있다.

일반적으로 ray generation program은 launch index당 한 번만 실행된다.

CUDA programming model과 달리 인접한 launch index의 program 실행이 반드시 동일한 warp 또는 block 내에서 수행되는 것은 아니므로 Application이 launch index의 locality에 의존해서는 안된다.

11.2 Trace

optixTrace 함수는 주어진 traversable과 제공된 ray origin 및 direction에서 시작하여 ray trace query를 시작한다. 주어진 OptixtraversableHandle이 null인 경우 Miss program만 호출한다.

tmin 및 tmax 인수는 현재 ray와 관련된 범위를 설정한다. 이 범위를 벗어난 hitT로 report된 모든 hit는 무시된다. tmin 값은 0보다 크거나 같아야 한다. optixTrace function의 동작은 음수 tmin 값에 대해 정의되지 않는다.

이 호출로 초기화된 각 ray에 임의의 payload가 연결되며, 이 payload는 이 trace call 중에 실행되는 모든 intersection, anyhit, closest hit 및 miss program에 전달된다. payload는 optixGetPayload 및 optixSetPayload 함수 쌍을 사용하여 각 program에서 읽고 쓸 수 있다.( ex> optixGetPayload_0, optixSetPayload_0), 이후 payload는 optixTrace의 호출자에게 다시 전달되며 copy-in/copy-out semantic을 따른다.

rayTime 인수는 motion-aware traversal 및 material evaluation에 할당된 시간을 설정한다. pipeline compile option에서 motion이 활성화되지 않은 경우 compiler에서 rayTime을 무시하고 제거한다. ray time을 요정하려면 optixGetRayTime 함수를 사용한다. motion이 없는 pipeline에서 optixGetRayTime은 항상 0을 반환한다.

rayFlags 인수는 optixRayFlags의 조합으로 나타낼 수 있다. 지원되는 flag는 다음과 같다. 잘못된 조합은 주의해야 한다.

  • OPTIX_RAY_FLAG_NONE
    개별 AS에 대해서 구성된 동작과 변경 사항이 없다.

  • OPTIX_RAY_FLAG_DISABLE_ANYHIT
    ray에 대한 any-hit program을 비활성화 한다. instance가 intersection할 때 잠재된 instance flag OPTIX_INSTANCE_FLAG_ENFORCE_ANYHIT를 override한다. 이 flag는 OPTIX_RAY_FLAG_ENFORCE_ANYHIT, OPTIX_RAY_FLAG_CULL_DISABLED_ANYHIT, OPTIX_RAY_FLAG_CULL_ENFORCED_ANYHIT와 상호배제적이다.

  • OPTIX_RAY_FLAG_ENFORCE_ANYHIT
    ray에 대한 anyhit program 실행을 강제한다. OPTIX_GEOMETRY_FLAG_DISABLE_ANYHIT 및 OPTIX_INSTANCE_FLAG_DISABLE_ANYHIT을 override한다.

  • OPTIX_RAY_FLAG_TERMINATE_ON_FIRST_HIT
    첫 번째 적중 후 ray를 종료하고 closest-hit program을 이 hit에 대해서 실행한다.

  • OPTIX_RAY_FLAG_DISABLE_CLOSESTHIT
    ray에 closest hit program을 비활성화 하지만 miss program은 호출한다.

  • OPTIX_RAY_FLAG_CULL_BACK_FACING_TRIANGES
    삼각형 뒷면의 intersection을 방지한다.(instance flag OPTIX_INSTANCE_FLAG_FLIP_TRIANGLE_FACING으로 인한 face 변경 가능성을 유의해야 한다.) 이 플래그는 OPTIX_RAY_FLAG_CULL_FRONT_FACING_TRIANGLES와 상호 배제적이다.

  • OPTIX_RAY_FLAG_CULL_FRONT_FACING_TRIANGLES
    삼각형 앞면의 교차를 방지한다. (instance flag OPTIX_INSTANCE_FLAG_FLIP_TRIANGLE_FACING으로 인한 face 변경 가능성을 유의해야 한다.) 이 flag는 OPTIX_RAY_FLAG_CULL_BACK_FACING_TRIANGLES와 상호 배제적이다.)

  • OPTIX_RAY_FLAG_CULL_DISABLED_ANYHIT
    geometry flag OPTIX_GEOMETRY_FLAG_DISABLE_ANYHIT 또는 intance flag OPTIX_INSTANCE_FLAG_DISABLE_ANYHIT 설정으로 인해 any hit program을 비활성화하는 geometry intersection을 방지한다. 이 flag는 OPTIX_RAY_FLAG_CULL_ENFORCED_ANYHIT, OPTIX_RAY_FLAG_ENFORCE_ANYHIT, OPTIX_RAY_FLAG_DISABLE_ANYHIT와 상호배제적이다.

  • OPTIX_RAY_FLAG_CULL_ENFORCED_ANYHIT
    geometry flag OPTIX_GEOMETRY_FLAG_DISABLE_ANYHIT를 설정하지 않거나 instance flag OPTIX_INSTANCE_FLAG_ENFORCE_ANYHIT를 설정하여 any-hit program이 활성화된 geometry의 intersection을 방지한다. 이 flag는 OPTIX_RAY_FLAG_CULL_DISABLED_ANYHIT, OPTIX_RAY_FLAG_ENFORCE_ANYHIT, OPTIX_RAY_FLAG_DISABLE_ANYHIT와 상호 배제적이다.

ray flag는 traverse 동작을 수정한다. 예를 들어, ray flag OPTIX_RAY_FLAG_TERMINATE_ON_FIRST_HIT를 설정하면 첫 번째 hit(any-hit에서는 무시되지 않음)가 closest hit로 정의되어 추가 traverse를 중단한다. 이 특정 flag는 shadow ray에 유용하게 사용할 수 있으며, 이 flag를 사용하면 optixTerminateRay를 호출하는 특별한 any-hit program이 없어도 traverse를 조기에 종료할 수 있다.

visibility mask는 instance의 구성 가능한 마스크에 대한 교차를 제어한다.(instance build input 참고) 두 마스크에 일치하는 bit가 하나 이상 있는 경우 intersection이 계산된다. 사용 가능한 bit 수에는 instance visibility mask와 동일한 제한이 적용된다. (limits 참고)

SBT offset과 stride는 ray intersection에 대한 SBT record를 선택할 때 SBT indexing을 조정한다. visibility mask와 마찬가지로 두 매개변수 모두 제한이 있다. (limit, AS 참고)

지정된 miss SBT index는 miss 시 호출되는 program을 식별하는 데 사용된다. 인수는 miss program에 대한 SBT record에 대한 유효한 index여야 한다.

11.3 Payload access

intersection, any-hit, closest hit, miss program에서 payload는 traverse를 시작하는 optixTrace에서 traverse의 다른 ptrogram으로, 그리고 다시 optixTrace caller에게 값을 전달하는 데 사용된다. 32bit payload 값은 최대 32개까지 사용할 수 있다. 32개의 payload 값을 가져오고 설정하려면 이름이 payload index로 끝나는 함수를 사용한다. 예를 들어 payload 0은 두 함수에 의해 설정되고 액세스 된다.

사용자가 OptixModuleCompileOptions::numPayloadType 및 OptixModuleCompileOptions::payloadTypes compile option으로 payload type을 구성한 경우, optixSetPayloadTypes 함수는 program을 특정 payload type과 연결한다. 이 함수는 사용할 때는 top of program(프로그램 코드의 상단)에서 무조건 호출해야 한다.

11.4 Reporting intersections and attribute access

현재 traversable과의 intersection을 report하려면 intersection program은 optixReportIntersection 함수를 사용할 수 있다. 주어진 교차로의 hit kind는 연결된 any-hit 및 closest hit program에 전달되며, any-hit 및 closest hit program은 property을 해석하는 방법을 사용자 정의할 수 있다. hitKind의 가장 낮은 7bit는 해석되며, [128,255] 값은 내부용으로 예약되어 있다.

최대 8개의 32bit primitive 속성 값을 사용할 수 있다. intersection은 optixReportIntersection을 사용하여 교차점을 보고할 때 attribute를 작성한다. 그러면 closest hit 및 any-hit program이 이러한 속성을 읽을 수 있다.

모든 hit program에서 보고된 intersection을 거부하려면 optixIgnoreIntersection을 호출하면 된다. closest hit program은 해당 교차점에 대한 보고된 속성을 가진 closest intersection에 대해 호출된다. 모든 hit program은 ray에 따라 가능한 모든 hit에 대해 호출되지 않을 수 있다. intersection이 수락되면 (optixIgnoreIntersection에 의해 폐기되지 않고) intersection 및 통과 간격이 업데이트 된다. 새 간격을 벗어난 intersection은 수행되지 않는다.

속성의 유형은 정수 데이터로만 구성되지만, 사용자는 이러한 유형 중 하나 이상을 __int_as_float 및 __float_as_int 필요한 경우 다른 데이터 유형을 사용하여 더 읽기 쉬운 데이터 구조로 wrapping할 수 있다.

삼각형 intersection은 두 가지 attribute, 즉 hit의 barycentric(u,v)를 반환하며, 이 좌표는 optixGetTriangleBarycentric 함수로 읽을 수 있다. 이와 유사하게 리본 promitive intersection은 두 가지 특성, 즉 리본 segment와 적중된 좌표(u,v)를 반환하며, 이는 optixGetRibbonParameters로 읽을 수 있다. 다른 curve primitive intersection은 다항식 curve segment 내의 curve parameter(u) attribute 하나를 반환하며, 이 attribute는 편의 함수 optixGetCurveParameter로 읽을 수 있다. sphere intersection은 하나의 attribute를 반환하며, 두 번째 파라미터로 두 번째 교차의 ray parameter를 반환하거나 존재하지 않는 경우 0을 반환한다.

attribute에는 8개 이하의 값을 사용할 수 있다. local memory에 대한 포인터를 포함할 수 있는 ray payload와 달리 attribute에는 local memory에 대한 포인터가 포함되지 않아야 한다. 이 메모리는 attribute가 소모될 때 closest hit 또는 intersection program에서 사용할 수 없을 수 있다. 보다 정교한 attribute는 아마도 closest hit program에서 더 잘 처리될 것이다. 일반적으로 특정 계산을 closest hit program으로 연기하거나 closest hit program에서 값을 한 번만 다시 로드하면 메모리 대역폭을 더 잘 절약할 수 있다.

11.5 Ray information

현재 활성화된 광선의 property를 query하려면 다음 함수를 사용한다.

  • optixGetWorldRayOrigin / optixGetWorldRayDirection
    optixTrace에 전달된 ray의 origin과 direction을 반환한다. 이러한 함수는 traverse 중(즉, intersection, anyhit)에 호출하는 것이 object space에 대응하는 함수보다 더 많은 비용이 들 수 있다.

  • optixGetObjectRayOrigin / optixGetObjectRayDirection
    현재 변환 스택을 기준으로 object space ray direction 또는 origin을 반환한다. 이 함수는 intersection 및 any-hit program에서만 사용할 수 있다.

  • optixGetRayTmin
    현재 ray와 연관된 최소 범위를 반환한다. 이 값은 optixTrace에 전달된 tmin 값이다.

  • optixGetRayTmax
    현재 ray와 연관된 최대 범위를 반환한다. 값은 아래 설명과 같다.

  • intersection 및 closest hit program에서는 보고된 closest hitT 또는 아직 교차점이 기록되지 않은 경우 optixTrace로 전달된 tmax를 반환한다.

  • any-hit program에서는 optixReportIntersection으로 전달된 hitT 값을 반환한다.

  • miss program에서는 반환 값이 optixTrace로 전달된 tmax를 반환한다.

  • optixGetRayTime
    optixTrace에 전달된 time 값을 반환한다. pipeline에서 motion이 비활성화되면 0을 반환한다.

  • optixGetRayFlag
    optixTrace에 전달된 ray flag를 반환한다.

*optixGetRayVisibilityMask
optixTrace에 전달된 visibility mask를 반환한다.

참고 : ray generation 및 exception program에서는 현재 활성 ray가 없기 때문에 이러한 기능이 지원되지 않는다.

11.6 Undefined values

레지스터 사용을 보다 세밀하게 제어하고자 하는 advanced application 작성자는 traverse 중에 사용되지 않는 payload slot에 알 수 없는 값을 기록하여 intersection 및 any-hit 빈도가 높은 program에서 총 레지스터 사용을 줄일 수 있다. OptiX는 이 작업을 수행할 수 있도록 다음과 같은 기능을 제공한다.

11.7 Intersection information

현재 intersection point의 primitive index는 optixGetPrimitiveIndex를 사용하여 query할 수 있다. primitive index는 build input에 대해 local이다.

현재 intersection point의 SBT index는 optixgetSbtGASIndex를 사용하여 query할 수 있다. SBT index는 build input에 대해 local이다.

Application은 optixGetHitKind를 사용하여 8bit hit type을 query할 수 있다. hit type은 사용자 정의 primitive, built-in triangle, built-in primitives가 hit되었는지 여부와 curve가 linear, quadratic or cubic B-spline, cubic Bezier 또는 catmull-rom spline인지 여부를 알려주는 optixGetPrimitiveType을 호출하여 분석하게 된다. 내장 primitive의 경우 optixIsFrontFaceHit 및 optixIsBackFaceHit은 ray가 primitive의 앞면 또는 뒷면에 땋았는지 여부를 알려준다. 내장된 triangle primitive의 앞면은 정점을 시계 반대 방향으로 감는 것을(오른손 좌표계) 정의한다. custom primitive의 경우, hit kind는 intersection에서 호출되었을 때 optixReportIntersection이 보고한 값이다.

front-face를 정의하는 기본 반시계 방향 감기는 OPTIX_INSTANCE_FLAG_FLIP_TRIANGLE_FACING instance flag를 설정하여 시계 방량 감기로 변경할 수 있다.(왼손 좌표계) instance에서 이 flag의 값은 부모 IAS를 탐색하는 동안 설정되었을 수 있는 flag의 값을 재정의한다.

참고 : 일반적으로 동일한 ray 동작을 구현하지만 예상 geometry 유형만 다른 여러 hit program을 사용하는 것보다 하나의 hit shader가 여러 primitive type을 처리하도록 하는 것이 더 효율적이다.(optixGetPrimitiveType 값을 켜는 방식으로)

triangle hit의 경우 몇 가지 표기법 단축키가 있다. hit kind는 ray가 triangle 앞쪽에 왔는지 뒤쪽에 왔는지에 따라 OPTIX_HIT_KIND_TRIANGLE_FRONT_FACE 또는 OPTIX_HIT_KIND_TRIANGLE_BACK_FACE가 된다.

optixIsTriangleHit, optixIsTriangleFrontFaceHit, optixIsTriangleBackFaceHit device function도 사용할 수 있다.

optixGetPrimitiveType optixIsFrontFaceHit, optixIsBackFaceHit 함수는 각각 두 가지 형태가 있다. 인자가 없으면 현재 ray intersection을 분석하며, 이 형식은 closest hit 또는 any-hit program에서만 사용할 수 있다. 또는 명시적인 hit type 인자를 사용할 수 있으며 이 형식은 모든 유형의 program에서 호출할 수 있다.

instance가 있는 scene, 즉 IAS Object가 포함된 scene을 traverse할 때 가장 최근에 방문한 instance의 두 가지 property를 intersection 및 any-hit program에서 query할 수 있다. closest hit program의 경우 property는 optixReportIntersection을 사용하여 hit를 기록할 때 가장 최근에 방문한 instance를 참조한다. optixGetInstanceId를 사용하면 optixInstance::instanceId에 제공된 값을 검색할 수 있다. optixGetInstanceIndex를 사용하면 instance와 연관된 IAS 내에서 zero-based index가 반환된다. geometry primitive와 optixTrace 대상 사이에 방문한 instance가 없는 경우 optixGetInstanceId는 ~0u(부호 없는 정수 0의 비트 보수)을 반환하고, optixGetInstnaceIndex는 부호 없는 정수 0을 반환한다.

11.8 SBT record data

현재 SBT record의 데이터 섹션은 optixGetSbtDataPointer를 사용하여 액세스할 수 있다. 이 함수는 SBT record의 헤더를 생략하고 데이터에 대한 포인터를 반환한다.

11.9 Vertex random access

Triangle 정점은 GAS의 triangle 데이터 구조에 bake 된다. triangle GAS가 OPTIX_BUILD_FLAG_ALLOW_RANDOM_VERTEX_ACCESS flag가 설정된 상태로 build되면 application은 object space에서 GAS의 모든 triangle의 triangle vertex data를 query할 수 있다. GAS에 따라 triangle data가 포함되어 있으므로 Application은 device에서 자체 triangle data buffer를 안전하게 해제할 수 있으므로 전체 메모리 사용량을 줄일 수 있다.

optixGetTriangleVertexData 함수는 전달된 rayTime에 삼각형 정점 세 개를 반환한다. GAS 및 pipeline에서 motion이 활성화된 경우 motion interpolation이 수행된다.

사용자는 optixGetTraversableHandle, optixGetPrimitiveIndex, optixGetSbtGASindex 및 optixGetRayTime 함수를 호출하여 closest hit 및 any-hit program에서 intersection point와 관련된 GAS traversable handle, primitive index, GAS local SBT index 및 motion time을 얻을 수 있다. optixGetTriangleVertex 함수는 삼각형 위치 데이터에 대한 motion vertex interpolation도 수행된다.

optiX는 구성 중에 AS에서 degeneration(교차할 수 없는) 삼각형을 제거할 수 있다. degeneration triangle에 대해 optixGetTriangleVertexData를 호출하면 원래 triangle 정점이 아닌 NaN triangle data로 반환된다.

triangle data의 potential 압축 해제 단계에는 상당한 runtime overhead가 발생할 수 있다. random access를 활성화하면 GAS가 약간 더 많은 메모리를 사용할 수 있다.

optixGetTriangleVertexData를 optixGetPrimitiveIndex가 반환하는 값 이외의 primitive index와 사용하는 경우 주의해야 한다. optixGetTriangleVertexData는 AS build 시 build input / sbtGASindex에 해당하는 local primitive index와 primitive index offset을 받는 것을 기대한다.

curve primitive 정점과 반지름도 GAS에 저장되며 optixGetLinearCurveVertexData 함수를 사용하여 유사한 방식으로 검색할 수 있다. optixGetQuadraticBSplineVertexData, optixGetCubicBSplineVertexData, optixGetCatmullRomVertexData, optixGetCubicBezierVertexData, optixGetRibbonVertexData(curve type에 따라) 함수를 사용하여 검색할 수 있다. 편의 함수로 optixGetRibbonNormal은 지정된 (u,v)에서 리본 normal을 반환한다.

sphere vertices와 반지름은 optixGetSphereData 함수를 사용하여 검색할 수 있다.

이 함수의 동작은 traversable handle이 유효한 GAS taversable을 참조하지 않거나, GAS가 OPTIX_BUILD_FLAG_ALLOW_RANDOM_VERTEX_ACCESS flag 설정으로 빌드되지 않았거나, primitive index 또는 GAS local SBT index가 유효한 범위 내에 있지 않을 때 정의되지 않는다.

11.9.1 Displaced micro-mesh triangle vertices

displaced mirco-mesh triangle primitive가 hit된 경우, Application은 optixGetMicoTriangleVertexData 함수를 사용하여 intersection된 micro triangle의 micro vertex를 query할 수 있다. 이 함수는 optixGetTriangleVertexData와 유사하지만, closest hit 또는 any-hit program에서 현재 DMM triangle primitive가 hit된 경우에만 사용해야 한다.

이러한 경우 optixGetTriangleBarycentrics는 위 그림과 같이 micro triangle이 아닌 base triangle의 공간에서 bit point의 barycentric을 반환한다. 이를 통해 DMM triangle primitive의 base triangle 정점에 지정된 사용자 정의 정점 특성을 쉽게 보간할 수 있다. optixGetMicroTriangleBarycentricsData 함수를 사용하여 교차된 DMM triangle의 세 micro triangle space에서 barycentric을 query할 수 있다. 도움을 주는 함수로 optixBaseBarycentricsToMicroBarycentrics를 사용하면 현재 적중의 삼각형 기저 공간에서 micro triangle space으로 삼각형 중심을 반환할 수 있다. 이 함수를 사용하여 micro vertex의 위치를 보간하여 object space에서 hit position을 계산할 수 있다.

11.10 Geometry acceleration structure motion option

optixGetTriangleVertexData에 의해 수행되는 motion vertex interpolation 외에도 custom motion intersection에서 vertex interpolation 또는 closest hit shader에서 사용자 제공 shading normal interpolation과 같이 다른 사용자 관리 vertex data에 대한 interpolation이 필요할 수 있다. OptiX는 GAS에 대한 motion 옵션을 얻기 위해 다음과 같은 함수를 제공한다.

예를 들어 custom vertex data의 motion key 수가 GAS의 motion key와 같다면 사용자는 다음과 같이 왼쪽 key index와 key 내 interpolation을 계산할 수 있습니다.

11.11 Transform list

multi-level/IAS scene graph에서는 각 primitive에 하나 이상의 transform이 적용 된다. optiX는 현재 primitive에서 transform index을 읽을 수 있는 내재성을 제공한다. transform 목록에는 root traversable(optixTrace로 전달)에서 현재 primitive scene graph를 통과하는 경로에 있는 모든 transform이 포함된다. optixGetTransformListSize 함수는 트랜스폼 목록의 항목 수를 반환하고 optixGetTransformListHandle 함수는 transform 항목의 traversable handle을 반환한다.

optixGetTrnasformTypeFromHandle 함수는 traversable handle의 유형을 반환하며, 다음 유형 중 하나에 해당할 수 있다.

  • OPTIX_TRANSFORM_TYPE_INSTANCE
    IAS의 instance이다. optixGetInstanceIdFromHandle 함수는 instance user ID를 반환한다. optixGetInstanceTransformFromHandle 및 optixGetInstanceInverseTransformFromHnale 함수는 instance transform과 그 역을 반환한다. optixGetInstanceChildFromHandle 함수는 optixInstance::traversable handle을 통해 instance가 참조하는 traversable handle을 반환한다.

  • OPTIX_TRANSFORM_TYPE_STATIC_TRANSFORM
    OptixStaticTransform traversable에 대응하는 transform이다. optixGetStaticTransformFromHandle 함수는 traversable pointer를 반환한다.

  • OPTIX_TRANSFORM_TYPE_MATRIX_MOTION_TRANSFORM
    OptixMatrixMotionTransform traversable에 대응하는 transform이다. optixMatrixMotionTransformFromHandle 함수에서 traversable handle 반환하다.

  • OPTIX_TRANSFORM_TYPE_SRT_MOTION_TRANSFORM
    OptixSRTMotionTransform traversable에 대응하는 transform이다. optixGetSRTMotionTransformFromHandle 함수에서 traversable에 대한 포인터를 반환한다.

이 포인터는 해당 노드와 관련된 데이터를 읽을 때만 사용해야 한다. 실행 중에 활성화된 traversable data를 쓰면 정의되지 않은 결과가 생성된다.

Application은 이러한 내재성을 사용하여 맞춤형 변환 평가 함수(ex> 월드에서 오브젝트 간 변환 행렬을 위한)를 구현할 수 있다. 이렇게 하면 scene graph의 특정 구조를 활용할 수 있으므로, 예를 들어 scene graph에 알려진 최대 transform이 있고 transform type의 하위 집합만 사용되는 경우 유용할 수 있다. 하지만 지원해야 하는 scene graph의 하위 집합에 따라 OptixPipelineCompileOptions::traversableGraphFlags 및 OptixPipelineCompileOptions::usesMotionBlur 컴파일 옵션을 적절히 지정하는 것이 중요하다. 이 컴파일 옵션을 사용하면 지원되지 않는 경우를 compile 시간에 제거하여 내부적으로 최적화를 할 수 있다. 예를 들어 instancing level이 하나만 필요하고 motion blur transform을 지원해도 되지 않는 경우 traversableGraphFlags를 OPTIX_TRAVERSABLE_GRAPH_FLAG_ALLOW_SINGLE_LEVEL_INSTANCING으로 설정하면 된다. 이 옵션을 설정하면 optixGetWorldtoBoejctTransformMatrix 및 optixGetObjectToWorldTransformMatrix와 같은 device function은 custom 구현과 동일한 성능을 발휘할 수 있다.

optixGetTransformListHandle에서 반환된 handle을 저장하거나 decoding할 수 있는 다른 다른 함수에 전달할 수 있다. optixGetWorldToObjectTransformMatrix 및 optixGetObjectToWorldTransformMatrix 함수는 intersection(IS, AH, CH program)의 context에서만 사용할 수 있다. 따라서 이전에 저장된 handle에서 변환을 가져오는 사용자 정의 변환 평가 함수를 사용할 수 있다.

11.12 instance random access

Transform list는 intersection, any-hit program 및 closest hit program에서 현재 교차점과 관련된 optix instance의 데이터에 액세스하는 데 선호되는 방식이다. 그러나 사용자는 IAS에서 현재 intersection과 연결되지 않은 다른 instance의 instance 데이터에 random access해야 할 수 있다. IAS 구조가 OPTIX_BUILD_FLAG_ALLOW_RANDOM_INSTANCE_ACCESS flag가 설정된 상태로 build되면, Application은 IAS에 있는 모든 instance의 instance traversable handle을 query할 수 있다. IAS에 isntance 데이터가 포함되어 있으므로 Application은 device에서 자체 instance data buffer을 안전하게 해제할 수 있으므로 전체 메모리 사용량을 줄일 수 있다.

optixGetInstanceTraversableFromIAS 함수는 IAS에서 instance traversable handle을 반환한다.

사용자는 optix handle로부터 optixGetInstanceIdFromHandle, optixGetInstanceChildHandle, optixGetInstanceTransformFromHandle and optixGetInstanceInverseTransformFromHandle 함수를 호출하여 instance transform handle로부터 user instance id, child transform handle, object-to-world transform, world-to-object transform을 가져올 수 있다.

이 함수의 동작은 traversable handle이 유효한 IAS traversable을 참조하지 않거나, IAS가 OPTIX_BUILD_FLAG_ALLOW_RANDOM_INSTANCE_ACCESS flag 설정으로 build되지 않았거나, Intance Index가 유효한 범위 내에 있지 않을 때 정의되지 않은 상태로 작동한다.

11.13 Terminationg or ignoring traversal

any-hit program에서 다음 함수를 사용하여 traverse를 제어할 수 있다.

  • optixTerminateRay
    현재 ray와 관련된 traverse 실행을 즉시 종료한다. 종료 후 ray와 관련된 closest hit program이 호출된다.

  • optixIgnoreIntersection
    현재 intersection point를 버린다. 이 intersection point는 ray와 연결된 새로운 closest hit intersection point가 되지 않는다. 이 함수는 호출자에게 반환되지 않으며 즉시 program을 종료한다.

ray payload 값에 대한 수정 사항은 이 함수를 호출기 전에 호출해야 한다.

11.14 Exceptions

예외를 사용하려면 OptiX에서 불변성을 검사하고 위반에 대한 세부 정보를 보고할 수 있다.

예외 검사를 활성화하려면 OptixPipelineCompileOptions::exceptionFlag field를 OptixExceptionFlags의 bit 단위 조합으로 설정한다. 시나리오와 flag 조합에 따라 예외를 활성화하면 심각한 overhead가 발생할 수 있으므로 일부 flag는 주로 내부 및 debug field에 사용되어야 한다.

지정된 flag set에 따라 활성화되는 예외는 여러 가지 종류가 있다.

  • OPTIX_EXCEPTION_FLAG_NONE
    예외 집합이 없다 (기본값)

  • OPTIX_EXCEPTION_FLAG_STACK_OVERFLOW
    optixPipelineSetStackSize에 continuationStackSize parameter로 지정된 continuation stack에서 overflow 여부를 확인한다. 이 예외가 활성화되면 일반적으로 overhead는 무시할 수 있는 수준이다.

  • OPTIX_EXCEPTION_FLAG_TRACE_DEPTH
    새 ray을 trace하기 전에 ray depth가 OptixPipelineLinkOptions::maxTraceDepth로 지정된 값을 초과하는지 확인한다. 일부 stack overflow는 trace depth에 대한 예외도 활성화 된 경우 (또는 OptixpipelineLinkOptions::maxTraceDepth의 값이 올바른 경우)에만 감지된다. 이 예외가 활성화된 경우 overhead는 일반적으로 무시할 수 있는 수준이다.

  • OPTIX_EXCEPTION_FLAG_USE
    optixThrowException()을 활성화한다.

  • OPTIX_EXCEPTION_FLAG_DEBUG
    traversable list에 대한 overflow, runtime에 발생하는 traversable set의 유효성 검사, NaN 또는 inf 값에 대한 trace ray 유효성 검사, callable program의 parameter 수 유효성 검사, callable program 호출 시 SBT index 유효성 검사 등 다양한 runtime 검사를 활성화한다. 이예외를 활성화하면 GPU 유형과 활성화된 RTX 기능 세트에 따라 이 예외의 overhead는 무시할 수 있는 수준에서 심각한 수준까지 다양하다.

예외가 발생하면 exception program이 호출된다. exception program은 OptixShaderBindingTable::exceptionRecord에 설정된 SBT record로 지정할 수 있다. exception flag가 지정되었지만 exception program이 제공되지 않은 경우 기본 exceptio program운 optiX에서 제공된다. 이 기본 exception program은 exception print 양을 제한하기 위해 발생한 처음 5개의 예외를 stdout에 print한다. 예외를 발생시킨 위치로 제어가 반환되지 않고 실행 인덱스의 실행이 종료된다.

exception program에서 발생한 예외의 종류는 optixGetExceptionCode로 query할 수 있다. 기본 제공 예외에 대해 여러 예외 코드가 정의되어 있다. 일부 예외는 API함수에 의해 액세스되는 추가 정보를 제공한다.

  • OPTIX_EXCEPTION_CODE_STACK_OVERFLOW
    continuation stack overflow. 추가 정보 함수가 없다.

  • OPTIX_EXCEPTION_CODE_TRACE_DEPTH_EXCEEDED
    trace depth를 초과한 경우. 추가 정보 함수가 없다.

  • OPTIX_EXCEPTION_CODE_TRAVERSAL_DEPTH_EXCEED
    traversal depth를 초과했다. 추가 정보 함수 : optixGetTransformListSize(), optixGetTransformListHandle()

  • OPTIX_EXCEPTION_CODE_TRAVERSAL_INVALID_TRAVERSABLE
    traverse에 잘못된 traversable 유형이 발생한 경우이다. 추가 정보 함수 : optixGetTransformListSize(), optixgetTransformListHande(), optixGetExceptionInvalidTraversable()

  • OPTIX_EXCEPTION_CODE_TRAVESAL_INVALID_MISS_SBT
    miss SBT index 범위를 벗어났다. 추가 정보 함수 : optixGetExceptionInvalidSbtOffset()

  • OPTIX_EXCEPTION_CODE_TRAVERSAL_INAVLID_HIT_SBT
    traversal hit SBT record index의 범위를 벗어났다. 추가 정보 함수 : optixGetTransformListSize(), optixGetTransformListHandle(), optixGetExceptionInvalidSbtOffset(), optixGetSbtGASIndex()

  • OPTIX_EXCEPTION_CODE_INAVLID_RAY
    shader에서 부동 소수점 인자 중 하나 이상이 inf 도는 NaN이거나 tmin 인수가 음수인 optixTrace 호출이 발생한 경우. 추가 정보 함수 : optixGetExceptionInvalidRay()

  • OPTIX_EXCEPTION_CODE_CALLABLE_PARAMETER_MISMATCH
    shader에서 제공된 인자와 호출되는 callable program의 parameter가 일치하지 않는 optixDirectCall 또는 optixContinuationCall에 대한 호출이 발생했다. 추가 정보 함수 : optixGetExceptionParameterMismatch()

  • OPTIX_EXCEPTION_CODE_CALLABLE_INVALID_SBT
    callable program sbt record index가 범위르 벗어났다. 추가 정보 함수 : optixGetExceptionInvalidSbtOffset()

  • OPTIX_EXCEPTION_CODE_CALLABLE_NO_DC_SBT_RECORD
    callable program SBT record에는 direct callable program이 포함되어 있지 않다. 추가 정보 함수 : optixGetExceptionInvalidSbtOffset()

  • OPTIX_EXCEPTION_CODE_CALLABLE_NO_CC_SBT_RECORD
    callable program SBT record에 continuation program이 포함되지 않았다. 추가 정보 함수 : optixGetExceptionInvalidSbtOffset()

  • OPTIX_EXCEPTION_CODE_INSUPPORTED_SINGLE_LEVEL_GAS
    optixTrace에 전달된 tranversable handle은 GAS를 참조하지만, 관련 pipeline은 단일 GAS traversable을 지원하지 않는 경우 (OptixPipelineCompileOptions::traversableGraphFlags 참조) 추가 정보 함수 : optixGetTransformListSize(), optixGetTransformListHandle(), optixGetExceptionInvalidTraversable()

exception이 활성화된 경우 optixGetTriangleVertexData 및 optixGetInstanceTraversableFromIAS가 호출될 때 발생할 수 있는 예외코드는 다음과 같다.

  • OPTIX_EXCEPTION_CODE_INVALID_VALUE_ARGUMENT_0
    두 가지 조건에서 이 예외코드가 호출될 수 있다.

    • optixGetInstanceTraversableFromIAS 호출의 인자 IAS 값이 유효한 IAS가 아닌 경우
    • optixGetTriangleVertexData 호출의 인자 GAS가 유효한 GAS가 아닌 경우
  • OPTIX_EXCEPTION_CODE_INVALID_VALUE_ARGUMENT_1
    전달된 index가 범위를 벗어났다.

  • OPTIX_EXCEPTION_CODE_INVALID_VALUE_ARGUMENT_2
    optixGetTriangleVertexData에 전달된 sbtGASIndex가 범위를 벗어났다.

  • OPTIX_EXCEPTION_CODE_UNSUPPORTED_DATA_ACCESS
    세 가지 조건에서 이 예외 코드가 발생할 수 있다.
    OPTIX_BUILD_FLAG_ALLOW_RANDOM_VERTEX_ACCESS가 설정되지 않은 상태로 build된 AS에서 optixGetTriangleVertexData 함수가 호출되었다.
    OPTIX_BUILD_FLAG_ALLOW_RANDOM_INSTANCE_ACCESS가 설정되지 않은 상태에서 빌드된 AS에서 optixGetInstanceTraversableFromIAS 함수가 호출되었다.
    * motion이 활성화되지 않은 pipeline에서 motion을 사용하여 구축한 AS가 사용도니 경우

user exception는 0과 2^30-1 사이의 값으로 발생할 수 있다. 아래에 표시된 것처럼 1~9개의 인수로 구성된 함수 집합을 사용하여 0~8개의 32bit 값 세부 정보를 exception program에 전달하는 데 사용할 수도 있다.

exception program에서 optixGetExceptionDetail_0()부터 optixGetExceptionDetial_7()까지 8개의 함수를 사용하여 세부 정보를 query할 수 있다.

다른 예외 코드에 대한 세부 정보가 query되거나 query된 user exception 정보가 optixThrowException으로 설정되지 않은 경우 이러한 함수의 동작이 정의되지 않는다.

0개의 댓글