這兩天重新把延遲渲染的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;
}
}
這樣才搞定。。
慢慢找原因是為啥吧。困。洗洗睡了?還是再改改?