繁体   English   中英

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

[英]DirectX HLSL shader implicit truncation of vector type error

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

这是导致错误的代码:

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; 然后编译项目。 谁能看到我在做什么错,谢谢。

出现此错误的原因是,您要多加/累加float3和float4。 您应该使用float4(float3,1.0f)或float4.xyz(使其变为float3)将float3 float3float4

推断出实际编译着色器所需的一些“额外”内容(统一,输入并将代码制成实际函数),在尝试对其进行编译时会得到以下输出:

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级别进行采样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM