State オブジェクト
シェーダー モデル 6.3 以降では、アプリケーションには、DIRECT3D 12 API の使用に加えて、HLSL シェーダー コードで DXR 状態オブジェクトを直接定義できる便利さと柔軟性があります。
HLSL では、状態オブジェクトは次の構文で宣言されます。
Type Name =
{
Field1,
Field2,
...
};
項目 | 説明 |
---|---|
型 |
サブオブジェクトの種類を識別します。 サポートされている HLSL サブオブジェクト型のいずれかである必要があります。 |
名前 |
変数名を一意に識別する ASCII 文字列。 |
Field[1, 2, ...] |
サブオブジェクトのフィールド。 以下では、各タイプのサブオブジェクトの特定のフィールドについて説明します。 |
サブオブジェクトの種類の一覧:
- StateObjectConfig
- GlobalRootSignature
- LocalRootSignature
- SubobjectToExportsAssocation
- RaytracingShaderConfig
- RaytracingPipelineConfig
- TriangleHitGroup
- ProceduralPrimitiveHitGroup
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 関連付けを簡単にオーバーライドできます。