C++ 为什么在对透明胶片使用阴影贴图技术时,此黑线会出现在投影阴影的边界上?
这是问题的屏幕截图: 你们可以注意到土星光环投影阴影顶部有一条黑线,它出现在任何物体阴影的所有边界上 这是我用来渲染深度贴图的像素着色器,我使用颜色的绿色和蓝色值来存储alpha值C++ 为什么在对透明胶片使用阴影贴图技术时,此黑线会出现在投影阴影的边界上?,c++,directx,shader,C++,Directx,Shader,这是问题的屏幕截图: 你们可以注意到土星光环投影阴影顶部有一条黑线,它出现在任何物体阴影的所有边界上 这是我用来渲染深度贴图的像素着色器,我使用颜色的绿色和蓝色值来存储alpha值 float depthValue; float4 color; float4 textureColor; textureColor = shaderTexture.Sample(SampleType, input.tex); depthValue = input.depthPosition.z / inp
float depthValue;
float4 color;
float4 textureColor;
textureColor = shaderTexture.Sample(SampleType, input.tex);
depthValue = input.depthPosition.z / input.depthPosition.w;
color = float4(depthValue, textureColor.a, textureColor.a, 1.0f);
return color;
这是我用来渲染最终显示颜色的像素着色器片段:
if((saturate(projectTexCoord.x) == projectTexCoord.x) && (saturate(projectTexCoord.y) == projectTexCoord.y))
{
float4 color_d = depthMapTexture.Sample(SampleTypeClamp, projectTexCoord);
depthValue = color_d.r;
lightDepthValue = input.lightViewPosition.z / input.lightViewPosition.w;
lightDepthValue = lightDepthValue - bias;
if(lightDepthValue < depthValue)
{
lightIntensity = saturate(dot(input.normal, lightDir));
}
else
{
lightIntensity = saturate(dot(input.normal, lightDir))*(1.0f - color_d.g);
}
}
if((饱和(projectTexCoord.x)==projectTexCoord.x)和&(饱和(projectTexCoord.y)==projectTexCoord.y))
{
float4 color_d=depthMapTexture.Sample(样本类型夹具,projectTexCoord);
深度值=颜色d.r;
lightDepthValue=input.lightViewPosition.z/input.lightViewPosition.w;
lightDepthValue=lightDepthValue-偏差;
if(lightDepthValue
很抱歉,我的信息含糊不清,但我真的不知道问题出在哪里,可能是代码中的其他地方,但它肯定不是我正在使用的纹理文件,所以它必须是代码
你知道我可以从哪里开始寻找这个问题吗?也许是阴影贴图纹理坐标采样超出了范围。我可以看到你正在检查,但我会测试它无论如何。 在您的州,是否有边框颜色集?试着将其设置为红色,看看这是否是问题所在 阴影贴图的深度是否与应用着色器的渲染目标的深度相同 编辑。这是我使用SampleCmpLevelZero的着色器代码:
if (ShadowCoord.x > 0.0f && ShadowCoord.x < 1.0f && ShadowCoord.y > 0.0f && ShadowCoord.y < 1.0f)
{
ShadowCoord.z -= 0.001f;
float a = 1;
a = ShadowMap.SampleCmpLevelZero(ShadowSampler, ShadowCoord.xy, ShadowCoord.z).r;
a = linearizeDepth(a);
ambient = float4(a,a,a, 0);
}
if(ShadowCoord.x>0.0f&&ShadowCoord.x<1.0f&&ShadowCoord.y>0.0f&&ShadowCoord.y<1.0f)
{
阴影坐标z-=0.001f;
浮点数a=1;
a=阴影贴图.SampleCmpLevelZero(阴影采样器,ShadowCoord.xy,ShadowCoord.z).r;
a=线性化深度(a);
环境=4(a,a,a,0);
}
问题在于D3D11_SAMPLER_DESC使用的纹理过滤器,它被设置为D3D11_filter_MIN_MAG_MIP_LINEAR,因此纹理被插值,有点软化了边界处的颜色和alpha值,这导致着色器读取那些柔和的alpha值,并在不需要的地方投射阴影
我使用D3D11_FILTER_COMPARISON_MIN_MAG_MIP_POINT作为过滤器创建了一个新的sampledesc,这样纹理将以基本不变的边界显示,就像深度着色器最初创建它一样。现在阴影已正确投射,边界不再有奇怪的黑线。谢谢@Stefan Agartsson,这些建议是我第一次检查的建议,但没有一个是问题的根源。虽然后来我发现它实际上与D3D11\u SAMPLER\u DESC有关,但我会在下面的答案中给出详细信息。当我检查自己的代码时,我有比较点集,很抱歉我本可以指出这一点。但我也使用SampleCmpLevelZero,而不仅仅是Sample,以备您尝试。在这种情况下,比较\u MIN\u MAG\u MIP\u POINT似乎效果更好。我已经编辑了我的答案,改为提到那个过滤器。我会检查SampleCmpLevelZero,看看会发生什么