请教CSM或者PSSM处理大场景下阴影问题
csm跟pssm都是想通过分割视锥体来获得多张shadowmap,理论我已经看过很多了,大致也清楚的很,就是实现不知道从哪开始;
1.分割视锥体,在dx9下没有视锥体类吧,或者我没找到,怎么实现分割呢。看csm文章里有这句话 splitfrust[0].ResightNear(Dis_Near); 有人能接受下么。
2.分割后要获得每个clip下的crop matrix,这个又该如何获得,获得后放到hlsl里面又怎么使用呢。
本人刚实现SM+PCF,现在需要处理大场景的阴影图,还请有过经验的朋友告诉一二。
[解决办法]
求crop矩阵需要把视锥的8个顶点投影到clip space,求出包围盒minX,minY,maxX,maxY(在-1到1区间)
float scaleX = 2/(maxX-minX);
float scaleY = 2/(maxY-minY);
float offsetX = -0.5f * (maxX + minX) * scaleX;
float offsetY = -0.5f * (maxY + minY) * scaleY;
Matrix44 cropMatrix = Matrix44(
scaleX, 0, 0, 0,
0, scaleY, 0, 0,
0, 0, 1, 0,
offsetX, offsetY, 0, 1);
[解决办法]
你说的那个论文不记得了,那个CalcAABB方法应该就是求clip space 包围盒,具体就是把视锥的8个顶点通过lightViewMatrix * lightProjMatrix变换, 求出x, y的最大最小分量,代码大概是
void CalcAABB (const Frustum &frustum, const Matrix &lightViewProjMatrix, float &minX, float&maxX, float &minY, float &maxY)
{
maxX = -FLT_MAX;
maxY = -FLT_MAX;
minX = FLT_MAX;
minY = FLT_MAX;
for (int i = 0; i < 8; ++i)
{
Vector4 v = lightViewProjMatrix.transfom(frustum.getVertex(i));
v /= v.w;
if (v.x > maxX) maxX = v.x;
if (v.x < minX) minX = v.x;
if (v.y > maxY) maxY = v.y;
if (v.y < minY) minY = v.y;
}
}