首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

请问CSM或者PSSM处理大场景上阴影有关问题

2013-01-04 
请教CSM或者PSSM处理大场景下阴影问题csm跟pssm都是想通过分割视锥体来获得多张shadowmap,理论我已经看过

请教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;
  }
}

    

热点排行