将现有的 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 文档,似乎 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 文档 (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

感谢任何帮助,感谢您阅读我的post!

Shader Model 4.0 仅受 Direct3D 10 或更高版本支持。要使用它,您必须越过旧版 Direct3D 9。建议迁移到 Direct3D 11。

Shader Model 4.0+ shaders are not supported by Direct3D 9 era hardware. The "10level9" HLSL profiles for modern Direct3D that are required to build shaders compatible with Direct3D Hardware Feature Level 9.x actually produces TWO shader blobs: Shader Model 4.0 for D3D10+ hardware and Shader Model 2.x for D3D9 hardware.

每当您尝试通过编译器的 D3DX9 接口使用 Shader Model 4 或更高版本时,都会输出 error X3506。如果您在 #47 编译器上使用 D3DCompile APIs, although #43 is quite old. You can use the D3DCompiler_47.DLL to build Shader Model 2.0 and Shader Model 3.0 for Direct3D 9. The DLL itself works on Windows 7 SP1 or later, but won't load on Windows XP. See this blog post 以获得更多信息,它会起作用。

HLSL 编译器有一个 'compatibility mode' 可以接受旧的 DX9 风格的着色器语法。这是 /Gec 开关或 D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY 标志。这些 'breaking changes' 是在 2008 年 3 月的旧版 DirectX SDK 中引入的:

  • 无法使用 double 类型。
  • type half 不能再用作全局变量类型。这可以使用兼容性编译标志 (/Gec) 来抑制。
  • Built-in 类型(例如 float4)不再可以通过 typedef 重新定义为其他类型。
  • 类型 void 作为参数或成员类型不再合法。
  • Floating-point 文字现在是“任意浮点数”类型,在某些情况下改变了重载分辨率。
  • 默认参数现在总是静态解析。如果有原型,在函数定义中提供默认参数不再合法。默认值只能在原型中给出。
  • 输入输出参数的默认参数值不再合法。
  • 不能再为函数指定目标限定符(即 ps_4_0)。
  • 所有语义目标字符串现在都在解析时进行验证,并且必须匹配有效的目标名称。
  • 所有全局变量现在都是隐式常量。这可以通过使用兼容性编译标志 (/Gec) 来抑制。
  • 有符号和无符号值之间的比较现在会产生警告。
  • 在后续循环中重新定义循环变量会生成警告,指出该变量已被重新定义。
  • 技术名称现在包含在全局范围内。因此,不能有多个同名技术,不能有同名功能和同名技术。
  • 对于 Direct3D 10 目标,开发人员不能再将两个不同的变量绑定到同一个常量寄存器。

If you are using D3DCompiler_43.DLL, then you still have the legacy DirectX SDK. Note that there's a better option for using D3DX9/D3DX10/D3DX11 these days via NuGet that avoids numerous conflicts with modern Windows SDK headers. See this blog post.