private void Blur(Texture sourceAndDestination, Texture aux, MyEffectGaussianBlur effect, float verticalBlurAmount, float horizontalBlurAmount) { effect.SetHalfPixel(sourceAndDestination.GetLevelDescription(0).Width, sourceAndDestination.GetLevelDescription(0).Height); int numberOfBlurPasses = Convert.ToInt32(Math.Floor(NumberOfBlurPasses)); for (int i = 0; i < numberOfBlurPasses; i++) { // Apply vertical gaussian blur MyMinerGame.SetRenderTarget(aux, null); effect.BlurAmount = verticalBlurAmount; effect.SetSourceTexture(sourceAndDestination); //effect.SetWidthForHorisontalPass(sourceAndDestination.Width); effect.SetHeightForVerticalPass(sourceAndDestination.GetLevelDescription(0).Height); MyGuiManager.GetFullscreenQuad().Draw(effect); // Apply horizontal gaussian blur MyMinerGame.SetRenderTarget(sourceAndDestination, null); effect.BlurAmount = horizontalBlurAmount; effect.SetSourceTexture(aux); //effect.SetHeightForVerticalPass(sourceAndDestination.Height); effect.SetWidthForHorisontalPass(aux.GetLevelDescription(0).Width); MyGuiManager.GetFullscreenQuad().Draw(effect); } }
/// <summary> /// Render method is called directly by renderer. Depending on stage, post process can do various things /// </summary> /// <param name="postProcessStage">Stage indicating in which part renderer currently is.</param>public override void RenderAfterBlendLights() public override Texture Render(PostProcessStage postProcessStage, Texture source, Texture availableRenderTarget) { switch (postProcessStage) { case PostProcessStage.HDR: { MyMinerGame.SetRenderTarget(availableRenderTarget, null); MyEffectContrast effectContrast = MyRender.GetEffect(MyEffects.Contrast) as MyEffectContrast; effectContrast.SetDiffuseTexture(source); effectContrast.SetHalfPixel(MyUtils.GetHalfPixel(source.GetLevelDescription(0).Width, source.GetLevelDescription(0).Height)); effectContrast.SetContrast(Contrast); effectContrast.SetHue(Hue); effectContrast.SetSaturation(Saturation); MyGuiManager.GetFullscreenQuad().Draw(effectContrast); return(availableRenderTarget); } break; } return(source); }
/// <summary> /// Render method is called directly by renderer. Depending on stage, post process can do various things /// </summary> /// <param name="postProcessStage">Stage indicating in which part renderer currently is.</param>public override void RenderAfterBlendLights() public override Texture Render(PostProcessStage postProcessStage, Texture source, Texture availableRenderTarget) { switch (postProcessStage) { case PostProcessStage.AlphaBlended: { BlendState.Opaque.Apply(); DepthStencilState.None.Apply(); RasterizerState.CullCounterClockwise.Apply(); MyMinerGame.SetRenderTarget(availableRenderTarget, null); MyEffectAntiAlias effectAntiAlias = MyRender.GetEffect(MyEffects.AntiAlias) as MyEffectAntiAlias; effectAntiAlias.SetDiffuseTexture(source); effectAntiAlias.SetHalfPixel(source.GetLevelDescription(0).Width, source.GetLevelDescription(0).Height); if (MyMwcFinalBuildConstants.EnableFxaa && MyRenderConstants.RenderQualityProfile.EnableFXAA) { effectAntiAlias.ApplyFxaa(); } else { return(source); // Nothing to do, return source } MyGuiManager.GetFullscreenQuad().Draw(effectAntiAlias); return(availableRenderTarget); } break; } return(source); }
protected void PostProcess(Texture source, Texture destination, MyEffectHDRBase effect) { MyMinerGame.SetRenderTarget(destination, null); effect.SetHalfPixel(source.GetLevelDescription(0).Width, source.GetLevelDescription(0).Height); effect.SetSourceTextureMod(source); MyGuiManager.GetFullscreenQuad().Draw(effect); }
/// <summary> /// Renders a list of models to the shadow map, and returns a surface /// containing the shadow occlusion factor /// </summary> public void Render() { int shadowBlock = -1; MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyShadowRenderer::Render", ref shadowBlock); if (MultiThreaded) { WaitUntilPrepareForDrawCompleted(); } else { //PrepareFrame(); PrepareCascadesForDraw(); } IssueQueriesForCascades(); MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("Set & Clear RT"); // Set our targets MyMinerGame.SetRenderTarget(MyRender.GetRenderTarget(m_shadowRenderTarget), MyRender.GetRenderTarget(m_shadowDepthTarget)); //MyMinerGameDX.Static.GraphicsDevice.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, Color.White, 1.0f, 0); MyMinerGame.Static.GraphicsDevice.Clear(ClearFlags.ZBuffer, new ColorBGRA(1.0f), 1.0f, 0); DepthStencilState.Default.Apply(); RasterizerState.CullCounterClockwise.Apply(); BlendState.Opaque.Apply(); MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("Render 4 ShadowMaps"); // Render our scene geometry to each split of the cascade for (int i = 0; i < NumSplits; i++) { if (m_skip[i]) { continue; } if (!m_visibility[i]) { continue; } RenderShadowMap(i); //IssueQueriesForShadowMap(i); } MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); // MyGuiManager.TakeScreenshot(); MyRender.TakeScreenshot("ShadowMap", MyRender.GetRenderTarget(m_shadowRenderTarget), MyEffectScreenshot.ScreenshotTechniqueEnum.Color); MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(shadowBlock); }
public void PrepareForDraw(MyEffectDistantImpostors effect) { RasterizerState.CullClockwise.Apply(); BlendState.Opaque.Apply(); MyMinerGame.SetRenderTarget(MyRender.GetRenderTarget(MyRenderTargets.AuxiliaryHalf0), null); foreach (MyVoxelMapImpostorGroup group in m_voxelMapImpostorGroups) { group.PrepareForDraw(effect); } }
private void BlitToThumbnail(Device device, Texture renderTarget) { MyMinerGame.SetRenderTarget(renderTarget, null); var screenEffect = MyRender.GetEffect(MyEffects.Scale) as MyEffectScale; Debug.Assert(screenEffect != null); screenEffect.SetTechnique(MyEffectScale.Technique.HWScalePrefabPreviews); screenEffect.SetSourceTextureMod(m_fullSizeRT); //screenEffect.SetScale(2f * new Vector2(renderTarget.Width / (float)m_fullSizeRT.Width, renderTarget.Height / (float)m_fullSizeRT.Height)); screenEffect.SetScale(2f * new Vector2((renderTarget.GetLevelDescription(0).Width - 1) / (float)m_fullSizeRT.GetLevelDescription(0).Width, (renderTarget.GetLevelDescription(0).Height - 1) / (float)m_fullSizeRT.GetLevelDescription(0).Height)); MyGuiManager.GetFullscreenQuad().Draw(screenEffect); MyMinerGame.SetRenderTarget(null, null); }
/// <summary> /// Downscales the source to 1/4th size, using mipmaps /// !! IMPORTANT !! you cannot just switch function call. Also changing RTs is necessary. /// </summary> protected void GenerateDownscale4(Texture sourceMod, Texture sourceDiv, Texture destination, MyEffectScale effect) { effect.SetTechnique(MyEffectScale.Technique.Downscale4); MyMinerGame.SetRenderTarget(destination, null); effect.SetSourceTextureMod(sourceMod); effect.SetSourceTextureDiv(sourceDiv); //effect.SetLumTexture(currentFrameAdaptedLuminance); effect.SetHalfPixel(sourceMod.GetLevelDescription(0).Width, sourceMod.GetLevelDescription(0).Height); MyGuiManager.GetFullscreenQuad().Draw(effect); }
public void RenderForLight(Matrix lightViewProjection, ref BoundingBox lightBoundingBox, Texture shadowRenderTarget, Texture shadowDepth, int spotIndex) { m_renderElementsForShadows.Clear(); m_castingRenderObjectsUnique.Clear(); m_spotFrustum.Matrix = lightViewProjection; //MyRender.GetEntitiesFromPrunningStructure(ref lightBoundingBox, m_castingRenderObjects); MyRender.GetEntitiesFromShadowStructure(ref lightBoundingBox, m_castingRenderObjects); foreach (MyElement element in m_castingRenderObjects) { MyRenderObject renderObject = (MyRenderObject)element; MyEntity entity = ((MyRenderObject)element).Entity; if (entity != null) { if (entity is MyVoxelMap) { // Changed m_castersBox to lightBoundingBox, should work //(entity as MyVoxelMap).GetRenderElementsForShadowmap(m_renderElementsForShadows, ref lightBoundingBox, m_spotFrustum, MyLodTypeEnum.LOD0, false); (entity as MyVoxelMap).GetRenderElementsForShadowmap(m_renderElementsForShadows, renderObject.RenderCellCoord.Value, MyLodTypeEnum.LOD0, false); } else { if (entity.ModelLod0 != null) { MyRender.CollectRenderElementsForShadowmap(m_renderElementsForShadows, m_transparentRenderElementsForShadows, entity, entity.ModelLod0); } } } } // Set our targets MyMinerGame.SetRenderTarget(shadowRenderTarget, shadowDepth); MyMinerGame.Static.GraphicsDevice.Clear(ClearFlags.All, new ColorBGRA(1.0f), 1.0f, 0); DepthStencilState.Default.Apply(); RasterizerState.CullNone.Apply(); BlendState.Opaque.Apply(); RenderShadowMap(lightViewProjection); MyRender.TakeScreenshot("ShadowMapSpot", shadowRenderTarget, MyEffectScreenshot.ScreenshotTechniqueEnum.Color); }
public void UpdateAmbient(int index) { CubeMapFace face = (CubeMapFace)index; Surface cubeSurface = m_ambientRT.GetCubeMapSurface(face, 0); MyMinerGame.Static.GraphicsDevice.SetRenderTarget(0, cubeSurface); BlendState.Opaque.Apply(); MyEffectAmbientPrecalculation precalc = MyRender.GetEffect(MyEffects.AmbientMapPrecalculation) as MyEffectAmbientPrecalculation; precalc.SetEnvironmentMap(this.m_environmentRT); precalc.SetFaceMatrix(CreateViewMatrix(face, Vector3.Zero)); precalc.SetRandomTexture(MyRender.GetRandomTexture()); precalc.SetIterationCount(14); precalc.SetMainVectorWeight(1.0f); precalc.SetBacklightColorAndIntensity(new Vector3(MyRender.Sun.BackColor.X, MyRender.Sun.BackColor.Y, MyRender.Sun.BackColor.Z), MyRender.Sun.BackIntensity); MyGuiManager.GetFullscreenQuad().Draw(precalc); MyMinerGame.SetRenderTarget(null, null); cubeSurface.Dispose(); }
/// <summary> /// Render method is called directly by renderer. Depending on stage, post process can do various things /// </summary> /// <param name="postProcessStage">Stage indicating in which part renderer currently is.</param>public override void RenderAfterBlendLights() public override Texture Render(PostProcessStage postProcessStage, Texture source, Texture availableRenderTarget) { switch (postProcessStage) { case PostProcessStage.LODBlend: { MyEffectVolumetricSSAO2 volumetricSsao = MyRender.GetEffect(MyEffects.VolumetricSSAO) as MyEffectVolumetricSSAO2; int width = MyRender.GetRenderTarget(MyRenderTargets.Normals).GetLevelDescription(0).Width; int height = MyRender.GetRenderTarget(MyRenderTargets.Normals).GetLevelDescription(0).Height; int halfWidth = width / 2; int halfHeight = height / 2; //Render SSAO MyMinerGame.SetRenderTarget(MyRender.GetRenderTarget(MyRenderTargets.SSAO), null); MyMinerGame.Static.GraphicsDevice.Clear(ClearFlags.Target, new SharpDX.ColorBGRA(0), 1, 0); DepthStencilState.None.Apply(); BlendState.Opaque.Apply(); Vector4 ssaoParams = new Vector4(MinRadius, MaxRadius, RadiusGrowZScale, CameraZFar); Vector4 ssaoParams2 = new Vector4(Bias, Falloff, NormValue, 0); volumetricSsao.SetDepthsRT(MyRender.GetRenderTarget(MyRenderTargets.Depth)); volumetricSsao.SetNormalsTexture(MyRender.GetRenderTarget(MyRenderTargets.Normals)); volumetricSsao.SetHalfPixel(width, height); volumetricSsao.SetFrustumCorners(MyRender.GetShadowRenderer().GetFrustumCorners()); volumetricSsao.SetViewMatrix(MyCamera.ViewMatrixAtZero); volumetricSsao.SetParams1(ssaoParams); volumetricSsao.SetParams2(ssaoParams2); volumetricSsao.SetProjectionMatrix(MyCamera.ProjectionMatrix); volumetricSsao.SetContrast(Contrast); MyGuiManager.GetFullscreenQuad().Draw(volumetricSsao); if (volumetricSsao.UseBlur) { //SSAO Blur MyMinerGame.SetRenderTarget(availableRenderTarget, null); MyEffectSSAOBlur2 effectSsaoBlur = MyRender.GetEffect(MyEffects.SSAOBlur) as MyEffectSSAOBlur2; effectSsaoBlur.SetDepthsRT(MyRender.GetRenderTarget(MyRenderTargets.Depth)); //effectSsaoBlur.SetNormalsRT(MyRender.GetRenderTarget(MyRenderTargets.Normals)); effectSsaoBlur.SetHalfPixel(width, height); effectSsaoBlur.SetSSAOHalfPixel(halfWidth, halfHeight); effectSsaoBlur.SetSsaoRT(MyRender.GetRenderTarget(MyRenderTargets.SSAO)); effectSsaoBlur.SetBlurDirection(new Vector2(0, 1f / (float)halfHeight)); //effectSsaoBlur.SetBlurDirection(new Vector2(1 / (float)halfWidth, 1f / (float)halfHeight)); MyGuiManager.GetFullscreenQuad().Draw(effectSsaoBlur); MyMinerGame.SetRenderTarget(MyRender.GetRenderTarget(MyRenderTargets.SSAOBlur), null); effectSsaoBlur.SetSsaoRT(availableRenderTarget); effectSsaoBlur.SetBlurDirection(new Vector2(1f / (float)halfWidth, 0)); MyGuiManager.GetFullscreenQuad().Draw(effectSsaoBlur); } //Bake it into diffuse /* * MyEffectScreenshot ssEffect = MyRender.GetEffect(MyEffects.Screenshot) as MyEffectScreenshot; * MyMinerGame.SetRenderTarget(availableRenderTarget, null); * ssEffect.SetSourceTexture(MyRender.GetRenderTarget(MyRenderTargets.Diffuse)); * ssEffect.SetScale(Vector2.One); * ssEffect.SetTechnique(MyEffectScreenshot.ScreenshotTechniqueEnum.Default); * * MyGuiManager.GetFullscreenQuad().Draw(ssEffect); * */ MyMinerGame.SetRenderTarget(MyRender.GetRenderTarget(MyRenderTargets.Diffuse), null); /* * ssEffect.SetSourceTexture(availableRenderTarget); * ssEffect.SetTechnique(MyEffectScreenshot.ScreenshotTechniqueEnum.Default); * ssEffect.SetScale(Vector2.One); * MyGuiManager.GetFullscreenQuad().Draw(ssEffect); */ MyEffectVolumetricSSAO2 effectVolumetricSsao = MyRender.GetEffect(MyEffects.VolumetricSSAO) as MyEffectVolumetricSSAO2; //Blend with SSAO together DepthStencilState.None.Apply(); if (!effectVolumetricSsao.ShowOnlySSAO) { MyStateObjects.SSAO_BlendState.Apply(); } else { MyRender.CurrentRenderSetup.EnableLights = false; MyMinerGame.Static.GraphicsDevice.Clear(ClearFlags.Target, new SharpDX.ColorBGRA(1.0f), 1, 0); MyStateObjects.SSAO_BlendState.Apply(); } if (effectVolumetricSsao.UseBlur) { MyGuiManager.DrawSpriteFast(MyRender.GetRenderTarget(MyRenderTargets.SSAOBlur), 0, 0, MyCamera.Viewport.Width, MyCamera.Viewport.Height, Color.White); } else { MyGuiManager.DrawSpriteFast(MyRender.GetRenderTarget(MyRenderTargets.SSAO), 0, 0, MyCamera.Viewport.Width, MyCamera.Viewport.Height, Color.White); } } break; } return(source); }
/// <summary> /// Render method is called directly by renderer. Depending on stage, post process can do various things /// </summary> /// <param name="postProcessStage">Stage indicating in which part renderer currently is.</param>public override void RenderAfterBlendLights() public override Texture Render(PostProcessStage postProcessStage, Texture source, Texture availableRenderTarget) { switch (postProcessStage) { case PostProcessStage.LODBlend: { //if (RenderHDRThisFrame()) //{ // (MyRender.GetEffect(MyEffects.BlendLights) as MyEffectBlendLights).CopyEmissivityTechnique = MyEffectBlendLights.Technique.CopyEmissivityHDR; // (MyRender.GetEffect(MyEffects.BlendLights) as MyEffectBlendLights).DefaultTechnique = MyEffectBlendLights.Technique.HDR; // (MyRender.GetEffect(MyEffects.DirectionalLight) as MyEffectDirectionalLight).DefaultTechnique = MyEffectDirectionalLight.Technique.DefaultHDR; // (MyRender.GetEffect(MyEffects.DirectionalLight) as MyEffectDirectionalLight).DefaultWithoutShadowsTechnique = MyEffectDirectionalLight.Technique.WithoutShadowsHDR; // (MyRender.GetEffect(MyEffects.DirectionalLight) as MyEffectDirectionalLight).DefaultNoLightingTechnique = MyEffectDirectionalLight.Technique.NoLightingHDR; // (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultTechnique = MyEffectPointLight.MyEffectPointLightTechnique.DefaultHDR; // (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultPointTechnique = MyEffectPointLight.MyEffectPointLightTechnique.DefaultHDR; // (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultHemisphereTechnique = MyEffectPointLight.MyEffectPointLightTechnique.DefaultHDR; // (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultReflectorTechnique = MyEffectPointLight.MyEffectPointLightTechnique.ReflectorHDR; // unused, dont have instancing // (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultSpotTechnique = MyEffectPointLight.MyEffectPointLightTechnique.SpotHDR; // (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultSpotShadowTechnique = MyEffectPointLight.MyEffectPointLightTechnique.SpotShadowsHDR; // (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultPointInstancedTechnique = MyEffectPointLight.MyEffectPointLightTechnique.PointHDR_Instanced; // (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultHemisphereInstancedTechnique = MyEffectPointLight.MyEffectPointLightTechnique.HemisphereHDR_Instanced; // (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultSpotInstancedTechnique = MyEffectPointLight.MyEffectPointLightTechnique.SpotHDR_Instanced; //} break; } case PostProcessStage.HDR: { // if HDR is disabled or some debug rendering display // is enabled then skip HDR post process if (!RenderHDRThisFrame()) { return(source); } BlendState.Opaque.Apply(); DepthStencilState.None.Apply(); // RasterizerState.CullNone.Apply(MyMinerGameDX.Static.GraphicsDevice); m_thresholdTargets[0] = MyRender.GetRenderTarget(MyRenderTargets.Normals); m_thresholdTargets[1] = availableRenderTarget; // 1. threshold GenerateThreshold( source, MyRender.GetRenderTarget(MyRenderTargets.Diffuse), m_thresholdTargets, MyRender.GetEffect(MyEffects.Threshold) as MyEffectThreshold, Threshold, BloomIntensity, BloomIntensityBackground, Exposure); /* * MyMinerGame.SetRenderTarget(null, null, SetDepthTargetEnum.RestoreDefault); * MyMinerGame.SetRenderTarget(availableRenderTarget, null, SetDepthTargetEnum.RestoreDefault); * MyEffectScreenshot ssEffect = MyRender.GetEffect(MyEffects.Screenshot) as MyEffectScreenshot; * ssEffect.SetSourceTexture(m_thresholdTargets[0]); * ssEffect.SetScale(MinerWarsMath.Vector2.One); * ssEffect.SetTechnique(MyEffectScreenshot.ScreenshotTechniqueEnum.Default); * MyGuiManager.GetFullscreenQuad().Draw(ssEffect); * return availableRenderTarget; */ // 2. downscale HDR1 -> Downscaled8 // !! IMPORTANT !! you cannot just switch the function call if you want different downscale // Also changing the RTs is necessary (they have fixed dimensions). GenerateDownscale4( MyRender.GetRenderTarget(MyRenderTargets.Normals), MyRender.GetRenderTarget(MyRenderTargets.Depth), MyRender.GetRenderTarget(MyRenderTargets.HDR4Threshold), MyRender.GetEffect(MyEffects.Scale) as MyEffectScale); /* * // 3?. avg luminance * float dt = (MyMinerGame.TotalGamePlayTimeInMilliseconds - lastTime) / 1000.0f; * lastTime = MyMinerGame.TotalGamePlayTimeInMilliseconds; * CalculateAverageLuminance( * MyRender.GetRenderTarget(MyRenderTargets.Downscaled8), * MyRender.GetRenderTarget(MyRenderTargets.Downscaled8Threshold), * MyRender.GetEffect(MyEffects.Luminance) as MyEffectLuminance, * MyRender.GetEffect(MyEffects.Scale) as MyEffectScale, * dt, 0.5f); */ // 4. blur Blur(MyRender.GetRenderTarget(MyRenderTargets.HDR4Threshold), MyRender.GetRenderTarget(MyRenderTargets.HDR4), MyRender.GetEffect(MyEffects.GaussianBlur) as MyEffectGaussianBlur, VerticalBlurAmount, HorizontalBlurAmount); // 5. scale blurred to halfsize Upscale4To2( MyRender.GetRenderTarget(MyRenderTargets.HDR4Threshold), MyRender.GetRenderTarget(MyRenderTargets.AuxiliaryHalf1010102), MyRender.GetEffect(MyEffects.Scale) as MyEffectScale); MyMinerGame.SetRenderTarget(availableRenderTarget, null, SetDepthTargetEnum.RestoreDefault); // 6. tonemap + apply bloom HDR( source, MyRender.GetRenderTarget(MyRenderTargets.Diffuse), MyRender.GetRenderTarget(MyRenderTargets.AuxiliaryHalf1010102), MyRender.GetEffect(MyEffects.HDR) as MyEffectHDR, 0.6f, Exposure); return(availableRenderTarget); //RenderTarget2D temp = currentFrameAdaptedLuminance; //currentFrameAdaptedLuminance = lastFrameAdaptedLuminance; //lastFrameAdaptedLuminance = temp; } } return(source); }
internal static void RenderLights() { PrepareLights(); RenderSpotShadows(); m_renderProfiler.StartProfilingBlock("Render lights"); MyMinerGame.SetRenderTarget(GetRenderTarget(MyRenderTargets.Auxiliary1), null, SetDepthTargetEnum.RestoreDefault); MyMinerGame.Static.GraphicsDevice.Clear(ClearFlags.Target, new ColorBGRA(0.0f), 1, 0); SetCorrectViewportSize(); if (MyRender.CurrentRenderSetup.EnableSmallLights.Value) { MyEffectPointLight effectPointLight = (MyEffectPointLight)MyRender.GetEffect(MyEffects.PointLight); Texture diffuseRT = MyRender.GetRenderTarget(MyRenderTargets.Diffuse); effectPointLight.SetNormalsRT(MyRender.GetRenderTarget(MyRenderTargets.Normals)); effectPointLight.SetDiffuseRT(diffuseRT); effectPointLight.SetDepthsRT(MyRender.GetRenderTarget(MyRenderTargets.Depth)); effectPointLight.SetHalfPixel(diffuseRT.GetLevelDescription(0).Width, diffuseRT.GetLevelDescription(0).Height); effectPointLight.SetScale(GetScaleForViewport(diffuseRT)); Matrix invViewProjMatrix = Matrix.Invert(MyCamera.ViewProjectionMatrix); Matrix invViewMatrix = Matrix.Invert(MyCamera.ViewMatrix); effectPointLight.SetCameraPosition(MyCamera.Position); effectPointLight.SetViewMatrix(MyCamera.ViewMatrix); effectPointLight.SetInvViewMatrix(invViewMatrix); DepthStencilState.None.Apply(); MyStateObjects.Light_Combination_BlendState.Apply(); //Render each light with a model specific to the light m_renderProfiler.StartProfilingBlock("PointLight"); var cullRationSq = MyRenderConstants.DISTANCE_LIGHT_CULL_RATIO * MyRenderConstants.DISTANCE_LIGHT_CULL_RATIO; effectPointLight.SetTechnique(effectPointLight.DefaultTechnique); foreach (MyLight light in m_pointLights) { float distanceSq = Vector3.DistanceSquared(MyCamera.Position, light.PositionWithOffset); var hasVolumetricGlare = light.GlareOn && light.Glare.Type == MyLightGlare.GlareTypeEnum.Distant; var isTooFarAway = (light.Range * light.Range) < (distanceSq / cullRationSq); if (!isTooFarAway) { // Always cull clockwise (render inner parts of object), depth test is done is PS using light radius RasterizerState.CullClockwise.Apply(); effectPointLight.SetLightPosition(light.PositionWithOffset); effectPointLight.SetLightIntensity(light.Intensity); effectPointLight.SetSpecularLightColor(light.SpecularColor); effectPointLight.SetFalloff(light.Falloff); effectPointLight.SetLightRadius(light.Range); effectPointLight.SetReflectorTexture(light.ReflectorTexture); effectPointLight.SetLightColor(new Vector3(light.Color.X, light.Color.Y, light.Color.Z)); effectPointLight.SetTechnique(effectPointLight.DefaultTechnique); MySimpleObjectDraw.DrawSphereForLight(effectPointLight, ref light.PositionWithOffset, light.Range, ref MyMath.Vector3One, 1); MyPerformanceCounter.PerCameraDraw.LightsCount++; } if (!isTooFarAway || hasVolumetricGlare) { light.Draw(); } } m_renderProfiler.EndProfilingBlock(); m_renderProfiler.StartProfilingBlock("Hemisphere"); foreach (MyLight light in m_hemiLights) { // compute bounding box //Vector3 center = light.Position;// - light.Range * new Vector3(0,1,0); //Vector3 extend = new Vector3(light.Range, light.Range, light.Range); //m_lightBoundingBox.Min = center - extend; //m_lightBoundingBox.Max = center + extend; // Always cull clockwise (render inner parts of object), depth test is done is PS using light radius if (Vector3.Dot(light.ReflectorDirection, MyCamera.Position - light.Position) > 0 && light.PointBoundingSphere.Contains(MyCamera.Position) == MinerWarsMath.ContainmentType.Contains) { RasterizerState.CullNone.Apply(); //zevnitr } else { RasterizerState.CullCounterClockwise.Apply(); //zvenku } effectPointLight.SetLightPosition(light.Position); effectPointLight.SetLightIntensity(light.Intensity); effectPointLight.SetSpecularLightColor(light.SpecularColor); effectPointLight.SetFalloff(light.Falloff); effectPointLight.SetLightRadius(light.Range); effectPointLight.SetReflectorTexture(light.ReflectorTexture); effectPointLight.SetLightColor(new Vector3(light.Color.X, light.Color.Y, light.Color.Z)); effectPointLight.SetTechnique(effectPointLight.DefaultHemisphereTechnique); Matrix world = Matrix.CreateScale(light.Range) * Matrix.CreateWorld(light.Position, light.ReflectorDirection, light.ReflectorUp); MySimpleObjectDraw.DrawHemisphereForLight(effectPointLight, ref world, ref MyMath.Vector3One, 1); light.Draw(); MyPerformanceCounter.PerCameraDraw.LightsCount++; } m_renderProfiler.EndProfilingBlock(); m_renderProfiler.StartProfilingBlock("Spotlight"); RenderSpotLights(m_spotLightRenderElements, effectPointLight); m_renderProfiler.EndProfilingBlock(); if (EnableSpectatorReflector && DrawSpectatorReflector && SpectatorReflector != null && SpectatorReflector.LightOn && SpectatorReflector.ReflectorOn) { SpectatorReflector.ReflectorDirection = MyCamera.ForwardVector; SpectatorReflector.ReflectorUp = MyCamera.UpVector; SpectatorReflector.SetPosition(MyCamera.Position); effectPointLight.SetLightPosition(SpectatorReflector.Position); effectPointLight.SetReflectorTexture(null); effectPointLight.SetReflectorDirection(SpectatorReflector.ReflectorDirection); effectPointLight.SetReflectorConeMaxAngleCos(1 - SpectatorReflector.ReflectorConeMaxAngleCos); effectPointLight.SetReflectorColor(SpectatorReflector.ReflectorColor); effectPointLight.SetReflectorRange(SpectatorReflector.ReflectorRange); effectPointLight.SetCameraPosition(MyCamera.Position); // Special case, for camera reflector effectPointLight.SetReflectorIntensity(MyMinerShipConstants.MINER_SHIP_NEAR_REFLECTOR_INTENSITY * MySmallShip.ReflectorIntensityMultiplier); effectPointLight.SetReflectorFalloff(MyMinerShipConstants.MINER_SHIP_NEAR_REFLECTOR_FALLOFF); effectPointLight.SetTechnique(effectPointLight.DefaultSpotTechnique); MySimpleObjectDraw.DrawConeForLight(effectPointLight, SpectatorReflector.SpotWorld); // Always cull clockwise (render inner parts of object), depth test is done is PS using light radius RasterizerState.CullClockwise.Apply(); effectPointLight.SetLightIntensity(MyMinerShipConstants.MINER_SHIP_NEAR_LIGHT_INTENSITY); effectPointLight.SetSpecularLightColor(Color.White.ToVector3()); effectPointLight.SetFalloff(1.0f); effectPointLight.SetLightRadius(MyMinerShipConstants.MINER_SHIP_NEAR_LIGHT_RANGE); effectPointLight.SetLightColor(new Color(MyReflectorConstants.SHORT_REFLECTOR_LIGHT_COLOR).ToVector3()); effectPointLight.SetTechnique(effectPointLight.DefaultSpotTechnique); MySimpleObjectDraw.DrawSphereForLight(effectPointLight, ref MyCamera.Position, MyMinerShipConstants.MINER_SHIP_NEAR_LIGHT_RANGE, ref MyMath.Vector3One, 1); MyPerformanceCounter.PerCameraDraw.LightsCount++; } } DepthStencilState.None.Apply(); RasterizerState.CullCounterClockwise.Apply(); MyStateObjects.Sun_Combination_BlendState.Apply(); m_renderProfiler.StartProfilingBlock("Sun light"); if (EnableSun && CurrentRenderSetup.EnableSun.Value) { //Sun light MyEffectDirectionalLight effectDirectionalLight = MyRender.GetEffect(MyEffects.DirectionalLight) as MyEffectDirectionalLight; Texture diffuseRTSun = MyRender.GetRenderTarget(MyRenderTargets.Diffuse); effectDirectionalLight.SetNormalsRT(MyRender.GetRenderTarget(MyRenderTargets.Normals)); effectDirectionalLight.SetDiffuseRT(diffuseRTSun); effectDirectionalLight.SetDepthsRT(MyRender.GetRenderTarget(MyRenderTargets.Depth)); effectDirectionalLight.SetHalfPixelAndScale(diffuseRTSun.GetLevelDescription(0).Width, diffuseRTSun.GetLevelDescription(0).Height, GetScaleForViewport(diffuseRTSun)); effectDirectionalLight.SetCameraMatrix(Matrix.Invert(MyCamera.ViewMatrix)); effectDirectionalLight.SetAmbientMinimumAndIntensity(new Vector4(AmbientColor * AmbientMultiplier, EnvAmbientIntensity)); effectDirectionalLight.SetTextureEnvironmentMain(MyEnvironmentMap.EnvironmentMainMap); effectDirectionalLight.SetTextureEnvironmentAux(MyEnvironmentMap.EnvironmentAuxMap); effectDirectionalLight.SetTextureAmbientMain(MyEnvironmentMap.AmbientMainMap); effectDirectionalLight.SetTextureAmbientAux(MyEnvironmentMap.AmbientAuxMap); effectDirectionalLight.SetTextureEnvironmentBlendFactor(MyEnvironmentMap.BlendFactor); effectDirectionalLight.SetCameraPosition(MyCamera.Position); //Set distance where no slope bias will be applied (because of cockpit artifacts) effectDirectionalLight.SetNearSlopeBiasDistance(3); effectDirectionalLight.ShowSplitColors(ShowCascadeSplits); effectDirectionalLight.SetShadowBias(0.0001f * MyRenderConstants.RenderQualityProfile.ShadowBiasMultiplier); effectDirectionalLight.SetSlopeBias(0.00002f); effectDirectionalLight.SetSlopeCascadeMultiplier(20.0f); //100 makes artifacts in prefabs MyRender.GetShadowRenderer().SetupShadowBaseEffect(effectDirectionalLight); effectDirectionalLight.SetLightDirection(-m_sun.Direction); //*-1 because of shader opts effectDirectionalLight.SetLightColorAndIntensity(new Vector3(m_sun.Color.X, m_sun.Color.Y, m_sun.Color.Z), m_sun.Intensity); effectDirectionalLight.SetBacklightColorAndIntensity(new Vector3(m_sun.BackColor.X, m_sun.BackColor.Y, m_sun.BackColor.Z), m_sun.BackIntensity); //m_sun.SpecularColor = {X:0,9137255 Y:0,6078432 Z:0,2078431} //nice yellow effectDirectionalLight.SetSpecularLightColor(m_sun.SpecularColor); effectDirectionalLight.EnableCascadeBlending(MyRenderConstants.RenderQualityProfile.EnableCascadeBlending); effectDirectionalLight.SetFrustumCorners(MyRender.GetShadowRenderer().GetFrustumCorners()); effectDirectionalLight.SetEnableAmbientEnvironment(EnableEnvironmentMapAmbient && MyRenderConstants.RenderQualityProfile.EnableEnvironmentals && CurrentRenderSetup.EnableEnvironmentMapping.Value); effectDirectionalLight.SetEnableReflectionEnvironment(EnableEnvironmentMapReflection && MyRenderConstants.RenderQualityProfile.EnableEnvironmentals && CurrentRenderSetup.EnableEnvironmentMapping.Value); if (EnableShadows && MyRender.CurrentRenderSetup.ShadowRenderer != null) { effectDirectionalLight.SetTechnique(effectDirectionalLight.DefaultTechnique); } else { effectDirectionalLight.SetTechnique(effectDirectionalLight.DefaultWithoutShadowsTechnique); } MyGuiManager.GetFullscreenQuad().Draw(effectDirectionalLight); } m_renderProfiler.EndProfilingBlock(); // Blend in background if (true) // blend background { m_renderProfiler.StartProfilingBlock("Blend background"); if (MyFakes.RENDER_PREVIEWS_WITH_CORRECT_ALPHA) { // for some reason the other option does not give 0 alpha for the background when rendering gui preview images MyStateObjects.Additive_NoAlphaWrite_BlendState.Apply(); } else { MyStateObjects.NonPremultiplied_NoAlphaWrite_BlendState.Apply(); //BlendState.NonPremultiplied.Apply(); } DepthStencilState.None.Apply(); RasterizerState.CullCounterClockwise.Apply(); MyEffectBlendLights effectBlendLights = MyRender.GetEffect(MyEffects.BlendLights) as MyEffectBlendLights; Texture diffuseRT = GetRenderTarget(MyRenderTargets.Diffuse); MyCamera.SetupBaseEffect(effectBlendLights, m_currentSetup.FogMultiplierMult); effectBlendLights.SetDiffuseTexture(diffuseRT); effectBlendLights.SetNormalTexture(GetRenderTarget(MyRenderTargets.Normals)); effectBlendLights.SetDepthTexture(GetRenderTarget(MyRenderTargets.Depth)); effectBlendLights.SetHalfPixel(diffuseRT.GetLevelDescription(0).Width, diffuseRT.GetLevelDescription(0).Height); effectBlendLights.SetScale(GetScaleForViewport(diffuseRT)); effectBlendLights.SetBackgroundTexture(GetRenderTarget(MyRenderTargets.Auxiliary0)); effectBlendLights.SetTechnique(effectBlendLights.DefaultTechnique); MyGuiManager.GetFullscreenQuad().Draw(effectBlendLights); m_renderProfiler.EndProfilingBlock(); // Blend in emissive light, overwrite emissivity (alpha) m_renderProfiler.StartProfilingBlock("Copy emisivity"); if (MyPostProcessHDR.RenderHDRThisFrame()) { MyStateObjects.AddEmissiveLight_BlendState.Apply(); } else { MyStateObjects.AddEmissiveLight_NoAlphaWrite_BlendState.Apply(); } effectBlendLights.SetTechnique(effectBlendLights.CopyEmissivityTechnique); MyGuiManager.GetFullscreenQuad().Draw(effectBlendLights); bool showDebugLighting = false; if (ShowSpecularIntensity) { effectBlendLights.SetTechnique(MyEffectBlendLights.Technique.OnlySpecularIntensity); showDebugLighting = true; } else if (ShowSpecularPower) { effectBlendLights.SetTechnique(MyEffectBlendLights.Technique.OnlySpecularPower); showDebugLighting = true; } else if (ShowEmissivity) { effectBlendLights.SetTechnique(MyEffectBlendLights.Technique.OnlyEmissivity); showDebugLighting = true; } else if (ShowReflectivity) { effectBlendLights.SetTechnique(MyEffectBlendLights.Technique.OnlyReflectivity); showDebugLighting = true; } if (showDebugLighting) { BlendState.Opaque.Apply(); MyGuiManager.GetFullscreenQuad().Draw(effectBlendLights); } m_renderProfiler.EndProfilingBlock(); } //TakeScreenshot("Accumulated_lights", GetRenderTarget(MyRenderTargets.Lod0Depth), MyEffectScreenshot.ScreenshotTechniqueEnum.Default); /*TakeScreenshot("EnvironmentMap_1", GetRenderTargetCube(MyRenderTargets.EnvironmentCube), MyEffectScreenshot.ScreenshotTechniqueEnum.Default); * TakeScreenshot("EnvironmentMap_2", GetRenderTargetCube(MyRenderTargets.EnvironmentCubeAux), MyEffectScreenshot.ScreenshotTechniqueEnum.Default); * TakeScreenshot("AmbientMap_1", GetRenderTargetCube(MyRenderTargets.AmbientCube), MyEffectScreenshot.ScreenshotTechniqueEnum.Default); * TakeScreenshot("AmbientMap_2", GetRenderTargetCube(MyRenderTargets.AmbientCubeAux), MyEffectScreenshot.ScreenshotTechniqueEnum.Default); */ m_renderProfiler.EndProfilingBlock(); }
/// <summary> /// Render method is called directly by renderer. Depending on stage, post process can do various things /// </summary> /// <param name="postProcessStage">Stage indicating in which part renderer currently is.</param>public override void RenderAfterBlendLights() public override Texture Render(PostProcessStage postProcessStage, Texture source, Texture availableRenderTarget) { switch (postProcessStage) { case PostProcessStage.AlphaBlended: { Density = MySector.GodRaysProperties.Density; Weight = MySector.GodRaysProperties.Weight; Decay = MySector.GodRaysProperties.Decay; Exposition = MySector.GodRaysProperties.Exposition; var halfRT = MyRender.GetRenderTarget(MyRenderTargets.AuxiliaryHalf0); MyMinerGame.SetRenderTarget(halfRT, null); BlendState.Opaque.Apply(); RasterizerState.CullNone.Apply(); DepthStencilState.None.Apply(); MyEffectGodRays effectGodRays = MyRender.GetEffect(MyEffects.GodRays) as MyEffectGodRays; effectGodRays.SetDiffuseTexture(source); effectGodRays.SetDepthTexture(MyRender.GetRenderTarget(MyRenderTargets.Depth)); effectGodRays.SetFrustumCorners(MyRender.GetShadowRenderer().GetFrustumCorners()); effectGodRays.SetView(MyCamera.ViewMatrix); effectGodRays.SetWorldViewProjection(MyCamera.ViewProjectionMatrix); effectGodRays.SetDensity(Density); effectGodRays.SetDecay(Decay); effectGodRays.SetWeight(Weight * (1 - MySector.FogProperties.FogMultiplier)); effectGodRays.SetExposition(Exposition); //effectGodRays.LightPosition.SetValue(1500f * -MySunGlare.GetSunDirection() * MySunConstants.RENDER_SUN_DISTANCE); effectGodRays.SetLightPosition(1500f * -MyRender.Sun.Direction * MySunConstants.RENDER_SUN_DISTANCE); effectGodRays.SetLightDirection(MyRender.Sun.Direction); effectGodRays.SetCameraPos(MyCamera.Position); MyGuiManager.GetFullscreenQuad().Draw(effectGodRays); if (ApplyBlur) { var auxTarget = MyRender.GetRenderTarget(MyRenderTargets.AuxiliaryHalf1010102); var blurEffect = MyRender.GetEffect(MyEffects.GaussianBlur) as MyEffectGaussianBlur; blurEffect.SetHalfPixel(halfRT.GetLevelDescription(0).Width, halfRT.GetLevelDescription(0).Height); // Apply vertical gaussian blur MyMinerGame.SetRenderTarget(auxTarget, null); blurEffect.BlurAmount = 1; blurEffect.SetSourceTexture(halfRT); blurEffect.SetHeightForVerticalPass(halfRT.GetLevelDescription(0).Height); MyGuiManager.GetFullscreenQuad().Draw(blurEffect); // Apply horizontal gaussian blur MyMinerGame.SetRenderTarget(halfRT, null); blurEffect.BlurAmount = 1; blurEffect.SetSourceTexture(auxTarget); blurEffect.SetWidthForHorisontalPass(auxTarget.GetLevelDescription(0).Width); MyGuiManager.GetFullscreenQuad().Draw(blurEffect); } // Additive MyMinerGame.SetRenderTarget(availableRenderTarget, null); //MyMinerGame.Static.GraphicsDevice.Clear(ClearFlags.All, new SharpDX.ColorBGRA(0), 1, 0); BlendState.Opaque.Apply(); MyRender.Blit(source, true); var upscaleEffect = MyRender.GetEffect(MyEffects.Scale) as MyEffectScale; upscaleEffect.SetScale(new Vector2(2)); upscaleEffect.SetTechnique(MyEffectScale.Technique.HWScale); MyStateObjects.Additive_NoAlphaWrite_BlendState.Apply(); upscaleEffect.SetSourceTextureMod(halfRT); MyGuiManager.GetFullscreenQuad().Draw(upscaleEffect); /* * MyMinerGame.SetRenderTarget(availableRenderTarget, null); * var upscaleEffect = MyRender.GetEffect(MyEffects.Scale) as MyEffectScale; * upscaleEffect.SetScale(new Vector2(2)); * upscaleEffect.SetTechnique(MyEffectScale.Technique.HWScale); * //MyStateObjects.Additive_NoAlphaWrite_BlendState.Apply(); * BlendState.Opaque.Apply(); * * upscaleEffect.SetSourceTextureMod(halfRT); * MyGuiManager.GetFullscreenQuad().Draw(upscaleEffect); */ return(availableRenderTarget); } break; } return(source); }