/// <summary> /// Renders the shadow map using the orthographic camera created in /// CalculateFrustum. /// </summary> /// <param name="modelList">The list of models to be rendered</param> protected void RenderShadowMap(int splitIndex) { PrepareViewportForCascade(splitIndex); // Set up the effect MyEffectShadowMap shadowMapEffect = MyRender.GetEffect(MyEffects.ShadowMap) as Effects.MyEffectShadowMap; shadowMapEffect.SetDitheringTexture((SharpDX.Direct3D9.Texture)MyTextureManager.GetTexture <MyTexture2D>(@"Textures\Models\Dither.png")); shadowMapEffect.SetHalfPixel(MyShadowRenderer.NumSplits * MyRender.GetShadowCascadeSize(), MyRender.GetShadowCascadeSize()); // Clear shadow map shadowMapEffect.SetTechnique(MyEffectShadowMap.ShadowTechnique.Clear); MyRender.GetFullscreenQuad().Draw(shadowMapEffect); shadowMapEffect.SetViewProjMatrix((Matrix)m_lightCameras[splitIndex].ViewProjMatrixAtZero); MyRender.GetRenderProfiler().StartProfilingBlock("draw elements"); // Draw the models DrawElements(m_lightCameras[splitIndex].CastingRenderElements, shadowMapEffect, true, m_lightCameras[splitIndex].WorldMatrix.Translation, splitIndex, true); m_lightCameras[splitIndex].CastingRenderElements.Clear(); MyRender.GetRenderProfiler().EndProfilingBlock(); }
protected static void DrawElements(List <MyRender.MyRenderElement> elements, MyEffectShadowMap effect, bool relativeCamera, int perfCounterIndex) { // Draw shadows. effect.SetTechnique(MyEffectShadowMap.ShadowTechnique.GenerateShadow); DrawShadowsForElements(effect, relativeCamera, elements, false, perfCounterIndex); effect.SetTechnique(MyEffectShadowMap.ShadowTechnique.GenerateShadowForVoxels); DrawShadowsForElements(effect, relativeCamera, elements, true, perfCounterIndex); }
protected void RenderShadowMap(Matrix lightViewProjectionAtZero) { // Set up the effect MyEffectShadowMap shadowMapEffect = MyRender.GetEffect(MyEffects.ShadowMap) as MyEffectShadowMap; shadowMapEffect.SetViewProjMatrix(lightViewProjectionAtZero); shadowMapEffect.SetDitheringTexture((SharpDX.Direct3D9.Texture)MyTextureManager.GetTexture <MyTexture2D>(@"Textures\Models\Dither.png")); shadowMapEffect.SetHalfPixel(MySpotShadowRenderer.SpotShadowMapSize, MySpotShadowRenderer.SpotShadowMapSize); // Draw the models DrawElements(m_renderElementsForShadows, shadowMapEffect, true, MyRenderCamera.Position, MyShadowRenderer.NumSplits, false); }
public override void RecreateControls(bool contructor) { Controls.Clear(); m_scale = 0.7f; AddCaption(new System.Text.StringBuilder("Render Lights debug"), Color.Yellow.ToVector4()); MyGuiControlLabel label = new MyGuiControlLabel(this, new Vector2(0.01f, -m_size.Value.Y / 2.0f + 0.07f), null, new System.Text.StringBuilder("(press ALT to share focus)"), Color.Yellow.ToVector4(), MyGuiConstants.LABEL_TEXT_SCALE * 0.7f, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_TOP); Controls.Add(label); m_currentPosition = -m_size.Value / 2.0f + new Vector2(0.02f, 0.10f); m_currentPosition.Y += 0.01f; AddLabel(new StringBuilder("Lights"), Color.Yellow.ToVector4(), 1.2f); AddCheckBox(new StringBuilder("Enable lights"), null, MemberHelper.GetMember(() => EnableRenderLights)); AddCheckBox(new StringBuilder("Enable light glares"), null, MemberHelper.GetMember(() => MyLightGlare.EnableLightGlares)); AddCheckBox(new StringBuilder("Enable spot shadows"), null, MemberHelper.GetMember(() => MyRender.EnableSpotShadows)); AddCheckBox(new StringBuilder("Enable spectator light"), null, MemberHelper.GetMember(() => MyRender.EnableSpectatorReflector)); AddCheckBox(new StringBuilder("Only specular intensity"), null, MemberHelper.GetMember(() => MyRender.ShowSpecularIntensity)); AddCheckBox(new StringBuilder("Only specular power"), null, MemberHelper.GetMember(() => MyRender.ShowSpecularPower)); AddCheckBox(new StringBuilder("Only emissivity"), null, MemberHelper.GetMember(() => MyRender.ShowEmissivity)); AddCheckBox(new StringBuilder("Only reflectivity"), null, MemberHelper.GetMember(() => MyRender.ShowReflectivity)); MyEffectShadowMap shadowMapEffect = MyRender.GetEffect(MyEffects.ShadowMap) as MyEffectShadowMap; if (shadowMapEffect != null) { m_currentPosition.Y += 0.01f; AddLabel(new StringBuilder("Sun"), Color.Yellow.ToVector4(), 1.2f); AddCheckBox(new StringBuilder("Enable sun"), null, MemberHelper.GetMember(() => MyRender.EnableSun)); AddCheckBox(new StringBuilder("Enable shadows"), null, MemberHelper.GetMember(() => MyRender.EnableShadows)); AddCheckBox(new StringBuilder("Enable asteroid shadows"), null, MemberHelper.GetMember(() => MyRender.EnableAsteroidShadows)); AddCheckBox(new StringBuilder("Enable ambient map"), MyRender.EnableEnvironmentMapAmbient, OnAmbientMapChecked); AddCheckBox(new StringBuilder("Enable reflection map"), MyRender.EnableEnvironmentMapReflection, OnReflectionMapChecked); AddCheckBox(new StringBuilder("Enable voxel ambient"), null, MemberHelper.GetMember(() => MyRender.EnablePerVertexVoxelAmbient)); AddSlider(new StringBuilder("Intensity"), 0, 10.0f, MySector.SunProperties, MemberHelper.GetMember(() => MySector.SunProperties.SunIntensity)); AddCheckBox(new StringBuilder("Show cascade splits"), null, MemberHelper.GetMember(() => MyRender.ShowCascadeSplits)); //nefunguje po obfuskaci // AddSlider(new StringBuilder("ShadowBias"), 0, 0.01f, shadowMapEffect, MemberHelper.GetMember(() => shadowMapEffect.ShadowBias)); AddCheckBox(new StringBuilder("Enable shadow interleaving"), null, MemberHelper.GetMember(() => MyRender.ShadowInterleaving)); AddCheckBox(new StringBuilder("Freeze cascade 0"), null, MemberHelper.GetMember(() => MyRender.FreezeCascade0)); AddCheckBox(new StringBuilder("Freeze cascade 1"), null, MemberHelper.GetMember(() => MyRender.FreezeCascade1)); AddCheckBox(new StringBuilder("Freeze cascade 2"), null, MemberHelper.GetMember(() => MyRender.FreezeCascade2)); AddCheckBox(new StringBuilder("Freeze cascade 3"), null, MemberHelper.GetMember(() => MyRender.FreezeCascade3)); } }
protected void RenderShadowMap(Matrix lightViewProjection) { // Set up the effect MyEffectShadowMap shadowMapEffect = MyRender.GetEffect(MyEffects.ShadowMap) as MinerWars.AppCode.Game.Effects.MyEffectShadowMap; shadowMapEffect.SetViewProjMatrix(lightViewProjection); /* * m_culledElements.Clear(); * foreach (MyRender.MyRenderElement element in m_renderElementsForShadows) * { * m_culledElements.Add(element); * } */ // Draw the models DrawElements(m_renderElementsForShadows, shadowMapEffect, false, MyPerformanceCounter.NoSplit); }
/// <summary> /// Renders the shadow map using the orthographic camera created in /// CalculateFrustum. /// </summary> /// <param name="modelList">The list of models to be rendered</param> protected void RenderShadowMap(int splitIndex) { PrepareViewportForCascade(splitIndex); // Set up the effect MyEffectShadowMap shadowMapEffect = MyRender.GetEffect(MyEffects.ShadowMap) as MinerWars.AppCode.Game.Effects.MyEffectShadowMap; // Clear shadow map shadowMapEffect.SetTechnique(MyEffectShadowMap.ShadowTechnique.Clear); MyGuiManager.GetFullscreenQuad().Draw(shadowMapEffect); shadowMapEffect.SetViewProjMatrix(m_lightCameras[splitIndex].ViewProjectionMatrix); MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("draw elements"); // Draw the models DrawElements(m_lightCameras[splitIndex].CastingRenderElements, shadowMapEffect, false, splitIndex); MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); }
private static void DrawShadowsForElements(MyEffectShadowMap effect, bool relativeCamera, List <MyRender.MyRenderElement> elements, bool voxelShadows, int perfCounterIndex) { effect.Begin(); long lastVertexBuffer = 0; for (int i = 0; i < elements.Count; i++) { MyRender.MyRenderElement renderElement = elements[i]; if ((renderElement.Entity is MyVoxelMap) != voxelShadows || renderElement.VertexBuffer.IsDisposed || renderElement.IndexBuffer.IsDisposed) { continue; } long currentVertexBuffer = renderElement.VertexBuffer.GetHashCode(); if (lastVertexBuffer != currentVertexBuffer) { lastVertexBuffer = currentVertexBuffer; MyMinerGame.Static.GraphicsDevice.SetStreamSource(0, renderElement.VertexBuffer, 0, renderElement.VertexStride); MyMinerGame.Static.GraphicsDevice.VertexDeclaration = renderElement.VertexDeclaration; MyMinerGame.Static.GraphicsDevice.Indices = renderElement.IndexBuffer; System.Diagnostics.Debug.Assert(renderElement.IndexBuffer != null); } effect.SetWorldMatrix(relativeCamera ? renderElement.WorldMatrixForDraw : renderElement.WorldMatrix); MyPerformanceCounter.PerCameraDraw.ShadowDrawCalls[perfCounterIndex]++; effect.D3DEffect.CommitChanges(); MyMinerGame.Static.GraphicsDevice.DrawIndexedPrimitive(SharpDX.Direct3D9.PrimitiveType.TriangleList, 0, 0, renderElement.VertexCount, renderElement.IndexStart, renderElement.TriCount); MyPerformanceCounter.PerCameraDraw.TotalDrawCalls++; } effect.End(); }
protected static void DrawElements(List <MyRender.MyRenderElement> elements, MyEffectShadowMap effect, bool relativeCamera, Vector3D cameraPos, int perfCounterIndex, bool ditheredShadows) { // Draw shadows. effect.SetTechnique(MyEffectShadowMap.ShadowTechnique.GenerateShadow); DrawShadowsForElements(effect, relativeCamera, cameraPos, elements, false, false, false, false, perfCounterIndex, ditheredShadows); effect.SetTechnique(MyEffectShadowMap.ShadowTechnique.GenerateShadowForVoxels); DrawShadowsForElements(effect, relativeCamera, cameraPos, elements, true, false, false, false, perfCounterIndex, ditheredShadows); effect.SetTechnique(MyEffectShadowMap.ShadowTechnique.GenerateShadowForSkinned); DrawShadowsForElements(effect, relativeCamera, cameraPos, elements, false, true, false, false, perfCounterIndex, ditheredShadows); effect.SetTechnique(MyEffectShadowMap.ShadowTechnique.GenerateShadowInstanced); DrawShadowsForElements(effect, relativeCamera, cameraPos, elements, false, false, true, false, perfCounterIndex, ditheredShadows); effect.SetTechnique(MyEffectShadowMap.ShadowTechnique.GenerateShadowInstancedGeneric); DrawShadowsForElements(effect, relativeCamera, cameraPos, elements, false, false, false, true, perfCounterIndex, ditheredShadows); // We don't want to keep objects alive Clear(); }
private static void DrawShadowsForElements(MyEffectShadowMap effect, bool relativeCamera, Vector3D cameraPos, List <MyRender.MyRenderElement> elements, bool voxelShadows, bool skinnedShadows, bool instancedShadows, bool genericInstancedShadows, int perfCounterIndex, bool ditheredShadows) { effect.Begin(); long lastVertexBuffer = 0; for (int i = 0; i < elements.Count; i++) { MyRender.MyRenderElement renderElement = elements[i]; if ((renderElement.RenderObject is MyRenderVoxelCell) != voxelShadows || renderElement.VertexBuffer.IsDisposed || renderElement.IndexBuffer.IsDisposed) { continue; } if ((renderElement.RenderObject is MyRenderCharacter) != skinnedShadows) { continue; } //if ((renderElement.InstanceBuffer != null) != instancedShadows) // continue; if ((renderElement.InstanceBuffer != null && renderElement.InstanceStride == 64) != instancedShadows) { continue; } if ((renderElement.InstanceBuffer != null && renderElement.InstanceStride == 32) != genericInstancedShadows) { continue; } long currentVertexBuffer = renderElement.VertexBuffer.GetHashCode(); if ((lastVertexBuffer != currentVertexBuffer) || instancedShadows || genericInstancedShadows) { lastVertexBuffer = currentVertexBuffer; MyRender.GraphicsDevice.Indices = renderElement.IndexBuffer; MyRender.GraphicsDevice.VertexDeclaration = renderElement.VertexDeclaration; if (renderElement.InstanceBuffer == null) { MyRender.GraphicsDevice.ResetStreamSourceFrequency(0); MyRender.GraphicsDevice.ResetStreamSourceFrequency(1); MyRender.GraphicsDevice.SetStreamSource(1, null, 0, 0); } else { MyRender.GraphicsDevice.SetStreamSourceFrequency(0, renderElement.InstanceCount, StreamSource.IndexedData); MyRender.GraphicsDevice.SetStreamSourceFrequency(1, 1, StreamSource.InstanceData); MyRender.GraphicsDevice.SetStreamSource(1, renderElement.InstanceBuffer, renderElement.InstanceStart * renderElement.InstanceStride, renderElement.InstanceStride); } MyRender.GraphicsDevice.SetStreamSource(0, renderElement.VertexBuffer, 0, renderElement.VertexStride); System.Diagnostics.Debug.Assert(renderElement.IndexBuffer != null); } if (relativeCamera) { MatrixD m = renderElement.WorldMatrix; m.Translation -= cameraPos; effect.SetWorldMatrix((Matrix)m); } else { effect.SetWorldMatrix((Matrix)renderElement.WorldMatrix); } if (voxelShadows) { var voxelCell = renderElement.RenderObject as MyRenderVoxelCell; if (voxelCell != null) { MyRenderVoxelCell.EffectArgs args; voxelCell.GetEffectArgs(out args); effect.VoxelVertex.SetArgs(ref args); } } var skinMatrices = skinnedShadows ? ((MyRenderCharacter)renderElement.RenderObject).SkinMatrices : null; if (skinMatrices != null) { var bonesUsed = renderElement.BonesUsed; if (bonesUsed == null) { for (int b = 0; b < Math.Min(skinMatrices.Length, MyRenderConstants.MAX_SHADER_BONES); b++) { m_bonesBuffer[b] = skinMatrices[b]; } } else { for (int b = 0; b < bonesUsed.Length; b++) { m_bonesBuffer[b] = skinMatrices[bonesUsed[b]]; } } effect.SetBones(m_bonesBuffer); } effect.SetDithering(ditheredShadows ? renderElement.Dithering : 0); MyPerformanceCounter.PerCameraDrawWrite.ShadowDrawCalls[perfCounterIndex]++; effect.D3DEffect.CommitChanges(); MyRender.GraphicsDevice.DrawIndexedPrimitive(SharpDX.Direct3D9.PrimitiveType.TriangleList, 0, 0, renderElement.VertexCount, renderElement.IndexStart, renderElement.TriCount); MyPerformanceCounter.PerCameraDrawWrite.TotalDrawCalls++; } MyRender.GraphicsDevice.ResetStreamSourceFrequency(0); MyRender.GraphicsDevice.ResetStreamSourceFrequency(1); effect.End(); }
public override void RecreateControls(bool contructor) { Controls.Clear(); m_scale = 0.62f; AddCaption(new System.Text.StringBuilder("Colors settings"), Color.Yellow.ToVector4()); MyGuiControlLabel label = new MyGuiControlLabel(this, new Vector2(0.01f, -m_size.Value.Y / 2.0f + 0.07f), null, new System.Text.StringBuilder("(press ALT to share focus)"), Color.Yellow.ToVector4(), MyGuiConstants.LABEL_TEXT_SCALE * 0.7f, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_TOP); Controls.Add(label); m_currentPosition = -m_size.Value / 2.0f + new Vector2(0.02f, 0.10f); m_currentPosition.Y += 0.01f; AddLabel(new StringBuilder("Sun"), Color.Yellow.ToVector4(), 1.2f); var sunObj = MySector.SunProperties; MyEffectShadowMap shadowMapEffect = MyRender.GetEffect(MyEffects.ShadowMap) as MyEffectShadowMap; if (shadowMapEffect != null) { m_currentPosition.Y += 0.01f; AddSlider(new StringBuilder("Intensity"), 0, 10.0f, sunObj, MemberHelper.GetMember(() => MySector.SunProperties.SunIntensity)); m_currentPosition.Y += 0.01f; AddColor(new StringBuilder("Sun color"), sunObj, MemberHelper.GetMember(() => MySector.SunProperties.SunDiffuse)); m_currentPosition.Y += 0.02f; AddColor(new StringBuilder("Sun specular"), sunObj, MemberHelper.GetMember(() => MySector.SunProperties.SunSpecular)); m_currentPosition.Y += 0.02f; AddSlider(new StringBuilder("Back sun intensity"), 0, 5.0f, sunObj, MemberHelper.GetMember(() => MySector.SunProperties.BackSunIntensity)); m_currentPosition.Y += 0.01f; AddColor(new StringBuilder("Back sun color"), sunObj, MemberHelper.GetMember(() => MySector.SunProperties.BackSunDiffuse)); m_currentPosition.Y += 0.02f; AddColor(new StringBuilder("Ambient color"), sunObj, MemberHelper.GetMember(() => MySector.SunProperties.AmbientColor)); m_currentPosition.Y += 0.02f; AddSlider(new StringBuilder("Ambient multiplier"), 0, 5.0f, sunObj, MemberHelper.GetMember(() => MySector.SunProperties.AmbientMultiplier)); AddSlider(new StringBuilder("Env. ambient intensity"), 0, 5.0f, sunObj, MemberHelper.GetMember(() => MySector.SunProperties.EnvironmentAmbientIntensity)); } /* * //m_currentPosition.Y += 0.01f; * AddLabel(new StringBuilder("Player ship"), Color.Yellow.ToVector4(), 1.2f); * * //m_currentPosition.Y += 0.01f; * AddSlider(new StringBuilder("Light range multiplier"), 0, 10, null, MemberHelper.GetMember(() => MySmallShip.LightRangeMultiplier)); * AddSlider(new StringBuilder("Light intensity multiplier"), 0, 10, null, MemberHelper.GetMember(() => MySmallShip.LightIntensityMultiplier)); * AddSlider(new StringBuilder("Reflector intensity multiplier"), 0, 10, null, MemberHelper.GetMember(() => MySmallShip.ReflectorIntensityMultiplier)); */ //m_currentPosition.Y += 0.01f; AddLabel(new StringBuilder("Post process"), Color.Yellow.ToVector4(), 1.2f); //m_currentPosition.Y += 0.01f; MyPostProcessContrast contrastPP = MyRender.GetPostProcess(MyPostProcessEnum.Contrast) as MyPostProcessContrast; if (contrastPP != null) { AddSlider(new StringBuilder("Contrast"), -10, 10, contrastPP, MemberHelper.GetMember(() => contrastPP.Contrast)); AddSlider(new StringBuilder("Hue"), -10, 10, contrastPP, MemberHelper.GetMember(() => contrastPP.Hue)); AddSlider(new StringBuilder("Saturation"), -10, 10, contrastPP, MemberHelper.GetMember(() => contrastPP.Saturation)); } m_currentPosition.Y += 0.01f; }