Windows 应用商店应用着色器模型 4_0_level_9_3 和 VPOS

Posted

技术标签:

【中文标题】Windows 应用商店应用着色器模型 4_0_level_9_3 和 VPOS【英文标题】:Windows Store apps Shader model 4_0_level_9_3 and VPOS 【发布时间】:2012-10-21 10:10:26 【问题描述】:

要为 Windows 应用商店应用程序(和 Windows Phone 8)构建着色器模型 4_0_level_9_3,您需要使用 vs_4_0_level_9_3 和 ps_4_0_level_9_3。虽然使用为 DirectX 10 及更高版本设计的 HLSL 语法听起来不错,但我无法使用 DirectX 9 的 VPOS 语义或在像素着色器中使用 DirectX 10 及更高版本的 SV_POSITION,所以除了制作另一个输出裁剪空间中顶点位置的语义?

PS:4_0_level_9_3 上的一些着色器吐出“内部错误:level9 和 d3d10 着色器之间的 blob 内容不匹配”,我不知道这是怎么回事。可能与我认为的驱动程序有些不一致(我使用的是 Nvidia GTX 560 TI),如果您只使用发布标志编译着色器(如优化级别 3 并避免流控制),我认为它会消失。

【问题讨论】:

"我认为可能与驱动程序存在一些不一致(我使用的是 Nvidia GTX 560 TI),如果您仅使用发布标志编译着色器(如优化级别 3 并避免流控制),我认为它会消失)。” - 我在多台构建机器上看到过这种情况,关闭“禁用优化”可以解决问题。它不会阻止调试,只需注意编译指令的流程可能与您的 HLSL 中的流程有很大不同。我在所有功能级别使用相同的语义没有问题,特别是 SV_POSITION - 虽然我总是使用顶点布局结构...... 【参考方案1】:

正如您所说,您最好的选择是将这些值作为辅助语义传递(即同时传递“POSITION”和“SV_POSITION”值)。请注意,如果将 SV_POSITION 放在顶点着色器的输出声明的末尾,则可以在像素着色器的输入声明中省略它。

关于内部错误,这通常是由于声明的纹理或其他着色器输入在一个通道中优化但在另一通道中未优化。禁用优化通常可以解决该问题,但您也应该能够通过消除未使用的(包括通过消除死代码的)输入声明来修复它,并确保您避免复杂的代码,从而减少到无操作。

【讨论】:

以上是关于Windows 应用商店应用着色器模型 4_0_level_9_3 和 VPOS的主要内容,如果未能解决你的问题,请参考以下文章

[Unity] Shader(着色器)之纹理贴图

将像素着色器应用于图像

错误:无效的 vs_2_0 输出语义

Unity:将着色器应用于对象以使其纹理弯曲

在CG/HLSL中访问着色器的内容

Unity优化风格的着色器