1
float4x4 matInvViewProj;

float4 GetPointPosition(float2 Tex0)
{
    float4 PosImageSpace;
    PosImageSpace.xy = float2(Tex0*2-1);
    PosImageSpace.z = tex2D(DepthTextureSampler,Tex0).r;
    return mul(PosImageSpace,matInvViewProj);
}

这是我的像素着色器的一部分。为什么会出现编译器错误?我在ps_3_0. 没有mul()它编译的情况下编译它。

4

2 回答 2

1

啊,我想这是有道理的。由于 w 组件未初始化,因此 mul() 函数将失败。

为避免这种情况,您可以按如下方式初始化向量:

float4 PosImageSpace = (float4)0;

我仍然建议您尝试在调试模式下使用 fxc 编译着色器,因为这样可以获得更好的错误描述。您甚至可以设置自定义构建步骤,让您右键单击 .fx 文件并对其进行编译,而无需编译整个解决方案/项目。

在调试配置中使用 fxc 编译着色器:

fxc /Od /Zi /T fx_3_0 /Fo Directional_Lighting_Shader_Defaul.fxo Directional_Lighting_Shader_Defaul.fx

您可以在 C:\Program Files\Microsoft DirectX SDK\Utilities\bin 中找到 fxc

要在 Visual Studio 中设置自定义构建步骤,请检查 DirectX SDK 中的此示例检查此站点

另请查看msdn 上有关使用 fxc 的这篇文章。

于 2009-08-16T12:04:25.353 回答
0

这很奇怪:我添加了这一行:

PosImageSpace.w = 0.0f;

现在它编译得很好。这就是它现在的样子:

float4x4 matInvViewProj;

float4 GetPointPosition(float2 Tex0)
{
    float4 PosImageSpace;
    PosImageSpace.xy = float2(Tex0*2-1);
    PosImageSpace.z = tex2D(DepthTextureSampler,Tex0).r;
    PosImageSpace.w = 0.0f;
    return mul(PosImageSpace,matInvViewProj);
}
于 2009-08-17T08:15:40.837 回答