public override void init() { Device d3dDevice = GuiController.Instance.D3dDevice; //Activamos el renderizado customizado. De esta forma el framework nos delega control total sobre como dibujar en pantalla //La responsabilidad cae toda de nuestro lado GuiController.Instance.CustomRenderEnabled = true; //Creamos un FullScreen Quad screenQuad = new TgcScreenQuad(); //Creamos un Render Targer sobre el cual se va a dibujar toda la escena original int backBufferWidth = d3dDevice.PresentationParameters.BackBufferWidth; int backBufferHeight = d3dDevice.PresentationParameters.BackBufferHeight; sceneRT = new Texture(d3dDevice, backBufferWidth, backBufferHeight, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); //Definimos el tamaño de una textura que sea de 1/4 x 1/4 de la original, y que sean divisibles por 8 para facilitar los calculos de sampleo int cropWidth = (backBufferWidth - backBufferWidth % 8) / 4; int cropHeight = (backBufferHeight - backBufferHeight % 8) / 4; //Creamos un Render Target para auxiliar para almacenar la pasada horizontal de blur blurTempRT = new Texture(d3dDevice, cropWidth, cropHeight, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); //Cargar shader con efectos de Post-Procesado effect = TgcShaders.loadEffect(GuiController.Instance.ExamplesMediaDir + "Shaders\\GaussianBlur.fx"); //Configurar Technique dentro del shader effect.Technique = "GaussianBlurPass"; //Cargamos un escenario TgcSceneLoader loader = new TgcSceneLoader(); TgcScene scene = loader.loadSceneFromFile(GuiController.Instance.ExamplesMediaDir + "MeshCreator\\Scenes\\Deposito\\Deposito-TgcScene.xml"); meshes = scene.Meshes; //Camara en primera personas GuiController.Instance.FpsCamera.Enable = true; GuiController.Instance.FpsCamera.MovementSpeed *= 2; GuiController.Instance.FpsCamera.setCamera(new Vector3(-182.3816f, 82.3252f, -811.9061f), new Vector3(-182.0957f, 82.3147f, -810.9479f)); //Modifier para activar/desactivar efecto GuiController.Instance.Modifiers.addBoolean("activar_efecto", "Activar efecto", true); GuiController.Instance.Modifiers.addFloat("deviation", 1, 5, 1); }
public FullscreenQuad(Effect effect) { this.unEfecto = effect; this.unQuad = new TgcScreenQuad(); var d3dDevice = D3DDevice.Instance.Device; // Creamos un FullScreen Quad CustomVertex.PositionTextured[] vertices = { new CustomVertex.PositionTextured(-1, 1, 1, 0, 0), new CustomVertex.PositionTextured(1, 1, 1, 1, 0), new CustomVertex.PositionTextured(-1, -1, 1, 0, 1), new CustomVertex.PositionTextured(1, -1, 1, 1, 1) }; // Vertex buffer de los triangulos this.unQuad.ScreenQuadVB = new VertexBuffer(typeof(CustomVertex.PositionTextured), 4, d3dDevice, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionTextured.Format, Pool.Default); this.unQuad.ScreenQuadVB.SetData(vertices, 0, LockFlags.None); }
public override void Init() { //Creamos un FullScreen Quad screenQuad = new TgcScreenQuad(); //Creamos un Render Targer sobre el cual se va a dibujar toda la escena original var backBufferWidth = D3DDevice.Instance.Device.PresentationParameters.BackBufferWidth; var backBufferHeight = D3DDevice.Instance.Device.PresentationParameters.BackBufferHeight; sceneRT = new Texture(D3DDevice.Instance.Device, backBufferWidth, backBufferHeight, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); //Definimos el tamaño de una textura que sea de 1/4 x 1/4 de la original, y que sean divisibles por 8 para facilitar los calculos de sampleo var cropWidth = (backBufferWidth - backBufferWidth % 8) / 4; var cropHeight = (backBufferHeight - backBufferHeight % 8) / 4; //Creamos un Render Target para auxiliar para almacenar la pasada horizontal de blur blurTempRT = new Texture(D3DDevice.Instance.Device, cropWidth, cropHeight, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); //Cargar shader con efectos de Post-Procesado effect = TgcShaders.loadEffect(ShadersDir + "GaussianBlur.fx"); //Configurar Technique dentro del shader effect.Technique = "GaussianBlurPass"; //Cargamos un escenario var loader = new TgcSceneLoader(); var scene = loader.loadSceneFromFile(MediaDir + "MeshCreator\\Scenes\\Deposito\\Deposito-TgcScene.xml"); meshes = scene.Meshes; //Camara en primera personas Camara = new TgcFpsCamera(new Vector3(-182.3816f, 82.3252f, -811.9061f)); //Modifier para activar/desactivar efecto Modifiers.addBoolean("activar_efecto", "Activar efecto", true); Modifiers.addFloat("deviation", 1, 5, 1); }
public EscenaJuego(TgcCamera Camera, string MediaDir, string ShadersDir, TgcText2D DrawText, float TimeBetweenUpdates, TgcD3dInput Input, List <Jugador> jugadores, Jugador jugadorActivo, Jugador segundoJugador = null, bool dia = true) : base(Camera, MediaDir, ShadersDir, DrawText, TimeBetweenUpdates, Input) { this.dia = dia; screenQuad = new TgcScreenQuad(); initFisica(); initMeshes(); this.jugadores = jugadores; this.jugadorActivo = jugadorActivo; this.jugadorDos = segundoJugador; initJugadores(); sol = new Luz(Color.White, new TGCVector3(0, 70, -130)); sonido = new TgcMp3Player(); sonido.FileName = MediaDir + "Music\\Acelerando.wav"; sonido.play(true); pelota = new Pelota(escena.getMeshByName("Pelota"), new TGCVector3(0f, 50f, 0)); pelota.Mesh.Effect.SetValue("texPerlin", TextureLoader.FromFile(D3DDevice.Instance.Device, MediaDir + "Textures\\PerlinNoise.png")); dynamicsWorld.AddRigidBody(pelota.Cuerpo); paredes = new Paredes(escena.getMeshByName("Box_5")); dynamicsWorld.AddRigidBody(paredes.Cuerpo); arcos = new Arco[2]; arcos[0] = new Arco(escena.getMeshByName("Arco"), FastMath.PI); arcos[1] = new Arco(escena.getMeshByName("Arco"), 0); dynamicsWorld.AddRigidBody(arcos[0].Cuerpo); dynamicsWorld.AddRigidBody(arcos[1].Cuerpo); camara = new CamaraJugador(jugadorActivo, pelota, Camera, paredes.Mesh.createBoundingBox()); if (PantallaDividida) { camaraDos = new CamaraJugador(segundoJugador, pelota, Camera, paredes.Mesh.createBoundingBox()); } ui = new UIEscenaJuego(); ui.Init(MediaDir, drawer2D); animacionGol = new AnimacionGol(pelota); //Cargar shader con efectos de Post-Procesado effect = TGCShaders.Instance.LoadEffect(ShadersDir + "CustomShaders.fx"); //Configurar Technique dentro del shader effect.Technique = "PostProcess"; effect.SetValue("screenWidth", D3DDevice.Instance.Device.PresentationParameters.BackBufferWidth); effect.SetValue("screenHeight", D3DDevice.Instance.Device.PresentationParameters.BackBufferHeight); g_pCubeMap = new CubeTexture(D3DDevice.Instance.Device, 64, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); //Creamos un Render Targer sobre el cual se va a dibujar la pantalla renderTargetBloom = new Texture(D3DDevice.Instance.Device, D3DDevice.Instance.Device.PresentationParameters.BackBufferWidth / 2, D3DDevice.Instance.Device.PresentationParameters.BackBufferHeight / 2, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); depthStencil = D3DDevice.Instance.Device.CreateDepthStencilSurface(D3DDevice.Instance.Device.PresentationParameters.BackBufferWidth, D3DDevice.Instance.Device.PresentationParameters.BackBufferHeight, DepthFormat.D24S8, MultiSampleType.None, 0, true); }
public override void init() { Device d3dDevice = GuiController.Instance.D3dDevice; //Activamos el renderizado customizado. De esta forma el framework nos delega control total sobre como dibujar en pantalla //La responsabilidad cae toda de nuestro lado GuiController.Instance.CustomRenderEnabled = true; //Creamos un FullScreen Quad screenQuad = new TgcScreenQuad(); //Crear RT con formato de floating point en vez del tipico formato de enteros int backBufferWidth = d3dDevice.PresentationParameters.BackBufferWidth; int backBufferHeight = d3dDevice.PresentationParameters.BackBufferHeight; sceneRT = new Texture(d3dDevice, backBufferWidth, backBufferHeight, 1, Usage.RenderTarget, Format.A16B16G16R16F, Pool.Default); //Crear RT para escalar sceneRT a un tamaño menor, de 1/4 x 1/4 (y divisible por 8 para facilitar los calculos de sampleo) int cropWidth = (backBufferWidth - backBufferWidth % 8) / 4; int cropHeight = (backBufferHeight - backBufferHeight % 8) / 4; scaledSceneRT = new Texture(d3dDevice, cropWidth, cropHeight, 1, Usage.RenderTarget, Format.A16B16G16R16F, Pool.Default); //Crear RT para el bright-pass filter, de igual tamaño que scaledSceneRT (formato comun) brightPassRT = new Texture(d3dDevice, cropWidth, cropHeight, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default); //Crear RT para el efecto bloom (formato comun). Son dos por la doble pasada del filtro gaussiano bloomRT = new Texture(d3dDevice, cropWidth, cropHeight, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default); bloomTempRT = new Texture(d3dDevice, cropWidth, cropHeight, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default); //Crear un RT por cada paso de downsampling necesario para obtener el average luminance (un solo canal de 16 bits) luminanceRTs = new Texture[NUM_LUMINANCE_TEXTURES]; for (int i = 0; i < luminanceRTs.Length; i++) { int iSampleLen = 1 << (2 * i); luminanceRTs[i] = new Texture(d3dDevice, iSampleLen, iSampleLen, 1, Usage.RenderTarget, Format.R16F, Pool.Default); } //Cargar shader con efectos de Post-Procesado effect = TgcShaders.loadEffect(GuiController.Instance.ExamplesMediaDir + "Shaders\\HDR.fx"); //Cargamos un escenario TgcSceneLoader loader = new TgcSceneLoader(); TgcScene scene = loader.loadSceneFromFile(GuiController.Instance.ExamplesMediaDir + "MeshCreator\\Scenes\\Deposito\\Deposito-TgcScene.xml"); meshes = scene.Meshes; //Aplicar a cada mesh el shader de luz custom foreach (TgcMesh mesh in scene.Meshes) { mesh.Effect = effect; mesh.Technique = "LightPass"; } //Mesh para la luz lightMesh = TgcBox.fromSize(new Vector3(10, 10, 10), Color.Red); lightMesh.Effect = effect; lightMesh.Technique = "DrawLightSource"; //Camara en 1ra persona GuiController.Instance.FpsCamera.Enable = true; GuiController.Instance.FpsCamera.MovementSpeed = 400f; GuiController.Instance.FpsCamera.JumpSpeed = 300f; GuiController.Instance.FpsCamera.setCamera(new Vector3(-20, 80, 450), new Vector3(0, 80, 1)); //Modifiers de la luz GuiController.Instance.Modifiers.addBoolean("toneMapping", "toneMapping", true); GuiController.Instance.Modifiers.addFloat("lightIntensity", 0, 100, 5); GuiController.Instance.Modifiers.addFloat("middleGray", 0.1f, 1, 0.72f); GuiController.Instance.Modifiers.addVertex3f("lightPos", new Vector3(-400, -200, -400), new Vector3(400, 300, 500), new Vector3(60, 35, 250)); }
public override void Init() { //Creamos un FullScreen Quad screenQuad = new TgcScreenQuad(); //Crear RT con formato de floating point en vez del tipico formato de enteros var backBufferWidth = D3DDevice.Instance.Device.PresentationParameters.BackBufferWidth; var backBufferHeight = D3DDevice.Instance.Device.PresentationParameters.BackBufferHeight; sceneRT = new Texture(D3DDevice.Instance.Device, backBufferWidth, backBufferHeight, 1, Usage.RenderTarget, Format.A16B16G16R16F, Pool.Default); //Crear RT para escalar sceneRT a un tamaño menor, de 1/4 x 1/4 (y divisible por 8 para facilitar los calculos de sampleo) var cropWidth = (backBufferWidth - backBufferWidth % 8) / 4; var cropHeight = (backBufferHeight - backBufferHeight % 8) / 4; scaledSceneRT = new Texture(D3DDevice.Instance.Device, cropWidth, cropHeight, 1, Usage.RenderTarget, Format.A16B16G16R16F, Pool.Default); //Crear RT para el bright-pass filter, de igual tamaño que scaledSceneRT (formato comun) brightPassRT = new Texture(D3DDevice.Instance.Device, cropWidth, cropHeight, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default); //Crear RT para el efecto bloom (formato comun). Son dos por la doble pasada del filtro gaussiano bloomRT = new Texture(D3DDevice.Instance.Device, cropWidth, cropHeight, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default); bloomTempRT = new Texture(D3DDevice.Instance.Device, cropWidth, cropHeight, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default); //Crear un RT por cada paso de downsampling necesario para obtener el average luminance (un solo canal de 16 bits) luminanceRTs = new Texture[NUM_LUMINANCE_TEXTURES]; for (var i = 0; i < luminanceRTs.Length; i++) { var iSampleLen = 1 << (2 * i); luminanceRTs[i] = new Texture(D3DDevice.Instance.Device, iSampleLen, iSampleLen, 1, Usage.RenderTarget, Format.R16F, Pool.Default); } //Cargar shader con efectos de Post-Procesado effect = TgcShaders.loadEffect(ShadersDir + "HDR.fx"); //Cargamos un escenario var loader = new TgcSceneLoader(); var scene = loader.loadSceneFromFile(MediaDir + "MeshCreator\\Scenes\\Deposito\\Deposito-TgcScene.xml"); meshes = scene.Meshes; //Aplicar a cada mesh el shader de luz custom foreach (var mesh in scene.Meshes) { mesh.Effect = effect; mesh.Technique = "LightPass"; } //Mesh para la luz lightMesh = TgcBox.fromSize(new Vector3(10, 10, 10), Color.Red); lightMesh.Effect = effect; lightMesh.Technique = "DrawLightSource"; //Camara en 1ra persona Camara = new TgcFpsCamera(new Vector3(-20, 80, 450), 400f, 300f); //Modifiers de la luz Modifiers.addBoolean("toneMapping", "toneMapping", true); Modifiers.addFloat("lightIntensity", 0, 100, 5); Modifiers.addFloat("middleGray", 0.1f, 1, 0.72f); Modifiers.addVertex3f("lightPos", new Vector3(-400, -200, -400), new Vector3(400, 300, 500), new Vector3(60, 35, 250)); }