共用方式為


狀態物件

使用著色器模型 6.3 和更新版本時,除了使用 Direct3D 12 API 之外,應用程式還能夠直接在 HLSL 著色器程式代碼中定義 DXR 狀態物件,並具有便利性和彈性。

在 HLSL 中,狀態物件會以下列語法宣告:

Type Name = 
{ 
    Field1,
    Field2,
    ...
};
專案 描述
類型
識別子物件的類型。 必須是其中一個支援的 HLSL 子物件類型。
名稱
可唯一識別變數名稱的 ASCII 字串。
Field[1, 2, ...]
子物件的欄位。 每個子物件類型的特定欄位如下所述。

子物件類型清單:

StateObjectConfig

StateObjectConfig 子物件類型會對應至 D3D12_STATE_OBJECT_CONFIG 結構。

它有一個字段,一個位旗標,也就是一個或兩者

  • STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS
  • STATE_OBJECT_FLAGS_ALLOW_EXTERNAL_DEPENDENCIES_ON_LOCAL_DEFINITIONS

或,其中兩者都不是零。

例:

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

三角形HitGroup 會對應至類型欄位設定為 D3D12_HIT_GROUP_TYPE_TRIANGLESD3D12_HIT_GROUP_DESC 結構。

此子物件是以語法宣告

TriangleHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader
};
專案 描述
名稱
可唯一識別變數名稱的 ASCII 字串。
AnyHitShader
點擊群組之 anyhit 著色器的字串名稱,或空字串。
ClosestHitShader
點擊群組最接近點擊著色器的字串名稱,或空字串。

例:

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

請注意,這兩個字段都會使用 匯出 名稱。 如果應用程式選擇進行匯出重新命名,導出的名稱可能與 HLSL 中的原始名稱不同。

ProceduralPrimitiveHitGroup

ProceduralPrimitiveHitGroup 對應至類型字段設定為 D3D12_HIT_GROUP_TYPE_PROCEDURAL_PRIMITIVED3D12_HIT_GROUP_DESC 結構。

此子物件是以語法宣告

ProceduralPrimitiveHitGroup Name = 
{ 
    AnyHitShader,
    ClosestHitShader,
    IntersectionShader
};
專案 描述
名稱
可唯一識別變數名稱的 ASCII 字串。
AnyHitShader
點擊群組之 anyhit 著色器的字串名稱,或空字串。
ClosestHitShader
點擊群組最接近點擊著色器的字串名稱,或空字串。
IntersectionShader
點擊群組的交集著色器字串名稱,或空字串。

例:

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

請注意,這三個字段使用 匯出 名稱。 如果應用程式選擇進行匯出重新命名,導出的名稱可能與 HLSL 中的原始名稱不同。

言論

子物件具有「關聯」的概念,或「哪個子對象與哪個匯出」的概念。

透過著色器程式代碼指定子物件時,選擇「哪一個子物件會隨哪個匯出一起」,遵循 DXR 規格中所述的規則。 特別是,假設應用程式有一些匯出。 如果應用程式透過著色器程式代碼與根簽章 A 建立關聯,以及透過應用程式程式代碼的根簽章 B,B 就是使用的專案。 「使用 B」而非「產生錯誤」的設計可讓應用程式使用應用程式程式代碼方便覆寫 DXIL 關聯,而不是被迫重新編譯著色器來解決不相符的問題。

DirectX 開發人員部落格文章「D3D12 的新功能 – DirectX Raytracing (DXR) 現在支援連結庫子物件」

DirectX 光追蹤 (DXR) 功能規格

範例:D3D12RaytracingLibrarySubobjects