DX11的陷阱?

來源:互聯網
上載者:User

這兩天重新把延遲渲染的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;
    }
}

這樣才搞定。。

慢慢找原因是為啥吧。困。洗洗睡了?還是再改改?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.