Ejemplo n.º 1
0
        public void FillDepthCubeMap(PointLightCaster light)
        {
            GL.BindTexture(TextureTarget.ProxyTextureCubeMap, DepthCubeMapId);
            GL.BindFramebuffer(FramebufferTarget.Framebuffer, depthMapBufferId);
            GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthAttachment, TextureTarget.TextureCubeMap, DepthMapId, 0);
            GL.DrawBuffer(DrawBufferMode.None);
            GL.ReadBuffer(ReadBufferMode.None);
            GL.Clear(ClearBufferMask.DepthBufferBit);
            GL.Enable(EnableCap.DepthTest);
            RenderAPI.I.Core.Log.Info($"[Render] Depth buffer cubemap status: {GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer)}");
            //set shader
            var shaderProgram = LoadSpecificShader("depthCubeMap", "depthCubeMap");

            if (!shaderProgram.CanBeUsed)
            {
                throw new Exception($"FillDepthCubeMap: shader can't be used");
            }
            shaderProgram.Use();
            SetShadowTransforms(light, shaderProgram);

            #region fill depthmap

            foreach (var entity in _scene.RenderableEntities)
            {
                var renderComponent = entity.Value;
                GL.BindVertexArray(Engine.I.Device.Buffers[renderComponent.Mesh.Id].VertexArrayObjectId);

                GL.UniformMatrix4(GL.GetUniformLocation(shaderProgram.ProgramId, "model"), 1, false, entity.Key.TransformMatrix.Values);

                if (renderComponent.Material.HasDiffuse)
                {
                    Engine.I.Device.Textures[renderComponent.Material.Diffuse].Bind(0);
                }
                if (renderComponent.Material.HasNormal)
                {
                    Engine.I.Device.Textures[renderComponent.Material.Normal].Bind(1);
                }

                GL.DrawArrays(PrimitiveType.Triangles, 0, renderComponent.Mesh.IndexLength);
            }

            #endregion

            GL.BindTexture(TextureTarget.ProxyTextureCubeMap, 0);
            GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0);
            GL.Disable(EnableCap.DepthTest);
        }
Ejemplo n.º 2
0
        private void SetShadowTransforms(PointLightCaster light, ShaderProgram shaderProgram)
        {
            Func <Vec3, Vec3, Mat4> getView = (direction, up) => Transform.LookAt(light.Position, light.Position + direction, up);

            GL.UniformMatrix4(GL.GetUniformLocation(shaderProgram.ProgramId, "shadowMatrices[0]"), 1, false,
                              (getView(new Vec3(1.0f, 0.0f, 0.0f), new Vec3(0.0f, -1.0f, 0.0f)) * light.Proj).Values);
            GL.UniformMatrix4(GL.GetUniformLocation(shaderProgram.ProgramId, "shadowMatrices[1]"), 1, false,
                              (getView(new Vec3(-1.0f, 0.0f, 0.0f), new Vec3(0.0f, -1.0f, 0.0f)) * light.Proj).Values);
            GL.UniformMatrix4(GL.GetUniformLocation(shaderProgram.ProgramId, "shadowMatrices[2]"), 1, false,
                              (getView(new Vec3(0.0f, 1.0f, 0.0f), new Vec3(0.0f, 0.0f, 1.0f)) * light.Proj).Values);
            GL.UniformMatrix4(GL.GetUniformLocation(shaderProgram.ProgramId, "shadowMatrices[3]"), 1, false,
                              (getView(new Vec3(0.0f, -1.0f, 0.0f), new Vec3(0.0f, 0.0f, -1.0f)) * light.Proj).Values);
            GL.UniformMatrix4(GL.GetUniformLocation(shaderProgram.ProgramId, "shadowMatrices[4]"), 1, false,
                              (getView(new Vec3(0.0f, 0.0f, 1.0f), new Vec3(0.0f, -1.0f, 0.0f)) * light.Proj).Values);
            GL.UniformMatrix4(GL.GetUniformLocation(shaderProgram.ProgramId, "shadowMatrices[5]"), 1, false,
                              (getView(new Vec3(0.0f, 0.0f, -1.0f), new Vec3(0.0f, -1.0f, 0.0f)) * light.Proj).Values);
            GL.Uniform3(GL.GetUniformLocation(shaderProgram.ProgramId, "lightPos"), 1, light.Position.Values);
            GL.Uniform1(GL.GetUniformLocation(shaderProgram.ProgramId, "far_plane"), 1, new[] { light.zFar });
        }