参考资料
http://blog.youkuaiyun.com/shadow_gz/article/details/6394827
http://www.klayge.org/wiki/index.php?title=%E5%BB%B6%E8%BF%9F%E6%B8%B2%E6%9F%93
从project space转换到view space下
需要的东西,
1 . linear z=viewz/z_far;
2. 屏幕坐标.
3.一个预计算的view dir.
klayge里面说法view dir似乎是需要靠自动插值来的(4个点),我的实现方法只需unproject1个点计算,不知道是否正确。 但是我画图感觉应该是正确的,
ab为远裁面。
cam为摄像机坐标,就是view space的原点。
由图可见,对于垂直于视线的任意投影屏幕,x/z和y/z是确定的
所以只需unproject一个点即可用linearz求出 dx,dy
测试代码:
D3DXMATRIX mprj;
D3DXMatrixPerspectiveFovLH( &mprj,60,4.0f/3.0f,1.0f,10000.0f);
D3DXMATRIX iprj;
D3DXMatrixInverse(&iprj,NULL,&mprj);
D3DXVECTOR3 p(-1,-1,1.0f);
D3DXVECTOR3 r;
D3DXVec3TransformCoord(&r,&p,&iprj);
sys_msg("0 -> %f %f %f\n",r.x,r.y,r.z);
//view dir
r.x/=r.z;
r.y/=r.z;
r.z=1;
//测试decode pos
D3DXVECTOR3 t(-0.5,0.5,3000);
r.x=-t.x*t.z*r.x;
r.y=-t.y*t.z*r.y;
r.z=t.z;
sys_msg("1 -> %f %f %f\n",r.x,r.y,r.z);
//再project
D3DXVec3TransformCoord(&t,&r,&mprj);
sys_msg("2 -> %f %f %f\n",t.x,t.y,t.z);
//然后unproject
D3DXVec3TransformCoord(&r,&t,&iprj);
sys_msg("3 -> %f %f %f\n",r.x,r.y,r.z);
计算的结果是非常接近的,考虑到浮点误差,应该就是正确结果。