DX11-方向光阴影贴图深度值始终返回1

时间:2019-11-27 14:54:19

标签: c++ directx-11 shadow-mapping

我正在DirectX11中开发一个图形程序,该程序获取一个高度图,基于该高度图操纵平面,计算法线,并使用定向光照亮场景。我正在尝试使阴影映射与定向光一起使用,但是每当我在像素着色器中进行深度测试时,它总是返回1,而不是期望值。

这是我的主要像素着色器

Texture2D t0 : register(t0);
Texture2D t1 : register(t1);

SamplerState s0 : register(s0);
SamplerState s1 : register(s1);

cbuffer LightBuffer : register(b0)
{
    float4 diffuseColour;
    float3 lightDirection;
    float padding;    
}

struct InputType
{
    float4 position : SV_POSITION;
    float4 tex: TEXCOORD0;
    float3 normal : normal;
    float4 lightViewPos : TEXCOORD1;
};

float4 calculateLighting(float3 lightDirection, float3 normal, float4 diffuse)
{
    float intensity = saturate(dot(normal, lightDirection));
    float4 colour = saturate(diffuse * intensity);
    return colour;
}

float4 main(InputType input) : SV_TARGET
{
    float depthValue;
    float lightDepthValue;
    float shadowMapBias = 0.005f;
    float4 colour = float4(0.f, 0.f, 0.f, 1);
    float4 textureColour = t0.Sample(s0, input.tex.xy);

    float2 pTexCoord = input.lightViewPos.xy / input.lightViewPos.w;
    pTexCoord *= float2(0.5, -0.5);
    pTexCoord += float2(0.5, 0.5);

    if (pTexCoord.x < 0.0f || pTexCoord.x > 1.0f ||
        pTexCoord.y < 0.0f || pTexCoord.y > 1.0f)
    {
        return textureColour;
    }

    depthValue = t1.Sample(s1, pTexCoord).r;

    lightDepthValue = input.lightViewPos.z / input.lightViewPos.w;
    lightDepthValue -= shadowMapBias;

    if (lightDepthValue < depthValue)
    {
        //colour = float4(1, 1, 1, 1);
        colour = calculateLighting(-lightDirection, input.normal, diffuseColour);
    }

    // This is a test to see what the depth value outputs as
    if (depthValue == 0)
        return float4(1, 0, 1, 1);
    else if (depthValue == 1)
        return float4(1, 1, 1, 1); // Always returns this
    else
        return float4(0, 1, 0, 1);
    //return float4(depthValue, depthValue, depthValue, 1.0f);
    // return saturate(colour * textureColour);
}

我的深度顶点着色器:

Texture2D t0 : register(t0);
SamplerState s0 : register(s0);

cbuffer MatrixBuffer : register(b0)
{
    matrix worldMatrix;
    matrix viewMatrix;
    matrix projectionMatrix;
}

struct InputType
{
    float4 position : position;
    float2 tex : TEXCOORD0;
};

struct OutputType
{
    float4 position : SV_POSITION;
    float4 depthPosition : TEXCOORD0;
};

OutputType main(InputType input)
{
    OutputType output;
    output.position = mul(input.position, worldMatrix);
    if (t0.SampleLevel(s0, input.tex, 0).r > 0.05f)
        output.position.y += (t0.SampleLevel(s0, input.tex, 0).r * 50.0f);

    output.position = mul(output.position, viewMatrix);
    output.position = mul(output.position, projectionMatrix);

    output.depthPosition = output.position;

    return output;
}

还有我的深度像素着色器:

struct InputType
{
    float4 position : SV_POSITION;
    float4 depthPosition : TEXCOORD0;
};

float4 main(InputType input) : SV_Target
{
    float depthValue;
    depthValue = input.depthPosition.z / input.depthPosition.w;
    return float4(depthValue, depthValue, depthValue, 1.0f);
}

我知道深度数据已正确写入渲染纹理,因为我已经在屏幕current view + normals shown to demonstrate topography instead of a flat white plane上预览了它。

0 个答案:

没有答案