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(); }
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; } }