DX11的陷阱?

这两天重新把延迟渲染的shader重新移回到DX11下。
碰到以下恶心的事情(当然,DX9恶心的事情更多,但凡是恶心的东西,都要吐槽以下)。
---------------------------------------------
1.  DX11对Shader之间的linkage更加严格,当然这个有助于你的shader正确,只是Debug的改那一堆东西十分讨厌。
2.  for循环的小心用。第一次碰到一个编译不过去的(双循环).
     第二次碰到的问题更恶心。
     为了计算Cascaded的Cascaded Index . 
     我是这么干的。

 #define   eMAX_CASACADE 4
float4x4  csmShadowMap    [eMAX_CASACADE];
float     csmSplitValueMin[eMAX_CASACADE];
float     csmSplitValueMax[eMAX_CASACADE];
float CalcShadowMap(float zView , float3 vPosition , float4 _ShadowMapSize , float fLDotN)
{
    int idx = 0;
    for(int i = 0 ; i < eMAX_CASACADE ; i ++)
    {
        if(csmSplitValueMin[i] <= zView && csmSplitValueMax[i] >= zView)
        {
           idx = i;
           break;
        }
    }
   //计算代码。
}

C++那边是这么传递参数的。
float     csmSplitValueMin[eMAX_CASACADE];
float     csmSplitValueMax[eMAX_CASACADE];
pShaderTable->setParam(L"csmSplitValueMin" , csmSplitValueMin , eMAX_CASACADE);
.....
传过去的数值竟然不对。感觉就是第一个数过去了,用GPA去看了一下。貌似是对的。但是在 Shader里怎么都算不对。

后来换了一种写法。
float4    csmSplitValueMin;
float4    csmSplitValueMax;
float CalcShadowMap(float zView , float3 vPosition , float4 _ShadowMapSize , float fLDotN)
{
    int idx = 0;
    zView = abs(zView);
    float fSplitValueMin = csmSplitValueMin.x;
    float fSplitValueMax = csmSplitValueMax.x;
    if(csmSplitValueMin.x <= zView && csmSplitValueMax.x >= zView)
    {
        idx = 0;
    }
    else if(csmSplitValueMin.y <= zView && csmSplitValueMax.y >= zView)
    {
        idx = 1;
        fSplitValueMin = csmSplitValueMin.y;
        fSplitValueMax = csmSplitValueMax.y;
    }
    else if(csmSplitValueMin.z <= zView && csmSplitValueMax.z >= zView)
    {
        idx = 2;
        fSplitValueMin = csmSplitValueMin.z;
        fSplitValueMax = csmSplitValueMax.z;
    }
    else if(csmSplitValueMin.w <= zView && csmSplitValueMax.w >= zView)
    {
        idx = 3;
        fSplitValueMin = csmSplitValueMin.w;
        fSplitValueMax = csmSplitValueMax.w;
    }
}

这样才搞定。。

慢慢找原因是为啥吧。困。洗洗睡了?还是再改改?



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值