예제 #1
0
        public void AplicarRender()
        {
            //Inicio el render de la escena, para ejemplos simples.
            //Cuando tenemos postprocesado o shaders es mejor realizar las operaciones según nuestra conveniencia.
            //PreRender();

            var device = D3DDevice.Instance.Device;

            // Capturamos las texturas de pantalla
            Surface screenRenderTarget = device.GetRenderTarget(0);
            Surface screenDepthSurface = device.DepthStencilSurface;

            // Especificamos que vamos a dibujar en una textura
            Surface surface = gameModel.renderTarget1.GetSurfaceLevel(0);

            device.SetRenderTarget(0, surface);
            device.DepthStencilSurface = gameModel.depthStencil;

            // Captura de escena en render target
            device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.CornflowerBlue, 1.0f, 0);
            device.BeginScene();

            //Render

            if (!gameModel.estoyJugando)
            {
                gameModel.menu.renderSprite();
            }
            else
            {
                TgcMesh unPoste = gameModel.escenario.listaDePostes.OrderBy(poste => gameModel.DistanciaA2(poste)).First();
                if (!gameModel.personaje.tieneLuz && gameModel.DistanciaA2(unPoste) < 1000)
                {
                    //Se prende el farol mas cercano
                    this.renderSombras(unPoste.BoundingBox.PMin, new TGCVector3(unPoste.BoundingBox.PMin.X, 15, unPoste.BoundingBox.PMin.Z), new TGCVector3(15, 380, 15));
                }
                else
                {
                    //01158354515 --> Numero de Marce
                    //this.renderSombras(gameModel.personaje.getPosition(), gameModel.personaje.getLookAt(), new TGCVector3(100, 10, -150));
                    this.renderSombrasPersonaje(gameModel.personaje);
                    //monsterBlur.RenderMonsterBlur();
                }
            }
            device.EndScene();
            // Fin de escena


            // Especificamos que vamos a dibujar en pantalla
            device.SetRenderTarget(0, screenRenderTarget);
            device.DepthStencilSurface = screenDepthSurface;

            // Dibujado de textura en full screen quad
            device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0);
            device.BeginScene();

            gameModel.quads.FindAll(unQuad => unQuad.loEstoyUsando).ForEach(unQuad => gameModel.RenderQuad(unQuad));

            //this.OurFullScreenQuad(device, effectPosProcesado);

            gameModel.RenderFps();

            gameModel.nota.renderSprite();
            gameModel.vidaUtilVela.renderSprite();
            gameModel.velita.renderSprite();
            gameModel.vidaUtilLinterna.renderSprite();
            gameModel.linternita.renderSprite();
            //RenderAxis();
            device.EndScene();

            device.Present();

            surface.Dispose();
        }
예제 #2
0
        public void RenderMonsterBlur()
        {
            TexturesManager.Instance.clearAll();
            var device = D3DDevice.Instance.Device;

            // guardo el Render target anterior y seteo la textura como render target
            var pOldRT = device.GetRenderTarget(0);
            var pSurf  = g_pVel1.GetSurfaceLevel(0);

            device.SetRenderTarget(0, pSurf);
            // hago lo mismo con el depthbuffer, necesito el que no tiene multisampling
            var pOldDS = device.DepthStencilSurface;

            device.DepthStencilSurface = g_pDepthStencil;

            // 1 - Genero un mapa de velocidad
            effect.Technique = "VelocityMap";
            // necesito mandarle la matrix de view proj anterior
            effect.SetValue("matWorldViewProjAnt", antMatWorldView.ToMatrix() * device.Transform.Projection);
            device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Gray, 1.0f, 0);
            device.BeginScene();

            renderScene("VelocityMap");
            device.EndScene();
            device.Present();

            pSurf.Dispose();

            // 2- Genero la imagen pp dicha
            effect.Technique = "DefaultTechnique";
            pSurf            = g_pRenderTarget.GetSurfaceLevel(0);
            device.SetRenderTarget(0, pSurf);
            device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Gray, 1.0f, 0);
            device.BeginScene();

            renderScene("DefaultTechnique");

            device.EndScene();
            device.Present();
            pSurf.Dispose();

            // Ultima pasada vertical va sobre la pantalla pp dicha
            device.SetRenderTarget(0, pOldRT);
            device.DepthStencilSurface = pOldDS;

            device.BeginScene();
            effect.Technique    = "PostProcessMotionBlur";
            device.VertexFormat = CustomVertex.PositionTextured.Format;
            device.SetStreamSource(0, g_pVBV3D, 0);
            effect.SetValue("g_RenderTarget", g_pRenderTarget);
            effect.SetValue("texVelocityMap", g_pVel1);
            effect.SetValue("texVelocityMapAnt", g_pVel2);
            device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Gray, 1.0f, 0);
            effect.Begin(FX.None);
            effect.BeginPass(0);
            device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);

            effect.EndPass();

            effect.End();
            gameModel.RenderFps();

            gameModel.nota.renderSprite();
            gameModel.vidaUtilVela.renderSprite();
            gameModel.velita.renderSprite();
            gameModel.vidaUtilLinterna.renderSprite();
            gameModel.linternita.renderSprite();

            device.EndScene();
            device.Present();

            // actualizo los valores para el proximo frame
            foreach (TgcMesh mesh in meshes)
            {
                antMatWorldView = mesh.Transform * TGCMatrix.FromMatrix(device.Transform.View);
                var aux = g_pVel2;
                g_pVel2 = g_pVel1;
                g_pVel1 = aux;
            }
        }