嗨我在一个像素着色器中出现错误,隐式截断矢量类型。
以下是导致错误的代码:
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;然后项目编译。任何人都可以看到我做错了什么,谢谢。
答案 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级别。