/// <summary> /// /// </summary> /// <param name="ps"></param> /// <param name="flags"></param> void EnumFunc(PipelineState ps, SkyFlags flags) { ps.VertexInputElements = VertexInputElement.FromStructure <VertexColorTextureTBN>(); ps.RasterizerState = RasterizerState.CullNone; ps.BlendState = BlendState.Opaque; ps.DepthStencilState = flags.HasFlag(SkyFlags.FOG) ? DepthStencilState.None : DepthStencilState.Readonly; if (flags.HasFlag(SkyFlags.CLOUDS)) { ps.BlendState = BlendState.AlphaBlend; } //if (flags.HasFlag(SkyFlags.RED)) { // ps.BlendState = BlendState.Create(ColorChannels.Red); //} //if (flags.HasFlag(SkyFlags.BLUE)) { // ps.BlendState = BlendState.Create(ColorChannels.Blue); //} //if (flags.HasFlag(SkyFlags.GREEN)) { // ps.BlendState = BlendState.Create(ColorChannels.Green); //} if (flags.HasFlag(SkyFlags.BLUR_CLOUD)) { ps.BlendState = BlendState.AlphaBlend; } }
/// <summary> /// Selects colorspace in ubershader. /// </summary> /// <param name="flags"></param> /// <param name="settings"></param> void ApplyColorSpace(ref SkyFlags flags, SkySettings settings) { switch (settings.RgbSpace) { case RgbSpace.CIE_RGB: flags |= SkyFlags.CIERGB; break; case RgbSpace.sRGB: flags |= SkyFlags.SRGB; break; } }
void ApplyColorSpace(ref SkyFlags flags) { switch (Params.RgbSpace) { case RgbSpace.CIE_RGB: flags |= SkyFlags.CIERGB; break; case RgbSpace.sRGB: flags |= SkyFlags.SRGB; break; } }
/// <summary> /// /// </summary> /// <param name="ps"></param> /// <param name="flags"></param> void EnumFunc(PipelineState ps, SkyFlags flags) { ps.VertexInputElements = VertexInputElement.FromStructure <SkyVertex>(); // do not cull triangles for both for RH and LH coordinates // for direct view and cubemaps. ps.RasterizerState = RasterizerState.CullNone; ps.BlendState = BlendState.Opaque; ps.DepthStencilState = flags.HasFlag(SkyFlags.FOG) ? DepthStencilState.None : DepthStencilState.Readonly; }
/// <summary> /// Renders sky with specified technique /// </summary> /// <param name="rendCtxt"></param> /// <param name="techName"></param> internal void Render(Camera camera, StereoEye stereoEye, HdrFrame frame, SkySettings settings) { using (new PixEvent("Sky Rendering")) { var scale = Matrix.Scaling(settings.SkySphereSize); var rotation = Matrix.Identity; var sunPos = settings.SunPosition; var sunColor = settings.SunGlowColor; device.ResetStates(); //rs.DepthStencilState = depthBuffer==null? DepthStencilState.None : DepthStencilState.Default ; device.SetTargets(frame.DepthBuffer.Surface, frame.HdrBuffer.Surface); var viewMatrix = camera.GetViewMatrix(stereoEye); var projMatrix = camera.GetProjectionMatrix(stereoEye); skyConstsData.MatrixWVP = scale * rotation * MathUtil.Transformation(viewMatrix.Right, viewMatrix.Up, viewMatrix.Backward) * projMatrix; skyConstsData.SunPosition = sunPos; skyConstsData.SunColor = sunColor; skyConstsData.Turbidity = settings.SkyTurbidity; skyConstsData.Temperature = Temperature.Get(settings.SunTemperature); skyConstsData.SkyIntensity = settings.SkyIntensity; skyConstsCB.SetData(skyConstsData); device.VertexShaderConstants[0] = skyConstsCB; device.PixelShaderConstants[0] = skyConstsCB; // // Sky : // SkyFlags flags = SkyFlags.SKY; ApplyColorSpace(ref flags, settings); device.PipelineState = factory[(int)flags]; device.SetupVertexInput(skyVB, null); device.Draw(skyVB.Capacity, 0); device.ResetStates(); } }
/// <summary> /// Selects colorspace in ubershader. /// </summary> /// <param name="flags"></param> /// <param name="settings"></param> void ApplyColorSpace ( ref SkyFlags flags, SkySettings settings ) { switch (settings.RgbSpace) { case RgbSpace.CIE_RGB : flags |= SkyFlags.CIERGB; break; case RgbSpace.sRGB : flags |= SkyFlags.SRGB; break; } }
/// <summary> /// /// </summary> /// <param name="ps"></param> /// <param name="flags"></param> void EnumFunc ( PipelineState ps, SkyFlags flags ) { ps.VertexInputElements = VertexInputElement.FromStructure<SkyVertex>(); // do not cull triangles for both for RH and LH coordinates // for direct view and cubemaps. ps.RasterizerState = RasterizerState.CullNone; ps.BlendState = BlendState.Opaque; ps.DepthStencilState = flags.HasFlag(SkyFlags.FOG) ? DepthStencilState.None : DepthStencilState.Readonly; }
void ApplyColorSpace ( ref SkyFlags flags ) { switch (Params.RgbSpace) { case RgbSpace.CIE_RGB : flags |= SkyFlags.CIERGB; break; case RgbSpace.sRGB : flags |= SkyFlags.SRGB; break; } }
/// <summary> /// /// </summary> /// <param name="ps"></param> /// <param name="flags"></param> void EnumFunc ( PipelineState ps, SkyFlags flags ) { ps.VertexInputElements = VertexInputElement.FromStructure<VertexColorTextureTBN>(); ps.RasterizerState = RasterizerState.CullNone; ps.BlendState = BlendState.Opaque; ps.DepthStencilState = flags.HasFlag(SkyFlags.FOG) ? DepthStencilState.None : DepthStencilState.Readonly; if (flags.HasFlag(SkyFlags.CLOUDS)) { ps.BlendState = BlendState.AlphaBlend; } }
/// <summary> /// Renders sky with specified technique /// </summary> /// <param name="rendCtxt"></param> /// <param name="techName"></param> public void Render(GameTime gameTime, DepthStencilSurface depthBuffer, RenderTargetSurface hdrTarget, Matrix view, Matrix projection, RenderTarget2D cloudTarget, RenderTarget2D smallerCloudTarget) { var camera = Game.GetService <Camera>(); var scale = Matrix.Scaling(Params.SkySphereSize); var rotation = Matrix.Identity; var sunPos = GetSunDirection(); var sunColor = GetSunGlowColor(); rs.ResetStates(); //rs.DepthStencilState = depthBuffer==null? DepthStencilState.None : DepthStencilState.Default ; rs.SetViewport(0, 0, hdrTarget.Width, hdrTarget.Height); rs.SetTargets(depthBuffer, hdrTarget); var viewMatrix = view; var projMatrix = projection; skyConstsData.MatrixWVP = scale * rotation * MathUtil.Transformation(viewMatrix.Right, viewMatrix.Up, viewMatrix.Backward) * projMatrix; skyConstsData.SunPosition = sunPos; skyConstsData.SunColor = sunColor; skyConstsData.Turbidity = Params.SkyTurbidity; skyConstsData.Temperature = Temperature.Get(Params.SunTemperature); skyConstsData.SkyIntensity = Params.SkyIntensity; skyConstsCB.SetData(skyConstsData); rs.VertexShaderConstants[0] = skyConstsCB; rs.PixelShaderConstants[0] = skyConstsCB; // // Sky : // SkyFlags flags = SkyFlags.PROCEDURAL_SKY; ApplyColorSpace(ref flags); rs.PipelineState = factory[(int)flags]; for (int j = 0; j < skySphere.Meshes.Count; j++) { var mesh = skySphere.Meshes[j]; rs.SetupVertexInput(vertexBuffers[j], indexBuffers[j]); rs.DrawIndexed(mesh.IndexCount, 0, 0); } // // Clouds : // scale = Matrix.Scaling(Params.SkySphereSize, Params.SkySphereSize, Params.SkySphereSize); //scale = Matrix.Scaling( Params.SkySphereSize, Params.SkySphereSize * 0.1f, Params.SkySphereSize ); skyConstsData.MatrixWVP = scale * rotation * MathUtil.Transformation(viewMatrix.Right, viewMatrix.Up, viewMatrix.Backward) * projMatrix; skyConstsData.SunPosition = sunPos; skyConstsData.SunColor = GetSunLightColor(); skyConstsData.Turbidity = Params.SkyTurbidity; skyConstsData.Temperature = Temperature.Get(Params.SunTemperature); skyConstsData.SkyIntensity = Params.SkyIntensity; skyConstsData.Ambient = GetAmbientLevel().ToVector3(); skyConstsData.Time = (float)gameTime.Total.TotalSeconds; skyConstsCB.SetData(skyConstsData); rs.SetTargets(depthBuffer, hdrTarget); // rs.SetTargets( null, cloudTarget.Surface ); flags = SkyFlags.CLOUDS; //int i = 0; for (int i = 0; i < 3; i++) { if (i == 0) { flags = SkyFlags.CLOUDS | SkyFlags.A | SkyFlags.RED; } if (i == 1) { flags = SkyFlags.CLOUDS | SkyFlags.B | SkyFlags.GREEN; } if (i == 2) { flags = SkyFlags.CLOUDS | SkyFlags.C | SkyFlags.BLUE; } ApplyColorSpace(ref flags); rs.PipelineState = factory[(int)flags]; rs.PixelShaderResources[0] = clouds; rs.PixelShaderResources[1] = cirrus; rs.PixelShaderResources[2] = noise; rs.PixelShaderResources[3] = arrows; rs.PixelShaderSamplers[0] = SamplerState.AnisotropicWrap; for (int j = 0; j < cloudSphere.Meshes.Count; j++) { var mesh = cloudSphere.Meshes[j]; rs.SetupVertexInput(cloudVertexBuffers[j], cloudIndexBuffers[j]); rs.DrawIndexed(mesh.IndexCount, 0, 0); } } #if false //Blur var filter = Game.GetService <Filter>(); //filter.RadialBlur(smallerCloudTarget.Surface, cloudTarget, new Vector2(0.5f, 0.5f), 1.0f, -0.2f); //if(Game.InputDevice.IsKeyDown(Keys.LeftButton)) //{ Vector4 sunProj = Vector4.Transform(new Vector4(sunPos, 0), viewMatrix); sunProj = Vector4.Transform(sunProj, projMatrix); sunProj = new Vector4(sunProj.X / sunProj.W, sunProj.Y / sunProj.W, sunProj.Z / sunProj.W, 1); Vector2 relSunPosition = new Vector2(0.5f, 0.5f); //if ( Math.Abs(sunProj.X ) < 1 && Math.Abs (sunProj.Y) < 1){ relSunPosition = new Vector2((sunProj.X + 1) / 2, -(sunProj.Y - 1) / 2); //} //Log.Message(relSunPosition + ""); filter.RadialBlur(smallerCloudTarget.Surface, cloudTarget, relSunPosition, 1.0f, -0.2f); //} flags = SkyFlags.BLUR_CLOUD; skyConstsData.MatrixWVP = Matrix.Identity; skyConstsCB.SetData(skyConstsData); rs.SetTargets(null, hdrTarget); ApplyColorSpace(ref flags); rs.VertexShaderConstants[0] = skyConstsCB; rs.PixelShaderConstants[0] = skyConstsCB; rs.PipelineState = factory[(int)flags]; rs.PixelShaderResources[4] = cloudTarget; rs.PixelShaderSamplers[1] = SamplerState.LinearWrap; var v0 = new VertexColorTextureTBN { Position = new Vector3(-1.0f, -1.0f, 0), TexCoord = new Vector2(0, 1), }; var v1 = new VertexColorTextureTBN { Position = new Vector3(1.0f, 1.0f, 0), TexCoord = new Vector2(1, 0), }; var v2 = new VertexColorTextureTBN { Position = new Vector3(-1.0f, 1.0f, 0), TexCoord = new Vector2(0, 0), }; var v3 = new VertexColorTextureTBN { Position = new Vector3(-1.0f, -1.0f, 0), TexCoord = new Vector2(0, 1), }; var v4 = new VertexColorTextureTBN { Position = new Vector3(1.0f, -1.0f, 0), TexCoord = new Vector2(1, 1), }; var v5 = new VertexColorTextureTBN { Position = new Vector3(1.0f, 1.0f, 0), TexCoord = new Vector2(1, 0), }; //*/ var data = new VertexColorTextureTBN[] { v0, v1, v2, v3, v4, v5 }; //Log.Message(""+v0.TexCoord); vertexBufferBlur.SetData(data, 0, 6); //for ( int j=0; j<cloudSphere.Meshes.Count; j++) { // var mesh = cloudSphere.Meshes[j]; // rs.SetupVertexInput( cloudVertexBuffers[j], cloudIndexBuffers[j] ); // rs.DrawIndexed( mesh.IndexCount, 0, 0 ); // } rs.SetupVertexInput(vertexBufferBlur, null); rs.Draw(6, 0); #endif rs.ResetStates(); }
/// <summary> /// /// </summary> /// <param name="ps"></param> /// <param name="flags"></param> void EnumFunc( PipelineState ps, SkyFlags flags ) { ps.VertexInputElements = VertexInputElement.FromStructure<VertexColorTextureTBN>(); ps.RasterizerState = RasterizerState.CullNone; ps.BlendState = BlendState.Opaque; ps.DepthStencilState = flags.HasFlag(SkyFlags.FOG) ? DepthStencilState.None : DepthStencilState.Readonly; if (flags.HasFlag(SkyFlags.CLOUDS)) { ps.BlendState = BlendState.AlphaBlend; } //if (flags.HasFlag(SkyFlags.RED)) { // ps.BlendState = BlendState.Create(ColorChannels.Red); //} //if (flags.HasFlag(SkyFlags.BLUE)) { // ps.BlendState = BlendState.Create(ColorChannels.Blue); //} //if (flags.HasFlag(SkyFlags.GREEN)) { // ps.BlendState = BlendState.Create(ColorChannels.Green); //} if ( flags.HasFlag( SkyFlags.BLUR_CLOUD ) ) { ps.BlendState = BlendState.AlphaBlend; } }