Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在对透明胶片使用阴影贴图技术时,此黑线会出现在投影阴影的边界上?_C++_Directx_Shader - Fatal编程技术网

C++ 为什么在对透明胶片使用阴影贴图技术时,此黑线会出现在投影阴影的边界上?

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

这是问题的屏幕截图:

你们可以注意到土星光环投影阴影顶部有一条黑线,它出现在任何物体阴影的所有边界上

这是我用来渲染深度贴图的像素着色器,我使用颜色的绿色和蓝色值来存储alpha值

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,看看会发生什么