Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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();
        }