[英]DirectX HLSL - Constant Buffer empty in Pixel Shader but not Vertex Shader
[英]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 float3
到float4
推断出实际编译着色器所需的一些“额外”内容(统一,输入并将代码制成实际函数),在尝试对其进行编译时会得到以下输出:
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.