次の方法で共有


State オブジェクト

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

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

Type Name = 
{ 
    Field1,
    Field2,
    ...
};
項目 説明

サブオブジェクトの種類を識別します。 サポートされている HLSL サブオブジェクト型のいずれかである必要があります。
名前
変数名を一意に識別する ASCII 文字列。
Field[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 を呼び出すと、デバイスは削除された状態になります。 そのため、レイトレーシング シェーダーは、トレース レイの呼び出しが最大再帰深度を満たしているか、超えている場合は、呼び出しを停止するように注意する必要があります。

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