DirectX HLSL着色器隐式截断向量类型错误

时间:2015-03-14 00:27:53

标签: c++ visual-studio directx hlsl

嗨我在一个像素着色器中出现错误,隐式截断矢量类型。

以下是导致错误的代码:

float3 colour = 0;
float3 ppColour = SceneTexture.Sample(PointSample, ppIn.UV);
float4 col = SceneTexture.Sample(PointSample, ppIn.UV);
float intensity = 0.0f;
float r = SceneTexture.Sample(PointSample, ppIn.UV).r;
float g = SceneTexture.Sample(PointSample, ppIn.UV).g;
float b = SceneTexture.Sample(PointSample, ppIn.UV).b;
float a = SceneTexture.Sample(PointSample, ppIn.UV).a;
intensity = r + g + b + a;

if (intensity > 5.0f)
{
    for (int count = 0; count < 13; count++)
    {
        colour += SceneTexture.Sample(TrilinearSampler, ppIn.UV + PixelKernel[count] * BlurStrength) * BlurWeights[count];
    }
    return float4(colour, 1.0f);
}

return float4(ppColour, 1.0f);

如果我评论出强度= r + g + b + a;然后项目编译。任何人都可以看到我做错了什么,谢谢。

2 个答案:

答案 0 :(得分:1)

你得到这个错误的原因是,你正在多次/加载float3和float4。您应该使用float4(float3,1.0f)或float4.xyz(使其成为float3)将float3“强制转换为float4

答案 1 :(得分:0)

推断一些额外的&#39;实际编译着色器所需的东西(制服,输入,并将代码转换为实际函数),尝试编译时得到以下输出:

test.ps(16,9): warning X3206: implicit truncation of vector type
test.ps(29,11): warning X3206: implicit truncation of vector type
test.ps(29,11): error X4014: cannot have gradient operations inside loops with divergent flow control

正如您所看到的,截断消息只是警告,而不是错误,除非您使用/WX进行编译。这些警告的问题在于您将纹理样本的结果分配给float3,但返回实际上是float4。您可以选择具有混合的适当组件,也可以更改变量类型。例如:

float4 ppColour = SceneTexture.Sample(PointSample, ppIn.UV);

实际错误的原因是您不能在动态循环中进行样本插值,或在条件语句中循环。在这种情况下,您的循环位于if (intensity > 5.0)条件内。您有两个选项,要么可以删除条件,要么可以使用SampleLevel而不是Sample:

colour += SceneTexture.SampleLevel(TrilinearSampler, ppIn.UV + PixelKernel[count] * BlurStrength, 0) * BlurWeights[count];

注意:像这样使用SampleLevel将始终采样顶级mip级别。