那些年的狗血bug-----shadow

看了Directx 11龙书中讲阴影的一章后,自己迫不及待的开始动手写~~
于是噼里啪啦一阵之后,代码终于敲完了,于是开始了漫长的调试过程

小问题不断不过也很好解决,很快Basic模式和Normal Map模式都能很好的运行~然而,Displacement Map模式下的阴影并非如此~~
出现了如下的画面:
这里写图片描述

从图中可以发现,柱子的阴影不见了(好吧,从右下角的调试纹理中也能看出来~~
于是乎,阴影哪去了呢?
因为小球和骷髅的阴影是存在的,然而,柱子的却没有~所以自然而然的想到去看他们渲染时的区别~
小球和骷髅头并不需要实现Displacement Map,因此使用的是Basic Effect
因此可以猜测是Displacement Map相应的hlsl文件或者effectfactory文件出错了(我每种效果都有一个effect factory),在验证hlsl代码的正确性的过程中,进一步的加深了对于阴影的理解,however , no birds use(然而,并没有什么鸟用…
既然hlsl的逻辑没有问题,那么应该是effect factory出错了~于是乎,再查,还是没有发现。。。
于是乎,既然Basic Effect可以完美运行,那么将Displacement Map的效果改成和Basic Effect一样得了,这样就能知道哪里出错了~~即让Displacement Map效果的细分阶段不起作用就好了~
既然如此的话,那么就修改TessFactor , InsideFactor恒等于1好了,这样细不细分就都一样了~
果然程序跑出来了~简直是我了个大槽~那么问题肯定是出在TessFactor , InsideFactor的计算上,但是逻辑并没有问题,那么猜测是外部传入的数据有问题,于是乎,去查找effect factory设置数据的部分,黄天不负有心人,找到了如下的代码:
这里写图片描述
即:

    TessBuildShadowMapEffect::VertexShader::cbPerTess value;
    value.MinTessDistance = MinTessDistance;
    value.MaxTessDistance = MaxTessDistance;
    value.MinTessFactor = MinTessFactor;
    value.MaxTessDistance = MaxTessDistance;
    value.EyePosW = EyePosW;

    mTessConstantBuffer.SetData( deviceContext , value );

显然有一句重复了。。。
实际上结构体为:
这里写图片描述
即:

        struct cbPerTess
        {
            float gMaxTessDistance;
            float gMinTessDistance;
            float gMinTessFactor;
            float gMaxTessFactor;

            DirectX::XMFLOAT3 EyePosW;
            float Padding;
        };

所以终于知道错在哪里了~~改正后:
这里写图片描述
即:

    TessBuildShadowMapEffect::VertexShader::cbPerTess value;
    value.MinTessDistance = MinTessDistance;
    value.MaxTessDistance = MaxTessDistance;
    value.MinTessFactor = MinTessFactor;
    value.MaxTessFactor = MaxTessFactor;
    value.EyePosW = EyePosW;

    mTessConstantBuffer.SetData( deviceContext , value );

程序运行如下(Displacement Map,因为之前也只有这个模式有问题):
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值