狀態物件
使用著色器模型 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 結構。
它有一個欄位,一個位旗標,也就是其中一個或兩者
- 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 關聯,而不是強制重新編譯著色器來解決不相符的專案。