private bool createFrameBuffers(int w, int h) { if (DefaultFrameBuffer != null) { DefaultFrameBuffer.Delete(); } DefaultFrameBuffer = new DefaultFrameBuffer(w, h); DefaultFrameBuffer.Create(); if (!DefaultFrameBuffer.Ready) { Log.WriteLine(Log.LOG_ERROR, "failed to create default frame buffer"); return(false); } if (ShadowFrameBuffer == null) { ShadowFrameBuffer = new ShadowFrameBuffer(2048, 2048); ShadowFrameBuffer.Create(); if (!ShadowFrameBuffer.Ready) { Log.WriteLine(Log.LOG_ERROR, "failed to create shadow frame buffer"); return(false); } } return(true); }
public void Render(RootNode scene, Panel overlay) { // render scene shadow to framebuffer texture (from light source to scene origin) if (scene.ShadowMaterial != null && scene.ShadowMaterial.Ready && ShadowFrameBuffer.Ready) { pass = RenderPass.Shadow; ShadowFrameBuffer.Bind(); scene.ShadowMaterial.Bind(); DirectionalLight light = (DirectionalLight)scene.GetLight(0); view = Matrix4.LookAt(-light.Direction * 10.0f, Vector3.Zero, Vector3.UnitY); shadowProjection = Matrix4.CreateOrthographicOffCenter(-10, 10, -10, 10, -10, 20); renderNode(scene); scene.ShadowMaterial.Unbind(); ShadowFrameBuffer.Unbind(); } // render scene to framebuffer if (DefaultFrameBuffer.Ready) { //GL.Disable(EnableCap.CullFace); pass = RenderPass.Normal; DefaultFrameBuffer.Bind(); if (camera == null) { view = Matrix4.LookAt(new Vector3(0, 0, 10), new Vector3(0, 0, 0), Vector3.UnitY); } else { view = Matrix4.LookAt(camera.Position, camera.LookAt, camera.Up); } renderNode(scene); if (overlay != null) { GL.Disable(EnableCap.DepthTest); overlay.Draw(size); GL.Enable(EnableCap.DepthTest); } DefaultFrameBuffer.Unbind(); } // post processing pass = RenderPass.Post; GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); GL.PushMatrix(); GL.Ortho(0, width, 0, height, -1, 1); // Bottom-left corner pixel is 0/0 postProcessEffect.SetSize(size); postProcessEffect.Render(scene.Time); GL.PopMatrix(); }
//private ComputeShader cs; public RenderThread() { DefaultFB = new DefaultFrameBuffer(EngineStatics.globalSettings.DomainFramebufferRezolution); PostProcessStage = new PostProcessStageRenderer(); }