Exemplo n.º 1
0
        private TextureCube RenderCubeMap(Vector3 position)
        {
            TextureCube debug;
            //RenderTargetCube RefCubeMap = new RenderTargetCube(device, 256, 1, SurfaceFormat.Color);
            RenderTargetCube RefCubeMap = new RenderTargetCube(graphicsDevice, graphicsDevice.Viewport.Width, true, SurfaceFormat.Color, DepthFormat.Depth24);
            Matrix viewMatrix = Matrix.Identity;
            TargetCamera camera;

            // Render our cube map, once for each cube face( 6 times ).
            for (int i = 0; i < 6; i++) {
                // render the scene to all cubemap faces
                CubeMapFace cubeMapFace = (CubeMapFace)i;

                switch (cubeMapFace) {
                    case CubeMapFace.NegativeX: {
                            //Vector3 target = new Vector3
                            viewMatrix = Matrix.CreateLookAt(position, position + Vector3.Left, Vector3.Up);
                            break;
                        }
                    case CubeMapFace.NegativeY: {
                            viewMatrix = Matrix.CreateLookAt(position, position + Vector3.Down, Vector3.Forward);
                            break;
                        }
                    case CubeMapFace.NegativeZ: {
                            viewMatrix = Matrix.CreateLookAt(position, position + Vector3.Backward, Vector3.Up);
                            break;
                        }
                    case CubeMapFace.PositiveX: {
                            viewMatrix = Matrix.CreateLookAt(position, position + Vector3.Right, Vector3.Up);
                            break;
                        }
                    case CubeMapFace.PositiveY: {
                            viewMatrix = Matrix.CreateLookAt(position, position + Vector3.Up, Vector3.Backward);
                            break;
                        }
                    case CubeMapFace.PositiveZ: {
                            viewMatrix = Matrix.CreateLookAt(position, position + Vector3.Forward, Vector3.Up);
                            break;
                        }
                }

                //effect.Parameters["matWorldViewProj"].SetValue(worldMatrix * viewMatrix * projMatrix);
                camera = new TargetCamera(position, Vector3.Zero, graphicsDevice);
                camera.View = viewMatrix; camera.Projection = this.camera.Projection;

                // Set the cubemap render target, using the selected face
                //device.SetRenderTarget(RefCubeMap, cubeMapFace);
                graphicsDevice.SetRenderTarget(RefCubeMap, cubeMapFace);
                graphicsDevice.Clear(Color.White);
                this.DrawScene(camera);
                graphicsDevice.SetRenderTarget(null);
            }

            graphicsDevice.SetRenderTarget(null);
            /*if (!hasSaved) {
                debug = RefCubeMap;// null!?
                DDSLib.DDSToFile("cubeMapFace_debug.dds", true, debug, false);
            }*/

            return RefCubeMap;
        }
Exemplo n.º 2
0
        public void Draw(GameTime gameTime, Matrix View, Matrix Projection, Vector3 CameraPosition, Vector3 CameraDirection, Vector3 Up, Vector3 Right)
        {
            //effect.Parameters["Time"].SetValue((float)gameTime.TotalGameTime.TotalSeconds);
            effect.Parameters["Time"].SetValue((float)(DateTime.Now - start).TotalSeconds);

            // 本文にはDraw関数の記述は無かったが、恐らくSkySphere.Drawと同様だろう
            graphics.BlendState = BlendState.AlphaBlend;
            // スケールにベクトルを使用していることに注意
            /*discoidMesh.World = Matrix.CreateScale(discoidMesh.ScaleVector)
                * discoidMesh.RotationMatrix * Matrix.CreateTranslation(discoidMesh.Position);*/
            mesh.World = Scale * mesh.RotationMatrix * Matrix.CreateTranslation(mesh.Position);
            SetEffectParameters(CameraPosition, CameraDirection);

            // 両面を描画する
            graphics.RasterizerState = RasterizerState.CullCounterClockwise;
            mesh.Draw(View, Projection, CameraPosition);

            Vector3 reflectedCameraPosition = CameraPosition;
            reflectedCameraPosition.Y = -reflectedCameraPosition.Y + mesh.Position.Y * 2;
            //Vector3 reflectedCameraTarget = level.camera.ChasePosition;
            Vector3 reflectedCameraTarget = level.camera.Target;
            reflectedCameraTarget.Y = -reflectedCameraTarget.Y - level.camera.LookAtOffset.Y + mesh.Position.Y * 2;
            TargetCamera reflectionCamera = new TargetCamera(reflectedCameraPosition, reflectedCameraTarget, graphics);
            reflectionCamera.Update();// 上方ベクトルは-Yになってた

            graphics.BlendState = BlendState.Opaque;
            //eps.Draw(View, Projection, Up, Right);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Draw terrain + objects
        /// </summary>
        private void DrawScene(TargetCamera camera)
        {
            Sky.Draw(camera.View, camera.Projection, camera.Position);
            water.Draw(camera.View, camera.Projection, camera.Position);

            //Ground.Model.Draw(Ground.World, camera.View, camera.Projection);
            foreach (Object o in Models) {
                //if (camera.BoundingVolumeIsInView(model.BoundingSphere)) {
                //string s = o.Scale.ToString();
                o.Draw(camera.View, camera.Projection, camera.Position);
            }
        }