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); }
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 }); }