将现有的 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.
我最近一直在处理一个旧的 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.