为了为Windows Store应用程序(和Windows Phone 8)Shader model 4_0_level_9_3构build着色器,您需要使用vs_4_0_level_9_3和ps_4_0_level_9_3。 尽pipe使用为DirectX 10或更高版本devise的HLSL语法听起来很好,但是我无法使用DirectX 9中的VPOS语义,也不能使用DirectX 10中的SV_POSITION并使用像素着色器。用于在剪辑空间输出顶点位置的语义?
PS:4_0_level_9_3上的一些着色器吐出了“内部错误:level9和d3d10着色器之间的blob内容不匹配”,我不知道这是什么意思。 可能与驱动程序有些不一致(我使用Nvidia GTX 560 TI),如果你只是用释放标志(比如优化级别3和避免stream量控制)编译你的着色器,那么我认为它会消失。
正如你所说,最好的办法就是把这些值作为二级语义(即传递“POSITION”和“SV_POSITION”值)。 请注意,如果您将SV_POSITION放置在顶点着色器的输出声明的末尾,则可以从像素着色器的输入声明中省略它。
关于内部错误,这通常是由于纹理或其他着色器输入的声明是一次优化而不是另一次。 禁用优化通常可以解决这个问题,但是您还应该能够通过消除未使用的(包括通过死代码消除)输入声明来解决这个问题,并确保避免复杂的代码缩减为空操作。