簡體   English   中英

將現有的 D3D9 SH3 項目升級到 SH4?

[英]Upgrading an existing D3D9 SH3 project to SH4?

我有一個最近一直在處理的舊 DirectX 3D 9 Visual Stuido 項目。

我一直潛入渲染和 HLSL 着色器的世界,但對我來說很明顯 Shader Model 3 相當有限。 查看 Shader Model 3 和 4 的 MS Docs,似乎 4 是一個相當大的升級。 嘗試使用任何高於3_0的 HLSL 着色器編譯我的項目會產生error X3506: Only 3_x and earlier targets are supported on this compiler. ,因此我認為我的項目需要升級它的編譯器。

看來我的項目會自動從SysWOW64加載D3DCompiler_43.dll ,但是在查看該系統文件夾后,看來我已經有了D3DCompiler_47.dll 我還在網上讀到 SH4 有一個所謂的“傳統”模式,但是我對如何正確實現它有點困惑。 在查看 MS Docs 的編譯語法( https://docs.microsoft.com/en-us/windows/win32/direct3dtools/dx-graphics-tools-fxc-syntax )后,在編譯我的像素着色器時,使用關鍵字例如ps_4_0_level_9_0將允許它在 D3D9 上運行,但是會產生error X3523: DX9-style intrinsics are disabled when not in dx9 compatibility mode. . 在這一點上,我有點迷失了升級我的項目需要做什么。

是否可以在 D3D9 中將現有的 SH3 項目升級到 SH4? 甚至可以讓我的項目運行D3DCompiler_47.dll而不是D3DCompiler_43.dll嗎?

感謝您的幫助,感謝您閱讀我的帖子!

着色器模型 4.0 僅受 Direct3D 10 或更高版本支持。 要使用它,您必須遷移到舊版 Direct3D 9。建議遷移到 Direct3D 11。

Direct3D 9 時代的硬件不支持 Shader Model 4.0+ 着色器。 構建與Direct3D 硬件功能級別 9.x兼容的着色器所需的現代 Direct3D 的“10level9”HLSL 配置文件實際上會產生兩個着色器 blob:適用於 D3D10+ 硬件的着色器模型 4.0 和適用於 D3D9 硬件的着色器模型 2.x。

每當您嘗試通過編譯器的D3DX9接口使用 Shader Model 4 或更高版本時,都會輸出error X3506 如果您使用D3DCompile API,它就可以工作,盡管 #43 已經很老了。 您可以使用 D3DCompiler_47.DLL 為 Direct3D 9 構建 Shader Model 2.0 和 Shader Model 3.0。DLL 本身適用於 Windows 7 SP1 或更高版本,但不會在 Windows XP 上加載。 有關 #47 編譯器及其用途的更多信息,請參閱此博客文章

HLSL 編譯器有一個“兼容模式”來接受較舊的 DX9 樣式着色器語法。 這是/Gec開關或D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY標志。 這些“重大更改”是在 2008 年 3 月的舊版 DirectX SDK 中引入的:

  • 不能使用 double 類型。
  • 類型 half 不再可以用作全局變量類型。 這可以使用兼容性編譯標志 (/Gec) 來抑制。
  • float4 等內置類型不再可以通過 typedef 重新定義為其他類型。
  • 類型 void 作為參數或成員類型不再是合法的。
  • 浮點文字現在是“任意浮點”類型,在某些情況下會更改重載分辨率。
  • 默認參數現在總是靜態解析。 如果有原型,在函數定義中給出默認參數不再合法。 默認值只能在原型中給出。
  • 對於 inout 和 out 參數,默認參數值不再合法。
  • 不能再為函數指定目標限定符(即 ps_4_0)。
  • 現在,所有語義目標字符串都在解析時進行驗證,並且必須匹配有效的目標名稱。
  • 現在所有的全局變量都是隱式的。 這可以通過使用兼容性編譯標志 (/Gec) 來抑制。
  • 有符號和無符號值之間的比較現在會產生警告。
  • 在后續循環中重新定義循環變量會生成一個警告,指出該變量已被重新定義。
  • 技術名稱現在包含在全局范圍內。 因此,您不能擁有多個同名技術,並且您不能擁有同名的功能和技術。
  • 對於 Direct3D 10 目標,開發人員不再可以將兩個不同的變量綁定到同一個常量寄存器。

如果您使用的是 D3DCompiler_43.DLL,那么您仍然擁有舊版 DirectX SDK。 請注意,如今通過 NuGet 使用 D3DX9/D3DX10/D3DX11 有一個更好的選擇,可以避免與現代 Windows SDK 標頭發生大量沖突。 請參閱此博客文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM