共用方式為


狀態物件

使用著色器模型 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 個位元組,每個) 相關聯光線追蹤著色器之光線承載中的 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 會對應至類型欄位設定為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 會對應至類型欄位設定為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
};

請注意,這三個欄位使用 匯出 的名稱。 如果應用程式選擇執行匯出-重新命名,則匯出的名稱可能與 HLSL 中的原始名稱不同。

備註

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

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

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

DirectX Raytracing (DXR) 功能規格

範例:D3D12RaytracingLibrarySubobjects