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; }
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); }
/// <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); } }