public RenderPipeline(GraphicsDevice dev, Camera c) { _device = dev; camera = c; _visualizationEffect = new BasicEffect(this._device) { VertexColorEnabled = true }; /// <summary> /// added /// </summary> sprite = new SpriteBatch(this._device); frustumForShadow = new BoundingFrustum(Matrix.Identity); debugRenderer = new DebugRender.DebugRenderer(_device, _visualizationEffect); debugRenderArray = new MyContainer<PivotObject>(10, 3); EnableShadows = Config.Instance["_enableShadows"]; SmoothShadows = Config.Instance["_smoothShadows"]; EnableDebugRender = Config.Instance["_enableDebugRender"]; int size = Config.Instance["_shadowMapSize"]; if (size != 0) shadowMapWidthHeight = size; instancingTechnique = Config.Instance["_useHardwareInstancing"] ? InstancingTechnique.HardwareInstancing : InstancingTechnique.NoInstancing; if (EnableShadows) { if (dev.GraphicsProfile == GraphicsProfile.HiDef) { shadowRenderTarget = new RenderTarget2D(_device, shadowMapWidthHeight, shadowMapWidthHeight, false, SurfaceFormat.Single, DepthFormat.Depth16); } else { if (!Config.Instance["_ultraLowRender"]) { shadowRenderTarget = new RenderTarget2D(_device, shadowMapWidthHeight, shadowMapWidthHeight, false, SurfaceFormat.Color, DepthFormat.None, 0, RenderTargetUsage.DiscardContents); } else { shadowRenderTarget = new RenderTarget2D(_device, dev.PresentationParameters.BackBufferWidth, dev.PresentationParameters.BackBufferHeight, false, SurfaceFormat.Color, DepthFormat.None); } SmoothShadows = false; } } arrays = new List<string>(); {//основные arrays.Add(Shader.AnimRenderNoSM); arrays.Add(Shader.NotAnimRenderNoSM); arrays.Add(Shader.AnimRenderSM); arrays.Add(Shader.NotAnimRenderSM); } {//шмапа arrays.Add(Shader.CreateStaticShadowMap); arrays.Add(Shader.CreateAnimShadowMap); } {//прозрачные arrays.Add(Shader.TransparentSM); arrays.Add(Shader.TransparentSelfIlmnNoSM); arrays.Add(Shader.TransparentNoSM); } {//инстансные //инст с шм arrays.Add(Shader.InstancedNoSM); arrays.Add(Shader.InstancedSM); //инстанс прозр с шм arrays.Add(Shader.InstancedTransparentNoSM); arrays.Add(Shader.InstancedTransparentSM); //инстанс прозр самосвет arrays.Add(Shader.InstancedTransparentSelfIlmnNoSM); } //если хайдеф, то и сгладенная шмапа if (dev.GraphicsProfile == GraphicsProfile.HiDef) { arrays.Add(Shader.AnimRenderSMSmooth); arrays.Add(Shader.NotAnimRenderSMSmooth); arrays.Add(Shader.TransparentSMSmooth); arrays.Add(Shader.InstancedTransparentSMSmooth); arrays.Add(Shader.InstancedSMSmooth); } foreach (string s in arrays) ArraysPerTehnique.Add(s, new RenderArray(s)); }
public void RenderToPicture(Camera Camera, Vector3 lightDir) { _device.RasterizerState = RasterizerState.CullClockwise; _device.DepthStencilState = DepthStencilState.Default; _device.BlendState = BlendState.Opaque; _device.SamplerStates[0] = SamplerState.LinearWrap; if (_device.GraphicsProfile == GraphicsProfile.Reach) { _device.SamplerStates[1] = SamplerState.PointClamp; } else _device.SamplerStates[1] = SamplerState.PointWrap; if (EnableShadows) { RenderToShadowMap(lightViewProjection, lightDir); Render.Materials.Material.ObjectRenderEffect.Parameters["ShadowMap"].SetValue(shadowRenderTarget); } this._device.Clear(Color.CornflowerBlue); PhysX_test2.Engine.Render.Materials.Material.ObjectRenderEffect.Parameters["Projection"].SetValue(Camera.Projection); PhysX_test2.Engine.Render.Materials.Material.ObjectRenderEffect.Parameters["View"].SetValue(Camera.View); string AnimTeh = "", NotAnimTeh = "", BlendSITeh = Shader.TransparentSelfIlmnNoSM, BlendTeh = ""; string InstTec = "", InstTrTec = "", InstSItec = Shader.InstancedTransparentSelfIlmnNoSM; if (EnableShadows) { if (SmoothShadows) { AnimTeh = Shader.AnimRenderSMSmooth; NotAnimTeh = Shader.NotAnimRenderSMSmooth; BlendTeh = Shader.TransparentSMSmooth; InstTec = Shader.InstancedSMSmooth; InstTrTec = Shader.InstancedTransparentSMSmooth; } else { AnimTeh = Shader.AnimRenderSM; NotAnimTeh = Shader.NotAnimRenderSM; BlendTeh = Shader.TransparentSM; InstTec = Shader.InstancedSM; InstTrTec = Shader.InstancedTransparentSM; } } else { AnimTeh = Shader.AnimRenderNoSM; NotAnimTeh = Shader.NotAnimRenderNoSM; BlendTeh = Shader.TransparentNoSM; InstTec = Shader.InstancedNoSM; InstTrTec = Shader.InstancedTransparentNoSM; } RenderArrayWithTehnique(AnimTeh); RenderArrayWithTehnique(NotAnimTeh); RenderArrayWithTehnique(InstTec); RenderBlendArrayWithTehnique(BlendSITeh); RenderBlendArrayWithTehnique(BlendTeh); RenderBlendArrayWithTehnique(InstTrTec); RenderBlendArrayWithTehnique(InstSItec); ////////// if (EnableShadows) { RenderArrayWithTehnique(Shader.AnimRenderNoSM); RenderArrayWithTehnique(Shader.NotAnimRenderNoSM); RenderBlendArrayWithTehnique(Shader.TransparentNoSM); RenderArrayWithTehnique(Shader.InstancedNoSM); RenderBlendArrayWithTehnique(Shader.InstancedTransparentNoSM); } if (EnableDebugRender) { //ДЕБАГ РЕНДЕР _visualizationEffect.World = Matrix.Identity; _visualizationEffect.View = Camera.View; _visualizationEffect.Projection = Camera.Projection; _visualizationEffect.CurrentTechnique.Passes[0].Apply(); foreach (PivotObject wo in debugRenderArray) { debugRenderer.RenderTransformedBB(wo.raycastaspect.boundingShape); //debugRenderer.RenderAABR(wo.raycastaspect.boundingShape); debugRenderer.RenderAABB(wo.raycastaspect.boundingShape); } } }