次の方法で共有


State オブジェクト

シェーダー モデル 6.3 以降では、アプリケーションには、Direct3D 12 API の使用に加えて、HLSL シェーダー コードで DXR 状態オブジェクトを直接定義できる便利さと柔軟性があります。

HLSL では、状態オブジェクトは次の構文で宣言されます。

Type Name = 
{ 
    Field1,
    Field2,
    ...
};
アイテム 形容
型の
サブオブジェクトの種類を識別します。 サポートされている HLSL サブオブジェクトの種類のいずれかである必要があります。
名の
変数名を一意に識別する ASCII 文字列。
フィールド[1, 2, ...]
サブオブジェクトのフィールド。 各タイプのサブオブジェクトの特定のフィールドを以下に示します。

サブオブジェクトの種類の一覧:

StateObjectConfig

StateObjectConfig サブオブジェクトの種類は、D3D12_STATE_OBJECT_CONFIG 構造体に対応します。

1 つのフィールド(ビットごとのフラグ)があります。これは、次のいずれかまたは両方です。

  • STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
  • STATE_OBJECT_FLAGS_ALLOW_EXTERNAL_DEPENDENCIES_ON_LOCAL_DEFINITIONS

または、どちらの場合も 0。

例:

StateObjectConfig MyStateObjectConfig = 
{ 
    STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
};

GlobalRootSignature

GlobalRootSignature は、D3D12_GLOBAL_ROOT_SIGNATURE 構造体に対応します。

フィールドは、ルート署名の部分を記述する文字列の数で構成されます。 詳細については、HLSL でのルート署名の指定に関するを参照してください。

例:

GlobalRootSignature MyGlobalRootSignature =
{
    "DescriptorTable(UAV(u0)),"                     // Output texture
    "SRV(t0),"                                      // Acceleration structure
    "CBV(b0),"                                      // Scene constants
    "DescriptorTable(SRV(t1, numDescriptors = 2))"  // Static index and vertex buffers.
};

LocalRootSignature

LocalRootSignature は、D3D12_LOCAL_ROOT_SIGNATURE 構造体に対応します。

グローバル ルート署名サブオブジェクトと同様に、フィールドはルート署名の部分を記述するいくつかの文字列で構成されます。 詳細については、HLSL でのルート署名の指定に関するを参照してください。

例:

LocalRootSignature MyLocalRootSignature = 
{
    "RootConstants(num32BitConstants = 4, b1)"  // Cube constants 
};

SubobjectToExportsAssocation

既定では、エクスポートと同じライブラリで宣言されたサブオブジェクトは、そのエクスポートに適用できます。 ただし、アプリケーションでは、これをオーバーライドし、どのサブオブジェクトがどのエクスポートに使用されるのかについて具体的に取得できます。 HLSL では、この "明示的な関連付け" は SubobjectToExportsAssocation を使用して行われます。

SubobjectToExportsAssocation は、D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION 構造体に対応します。

このサブオブジェクトは、構文を使用して宣言されます。

SubobjectToExportsAssocation Name = 
{ 
    SubobjectName,
    Exports
};
アイテム 形容
名の
変数名を一意に識別する ASCII 文字列。
SubobjectName
エクスポートされたサブオブジェクトを識別する文字列。
エクスポート
エクスポートのセミコロン区切りのリストを含む文字列。

例:

SubobjectToExportsAssociation MyLocalRootSignatureAssociation =
{
    "MyLocalRootSignature",    // Subobject name
    "MyHitGroup;MyMissShader"  // Exports association 
};

両方のフィールドでエクスポートされた 使用されることに注意してください。 アプリケーションがエクスポート名の変更を行うことを選択した場合、エクスポートされた名前は HLSL の元の名前とは異なる場合があります。

RaytracingShaderConfig

RaytracingShaderConfig は、D3D12_RAYTRACING_SHADER_CONFIG 構造体に対応します。

このサブオブジェクトは、構文を使用して宣言されます。

RaytracingShaderConfig Name = 
{ 
    MaxPayloadSize,
    MaxAttributeSize
};
アイテム 形容
名の
変数名を一意に識別する ASCII 文字列。
MaxPayloadSize する
関連付けられたレイトレーシング シェーダーのレイ ペイロード内のスカラーの最大ストレージ (それぞれ 4 バイトとしてカウント) の数値。
MaxAttributeSize
関連付けられたレイトレーシング シェーダーの属性に使用できるスカラーの最大数 (それぞれ 4 バイトとしてカウント) の数値。 この値は D3D12_RAYTRACING_MAX_ATTRIBUTE_SIZE_IN_BYTESを超えることはできません。

例:

RaytracingShaderConfig MyShaderConfig =
{
    16,  // Max payload size
    8    // Max attribute size
};

RaytracingPipelineConfig

RaytracingPipelineConfig は、D3D12_RAYTRACING_PIPELINE_CONFIG 構造体に対応します。

このサブオブジェクトは、構文を使用して宣言されます。

RaytracingPipelineConfig Name = 
{ 
    MaxTraceRecursionDepth
};
アイテム 形容
名の
変数名を一意に識別する ASCII 文字列。
MaxTraceRecursionDepth
レイトレーシング パイプラインのレイ再帰に使用する数値の制限。 0 ~ 31 の範囲の数値です。

例:

RaytracingPipelineConfig MyPipelineConfig =
{
    1  // Max trace recursion depth
};

レイトレーシングの再帰にはパフォーマンス コストがかかるため、アプリケーションでは目的の結果に必要な最小の再帰深度を使用する必要があります。

シェーダー呼び出しがまだ最大再帰深度に達していない場合は、任意の回数 TraceRay 呼び出すことができます。 ただし、再帰の最大深度に達するか超えた場合、TraceRay を呼び出すと、デバイスは削除された状態になります。 そのため、レイトレーシング シェーダーは、再帰の深さの最大値を満たしているか超えた場合に TraceRay の呼び出しを停止するように注意する必要があります。

TriangleHitGroup

TriangleHitGroup は、Type フィールドが D3D12_HIT_GROUP_TYPE_TRIANGLESに設定されている D3D12_HIT_GROUP_DESC 構造体に対応します。

このサブオブジェクトは、構文を使用して宣言されます。

TriangleHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader
};
アイテム 形容
名の
変数名を一意に識別する ASCII 文字列。
AnyHitShader する
ヒット グループの anyhit シェーダーの文字列名、または空の文字列。
ClosestHitShader
ヒット グループに最も近いヒット シェーダーの文字列名、または空の文字列。

例:

TriangleHitGroup MyHitGroup =
{
    "",                    // AnyHit
    "MyClosestHitShader",  // ClosestHit
};

両方のフィールドでエクスポートされた 使用されることに注意してください。 アプリケーションがエクスポート名の変更を行うことを選択した場合、エクスポートされた名前は HLSL の元の名前とは異なる場合があります。

ProceduralPrimitiveHitGroup

ProceduralPrimitiveHitGroup は、Type フィールドが D3D12_HIT_GROUP_TYPE_PROCEDURAL_PRIMITIVEに設定されている D3D12_HIT_GROUP_DESC 構造体に対応します。

このサブオブジェクトは、構文を使用して宣言されます。

ProceduralPrimitiveHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader,
    IntersectionShader
};
アイテム 形容
名の
変数名を一意に識別する ASCII 文字列。
AnyHitShader する
ヒット グループの anyhit シェーダーの文字列名、または空の文字列。
ClosestHitShader
ヒット グループに最も近いヒット シェーダーの文字列名、または空の文字列。
IntersectionShader
ヒット グループの交差シェーダーの文字列名、または空の文字列。

例:

ProceduralPrimitiveHitGroup MyProceduralHitGroup
{
    "MyAnyHit",       // AnyHit
    "MyClosestHit",   // ClosestHit
    "MyIntersection"  // Intersection
};

3 つのフィールドでは、エクスポートされた 使用されることに注意してください。 アプリケーションがエクスポート名の変更を行うことを選択した場合、エクスポートされた名前は HLSL の元の名前とは異なる場合があります。

備考

サブオブジェクトには、"関連付け" または "どのサブオブジェクトがどのエクスポートに使用されるか" という概念があります。

シェーダー コードを使用してサブオブジェクトを指定する場合、"どのサブオブジェクトがどのエクスポートに使用するか" の選択は、DXR 仕様で説明されている規則に従います。 特に、アプリケーションにエクスポートがあるとします。 アプリケーションがシェーダー コードを介してルート署名 A にエクスポートし、アプリケーション コードを通じてルート署名 B を関連付ける場合、B が使用されます。 "エラーを生成する" の代わりに "B を使用する" という設計により、アプリケーションは、不一致を解決するためにシェーダーを再コンパイルするのではなく、アプリケーション コードを使用して DXIL の関連付けを簡単にオーバーライドできます。

DirectX 開発者向けブログ記事「D3D12 の新機能 - DirectX レイトレーシング (DXR) でライブラリ サブオブジェクトがサポートされるようになりました」

DirectX レイトレーシング (DXR) 機能仕様

サンプル: D3D12RaytracingLibrarySubobjects