Beispiel #1
0
        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));
        }
Beispiel #2
0
        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);
                }
            }
        }