PSSM (Parallel Split Shadow Maps) による視錐台分割を担うクラスです。
Example #1
0
        public MainGame()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";

            graphics.PreferredBackBufferWidth = WindowWidth;
            graphics.PreferredBackBufferHeight = WindowHeight;

            camera = new BasicCamera
            {
                Position = new Vector3(0, 70, 100),
                Direction = new Vector3(0, -0.4472136f, -0.8944272f),
                Fov = MathHelper.PiOver4,
                AspectRatio = (float) WindowWidth / (float) WindowHeight,
                NearClipDistance = 1.0f,
                FarClipDistance = 1000.0f
            };

            cameraFrustum = new BoundingFrustum(Matrix.Identity);

            corners = new Vector3[8];

            // gridModel が半径約 183 であるため、
            // これを含むように簡易シーン AABB を決定。
            // なお、広大な世界を扱う場合には、表示カメラの視錐台に含まれるオブジェクト、
            // および、それらに投影しうるオブジェクトを動的に選択および決定し、
            // 適切な最小シーン領域を算出して利用する。
            sceneBox = new BoundingBox(new Vector3(-200), new Vector3(200));

            useCameraFrustumSceneBox = true;

            currentLightCameraType = LightCameraType.LiSPSM;

            basicLightCameraBuilder = new BasicLightCameraBuilder();
            uniformLightCameraBuilder = new UniformLightCameraBuilder();
            uniformLightCameraBuilder.LightFarClipDistance = lightFar;
            liSPSMLightCameraBuilder = new LiSPSMLightCameraBuilder();
            liSPSMLightCameraBuilder.LightFarClipDistance = lightFar;

            splitCount = MaxSplitCount;

            pssm = new PSSM();
            pssm.Fov = camera.Fov;
            pssm.AspectRatio = camera.AspectRatio;
            pssm.NearClipDistance = camera.NearClipDistance;
            pssm.FarClipDistance = camera.FarClipDistance;

            splitDistances = new float[MaxSplitCount + 1];
            splitProjections = new Matrix[MaxSplitCount];
            shadowMaps = new ShadowMap[MaxSplitCount];
            lightViewProjections = new Matrix[MaxSplitCount];

            shadowMapForm = ShadowMapForm.Basic;

            // 単位ベクトル。
            lightDirection = new Vector3(0.3333333f, -0.6666667f, -0.6666667f);

            currentFrustum = new BoundingFrustum(Matrix.Identity);
        }