public void RenderAll(Camera renderCamera, UniformBlock ubo, IList <ILight> allLights, IEnumerable <IPostProcessEffect> postProcessEffect) { gl.SetDefaults(); var camera = prepardWithCameraData; if (PauseRenderPrepare) { camera = renderCamera.GetDataCopy(); } camera.UploadCameraDataToUBO(ubo); // bind camera view params and matrices only once RenderGBuffer(ubo, camera); RenderLights(ubo, camera, allLights); // FORWARD RENDERING, TRANSPARENT OBJECTS { gl.DepthWrite(false); gl.DepthTest(true); gl.Blend(true); GL.BlendEquation(BlendEquationMode.FuncAdd); MyGL.Check(); GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha); MyGL.Check(); gl.DrawLinesOnly(DrawLines, false); for (int i = 0; i < toRenderTransparentCount; i++) { var renderable = toRenderTransparent[i]; renderable.Material.BeforeBindCallback(); renderable.Material.Uniforms.SendAllUniformsTo(renderable.Material.RenderShader.Uniforms); gBuffer.BindForTransparentPass(renderable.Material.RenderShader); renderable.Material.RenderShader.Bind(); renderable.UploadUBOandDraw(camera, ubo); } } RenderPostProcessEffects(ubo, postProcessEffect); // FINAL DRAW TO SCREEN { gl.DepthWrite(false); gl.DepthTest(false); gl.Blend(false); gl.DrawLinesOnly(false); GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, 0); MyGL.Check(); GL.Viewport(0, 0, camera.PixelWidth, camera.PixelHeight); MyGL.Check(); FinalDrawShader.Uniforms.Set("finalDrawTexture", gBuffer.FinalTextureToRead); if (FinalDrawShader.Bind()) { Factory.QuadMesh.Draw(); } } if (DebugBounds) { RenderDebugBounds(ubo, camera); } if (Debug.GetCVar("rendering / debug / draw normal buffer contents")) { gBuffer.DebugDrawNormal(); } if (Debug.GetCVar("rendering / debug / draw gbuffer contents")) { gBuffer.DebugDrawContents(); } //if (drawShadowMapContents) DebugDrawTexture(shadowMap.depthMap, new Vector4(0.5f, 0.5f, 1, 1), new Vector4(0.5f,0.5f,0,1), 1, 0); ErrorCode glError; while ((glError = GL.GetError()) != ErrorCode.NoError) { Log.Error("GL Error: " + glError); } }
protected override void OnRenderFrame(FrameEventArgs e) { this.Title = statistics.ToString(); statistics.Clear(); statistics.fps = (1 / e.Time); //GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); if (this.Focused) { Input.Update(); } if (Input.GetKeyDown(OpenTK.Input.Key.Escape)) { Exit(); } if (Input.GetKeyDown(OpenTK.Input.Key.F11)) { if (WindowState != WindowState.Fullscreen) { WindowState = WindowState.Fullscreen; } else { WindowState = WindowState.Normal; } } if (Input.GetKeyDown(OpenTK.Input.Key.F10)) { drawLines = !drawLines; } if (Input.GetKeyDown(OpenTK.Input.Key.F9)) { drawGBufferContents = !drawGBufferContents; } if (Input.GetKeyDown(OpenTK.Input.Key.F8)) { drawShadowMapContents = !drawShadowMapContents; } if (Input.GetKeyDown(OpenTK.Input.Key.F7)) { debugBounds = !debugBounds; } if (Input.GetKeyDown(OpenTK.Input.Key.F6)) { shadowsEnabled = !shadowsEnabled; } if (Input.GetKeyDown(OpenTK.Input.Key.F5)) { Factory.ReloadAllShaders(); } PhysicsUsage.PhysicsManager.instance.Update((float)e.Time); foreach (var go in Factory.allGameObjects.ToArray()) { foreach (var c in go.GetComponents <MonoBehaviour>()) { c.Update_Internal(e.Time); } } //particleSimulation.Update(e.Time); // ITS BROKEN :c var frustrumPlanes = GeometryUtility.CalculateFrustumPlanes(camera); var allRenderers = new List <Renderer>(); foreach (var go in Factory.allGameObjects) { allRenderers.AddRange(go.GetComponents <Renderer>()); } camera.UploadDataToUBO(ubo); // bind camera view params //GL.BeginQuery(QueryTarget.) // G BUFFER GRAB PASS { gBuffer.BindAllFrameBuffersForDrawing(); GL.Enable(EnableCap.DepthTest); GL.DepthMask(true); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit | ClearBufferMask.StencilBufferBit); // SKYBOX PASS { GL.DepthRange(0.999, 1); GL.DepthMask(false); var shader = Factory.GetShader("internal/deferred.skybox.shader"); shader.SetUniform("skyboxCubeMap", skyboxCubeMap); shader.Bind(); skyboxMesh.Draw(); GL.DepthRange(0, 1); } if (drawLines) { GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Line); } else { GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Fill); } // RENDER ALL OBJECTS { GL.DepthMask(true); GL.Enable(EnableCap.CullFace); GL.Disable(EnableCap.Blend); GL.CullFace(CullFaceMode.Back); foreach (var renderer in allRenderers) { if (renderer.shouldRenderGeometry && (!renderer.canBeFrustumCulled || GeometryUtility.TestPlanesAABB(frustrumPlanes, renderer.bounds))) { renderer.material.BindUniforms(); renderer.material.gBufferShader.Bind(); renderer.UploadUBOandDraw(camera, ubo); statistics.countMeshesRendered++; } } } GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Fill); } int lightIndex = 0; foreach (var light in Light.allLights) { var oldLightHasShadows = light.hasShadows; //if (!shadowsEnabled) light.hasShadows = false; var shadowMap = light.shadowMap; // SHADOW MAAPING if (light.hasShadows) { //GL.Enable(EnableCap.CullFace); //GL.CullFace(CullFaceMode.Back); shadowMap.FrameBufferForWriting(); GL.Enable(EnableCap.DepthTest); GL.DepthMask(true); shadowMap.Clear(); shadowMap.shadowViewCamera.UploadDataToUBO(ubo); foreach (var renderer in allRenderers) { if (renderer.castsShadows) { renderer.material.BindUniforms(); renderer.material.depthGrabShader.Bind(); renderer.UploadUBOandDraw(shadowMap.shadowViewCamera, ubo); } } } camera.UploadDataToUBO(ubo); // bind camera view params // G BUFFER LIGHT PASS { GL.Disable(EnableCap.CullFace); //GL.CullFace(CullFaceMode.Back); GL.Disable(EnableCap.DepthTest); GL.DepthMask(false); light.UploadUBOdata(ubo, lightIndex); var shader = Factory.GetShader("internal/deferred.oneLight.shader"); gBuffer.BindGBufferTexturesTo(shader); if (light.hasShadows) { shadowMap.BindUniforms(shader); } shader.Bind(); GL.Enable(EnableCap.Blend); //GL.BlendEquationSeparate(BlendEquationMode.FuncAdd, BlendEquationMode.FuncAdd); //GL.BlendFunc(BlendingFactorSrc.SrcColor, BlendingFactorDest.SrcColor); GL.BlendEquation(BlendEquationMode.FuncAdd); GL.BlendFunc(BlendingFactorSrc.One, BlendingFactorDest.One); quadMesh.Draw(); GL.Disable(EnableCap.Blend); } lightIndex++; } // POST PROCESS EFFECTs /*{ * GL.Disable(EnableCap.DepthTest); * GL.Disable(EnableCap.CullFace); * GL.Disable(EnableCap.Blend); * * GL.Disable(EnableCap.DepthTest); * GL.DepthMask(false); * * foreach (var shader in camera.postProcessEffects) * { * gBuffer.BindForLightingPass(shader); * shader.Bind(); * quad.Draw(); * gBuffer.SwapFinalTextureTarget(); * } * }*/ // FINAL DRAW TO SCREEN { DebugDrawTexture(gBuffer.finalTextureToWriteTo); } /*if(debugBounds) * { * var allColiders = new List<BoxCollider>(); * foreach (var go in Factory.allGameObjects) * { * allColiders.AddRange(go.GetComponents<BoxCollider>()); * } * GL.DepthMask(false); * GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Line); * GL.Disable(EnableCap.DepthTest); * GL.Disable(EnableCap.CullFace); * GL.Disable(EnableCap.Blend); * foreach (var c in allColiders) * { * var modelMat = c.gameObject.transform.GetScalePosRotMatrix(); * var modelViewMat = modelMat * camera.GetViewMat(); * ubo.model.modelMatrix = modelMat; * ubo.model.modelViewMatrix = modelViewMat; * ubo.model.modelViewProjectionMatrix = modelViewMat * camera.GetProjectionMat(); * ubo.modelUBO.UploadData(); * skyboxMesh.Draw(); * } * }*/ if (drawGBufferContents) { gBuffer.DebugDrawContents(); } //if (drawShadowMapContents) DebugDrawTexture(shadowMap.depthMap, new Vector4(0.5f, 0.5f, 1, 1), new Vector4(0.5f,0.5f,0,1), 1, 0); /* * { * var shader = Factory.GetShader("internal/forward.allLights.shader"); * gBuffer.BindForWriting(); * * // transparent pass, must enable blending * GL.Enable(EnableCap.DepthTest); * GL.DepthMask(false); * GL.Disable(EnableCap.CullFace); * GL.Enable(EnableCap.Blend); * GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha); * * * shader.Bind(); * //shader.SetParam(Shader.screenSizeLocationName, new Vector2(Width, Height)); * camera.BindUniforms(shader); * //Light.BindAll(shader); * * foreach (var go in Factory.allGameObjects) * { * foreach (var renderer in go.GetComponents<Renderer>()) * { * renderer.Draw(shader, camera); * } * } * }*/ SwapBuffers(); }