14. シェーダーと実行パイプライン
Traversal
• この部分のDXRとしての正式な呼称はない
• RayとAcceleration Structuresとの交差判定を行うプログラム
• ここをプログラムすることはできない。DXRに隠蔽されている
• 役割
• ASとRayの交差判定を行う
• BLASの末端ノードとの交差が発生した場合は、
必要に応じて後述のIntersectionやAny Hitを呼び出す
Ray Generation TraceRay() Traversal Intersection Any Hit
Closest Hit MissCallable
15. シェーダーと実行パイプライン
Intersection (IS)
• BLASの末端ノードに定義したAABBとRayの交差が発生した際に呼び出される
• 基本的な役割の例
• AABB内にユーザーが定義したジオメトリと交差判定を行い、交差している場合は、
ReportHit()というHLSL組み込み関数を呼び出す
• ReportHit()を呼び出す際は、Attributeと呼ばれるPayloadとは別のユーザー定義構造体に
任意のデータを格納し、AnyHitに情報を渡す
• このシェーダーは、三角形との交差判定を行う場合は省略する
• DXRが三角形との交差判定を行い、システム定義のAttributeと共にAnyHitを呼び出す
Ray Generation TraceRay() Traversal Intersection Any Hit
Closest Hit MissCallable
16. シェーダーと実行パイプライン
Any Hit (AH)
• ISがReportHit()を呼び出すか、DXRの三角形との交差判定プログラムが、
交差を検出した場合に呼び出される
• AnyHitはRayがジオメトリと交差するたびに複数回呼び出される可能性がある
• 呼び出される順番は、RayのOriginに近い方からとは限らない
• ISが定義したAttributeを読むことができる
• RGが定義したPayloadを読をみ書きすることができる
Ray Generation TraceRay() Traversal Intersection Any Hit
Closest Hit MissCallable
1
2
3
17. シェーダーと実行パイプライン
Any Hit (AH)
• IgnoreHit()という組み込み関数を呼び出すことで、Rayとジオメトリの交差が無効であ
ることを通知できる
• AcceptHitAndEndSearch()という組み込み関数を呼び出すことで、
直ちにRayのTraversalを終了することができる
• 基本的な役割
• 交差判定の最終的な決定
• ISではできない、Payloadの更新作業
• このシェーダーは、省略可能
Ray Generation TraceRay() Traversal Intersection Any Hit
Closest Hit MissCallable
1
2
3
18. シェーダーと実行パイプライン
Closest Hit (CHS)
• RayのTraverseが終了した後、ジオメトリとの交差が発生した中で、T値がもっとも小さ
かった時の、各種システム定義変数とAttributeとともに一度だけ呼び出される
• システム定義変数は、たとえば、インスタンスのIDやプリミティブのIDなど
• RGが定義した、Payloadを読をみ書きすることができる
• 主な役割
• サーフェースのシェーディング(?)
• 2次Rayの生成
• このシェーダーは省略可能
Ray Generation TraceRay() Traversal Intersection Any Hit
Closest Hit MissCallable
20. シェーダーと実行パイプライン
Callable
• RG, CHS, MS, Callableは、組み込み関数CallShader()を介して呼び出すことができる
• 呼び出し元が定義した任意の構造体を読み書きすることができる
• ただのサブルーチンではない
• Rayや、プリミティブに関するシステム定義の値にアクセスすることはできない
• ShaderTable(後述)の定義に基づいたシェーダーリソース(TextureやCBなど)にアクセスできる
• このシェーダーの定義は任意
Ray Generation TraceRay() Traversal Intersection Any Hit
Closest Hit MissCallable
21. Ray Tracing Programsについて
• 6種類のShaderが、4種類のRay Tracing Programとして定義される
• 個々のRay Tracing Programは
• 別々のRoot Signatureを定義できる
• ユニークなShader Identifierを持つ
• Shader identifierは後述するShader Tableに設定することができる
• CHS,IS,AHはRoot Signatureを共有しなくてはならない。
• これをHit Groupと呼ぶ
Ray Generation TraceRay() Traversal Intersection Any Hit
Closest Hit MissCallable
22. Ray Tracing Pipeline State Objectについて
• Ray Tracing Pipeline State Object(RtPSO)は複数のRay Tracing Programを
まとめたもの
• 実質的には、シェーダーコードのリンク作業
• 使用するすべてのRoot Signatureと、AttributeやPayloadの最大サイズや、
TraceRay()の再帰呼び出しの最大回数も定義する
• このオブジェクトをDispatchRays()を呼び出すときに指定する
• 使用するすべてのシェーダーが含まれていなければならない
• RtPSOを作成した後、各Shader ProgramのShader Identifierが取得できる
Shader
Shader
Shader
Shader
Shader
Shader
Program
Program
Program
Program
Ray Tracing Pipeline State Object
38. GPUのThreadのスケジューリングについて
• ある一定の数のThreadが、ひとつの塊として扱われ、
同じプログラムを同時に実行する必要がある
DispatchRays() [10000]
Thread Group [50]Thread Group [50] Thread Group [50]Thread Group [50]
Thread Group [50]Thread Group [50] Thread Group [50]Thread Group [50]
Thread Group [50]Thread Group [50] Thread Group [50]Thread Group [50]
Thread Group [50]Thread Group [50] Thread Group [50]Thread Group [50]
Thread Group [50]Thread Group [50] Thread Group [50]Thread Group [50]
x10
50. Closest Hit, Missの呼び出し
• Closest Hit, MissはTraversalの動作から独立している
• 同じHitGroupに属する場合は並列実行される
• 異なれば、ThreadGroup内で、逐次実行される
Hit Group : A
Hit Group : B
Closest Hit
Closest Hit
Miss
51. TraceRay()の再帰呼び出し
• Miss, Closest HitはTraceRay()を再帰的に呼び出すことができる
• HitGroupが異なるShaderで逐次実行となっていると、
TraceRay()も逐次呼び出しとなる
TraceRay() Hit Group : A
Hit Group : B
Closest Hit
Closest Hit