DX11的陷阱?
来源:互联网 发布:淘宝怎么取消小儿介入 编辑:程序博客网 时间:2024/04/28 07:45
这两天重新把延迟渲染的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;
}
}
这样才搞定。。
慢慢找原因是为啥吧。困。洗洗睡了?还是再改改?
- DX11的陷阱?
- 文明5的dx11应用
- DX11细分的优势和特点
- DX11中的constant buffer的padding原理
- 支持DX11游戏对硬件的要求
- Unity3d 使用DX11的曲面细分
- '\'的陷阱
- :?的陷阱
- DX11,让AMD赢得行业的22次掌声
- 成功编译Dx11.1.6 & Xaf11.1.6的方法
- [DX11调试]检查D3D对象是否释放:ReportLiveObjects()的用法
- 成功编译Dx11.1.6 & Xaf11.1.6的方法
- DX11:先定一个小目标,比如:把DX11龙书上的知识点系统的总结下来
- opencl dx11
- dx11资源
- Delphi的接口陷阱
- TWebBrowser的Cache陷阱
- groovy 的陷阱
- MFC CListCtrl的用法
- url显示中文乱码的问题
- Activex 使用DirectShow的问题解决方案
- AS3库
- 2012.7.25
- DX11的陷阱?
- linux 标准IO缓冲机制探究
- 【线段树】 hdu1754 I Hate It
- linux 下面进程 CPU 使用率查看
- Linux 中 netstat 的用法
- patchguard v3
- poj 1007 分治求逆序对
- 超分辨率成像模型中下采样矩阵的构造
- MyEclipse8.5中关于SSH的运用如何解决jar包冲突的问题