使用著色器模型 6.3 和更新版本時,除了使用 Direct3D 12 API 之外,應用程式還能夠直接在 HLSL 著色器程式代碼中定義 DXR 狀態物件,並具有便利性和彈性。
在 HLSL 中,狀態物件會以下列語法宣告:
Type Name =
{
Field1,
Field2,
...
};
專案 | 描述 |
---|---|
類型 |
識別子物件的類型。 必須是其中一個支援的 HLSL 子物件類型。 |
名稱 |
可唯一識別變數名稱的 ASCII 字串。 |
Field[1, 2, ...] |
子物件的欄位。 每個子物件類型的特定欄位如下所述。 |
子物件類型清單:
- StateObjectConfig
- GlobalRootSignature
- LocalRootSignature
- SubobjectToExportsAssocation
- RaytracingShaderConfig
- RaytracingPipelineConfig
- 三角形HitGroup
- 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 個字節)。 |
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_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 關聯,而不是被迫重新編譯著色器來解決不相符的問題。