Exemplo n.º 1
0
        /// <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;
            }
        }
Exemplo n.º 2
0
        /// <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;
            }
        }
Exemplo n.º 3
0
        void ApplyColorSpace(ref SkyFlags flags)
        {
            switch (Params.RgbSpace)
            {
            case RgbSpace.CIE_RGB: flags |= SkyFlags.CIERGB;     break;

            case RgbSpace.sRGB: flags |= SkyFlags.SRGB;       break;
            }
        }
Exemplo n.º 4
0
        /// <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;
        }
Exemplo n.º 5
0
        /// <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();
            }
        }
Exemplo n.º 6
0
		/// <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;
			}
		}
Exemplo n.º 7
0
		/// <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;
		}
Exemplo n.º 8
0
		void ApplyColorSpace ( ref SkyFlags flags )
		{	
			switch (Params.RgbSpace) {
				case RgbSpace.CIE_RGB	: flags |= SkyFlags.CIERGB;	break;
				case RgbSpace.sRGB		: flags |= SkyFlags.SRGB;	break;
			}
		}
Exemplo n.º 9
0
		/// <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;
			}
		}
Exemplo n.º 10
0
        /// <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();
        }
Exemplo n.º 11
0
        /// <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;
            }
        }