Frustum SetCameraBuffer(Camera a_camera) { lock (a_camera) { if (a_camera.Transform == null) { return(null); } Graphics.CameraContainer camContainer = new Graphics.CameraContainer { Transform = a_camera.Transform.ToMatrix(), Projection = a_camera.Projection }; camContainer.View = camContainer.Transform.Inverted(); Matrix4 viewProjection = camContainer.View * camContainer.Projection; camContainer.ViewProjection = viewProjection; UniformBufferObject ubo = m_graphics.CameraBufferObject; ubo.UpdateData(camContainer); ubo.UpdateBuffer(); return(new Frustum(viewProjection)); } }
void LightingPass(MultiRenderTexture a_renderTexture) { GL.Disable(EnableCap.DepthTest); // GL.Disable(EnableCap.Blend); GL.Enable(EnableCap.Blend); // GL.BlendFunc(BlendingFactor.One, BlendingFactor.One); foreach (Light light in Light.LightList) { if (light.Draw) { UniformBufferObject ubo = m_graphics.LightBufferObject; Material material = light.BindLightDrawing(); ubo.UpdateData(light.GetLightData()); BindCamera(); BindTransform(light.Transform.ToMatrix(), light.Transform.RotationMatrix); BindableContainer cont = BindMaterial(material); GL.ActiveTexture(TextureUnit.Texture0 + cont.Textures); GL.BindTexture(TextureTarget.Texture2D, ((OpenTKTexture)a_renderTexture.RenderTextures[0].InternalObject).Handle); GL.Uniform1(0, cont.Textures++); GL.ActiveTexture(TextureUnit.Texture0 + cont.Textures); GL.BindTexture(TextureTarget.Texture2D, ((OpenTKTexture)a_renderTexture.RenderTextures[1].InternalObject).Handle); GL.Uniform1(1, cont.Textures++); GL.ActiveTexture(TextureUnit.Texture0 + cont.Textures); GL.BindTexture(TextureTarget.Texture2D, ((OpenTKTexture)a_renderTexture.RenderTextures[2].InternalObject).Handle); GL.Uniform1(2, cont.Textures++); GL.ActiveTexture(TextureUnit.Texture0 + cont.Textures); GL.BindTexture(TextureTarget.Texture2D, ((OpenTKTexture)m_renderTarget.DepthBuffer.InternalObject).Handle); GL.Uniform1(3, cont.Textures++); ubo.UpdateBuffer(); GL.BindBufferBase(BufferRangeTarget.UniformBuffer, Material.LightUBOIndex, ((OpenTKUniformBufferObject)ubo.InternalObject).Handle); light.BindShadowMap(cont); GL.DrawArrays(PrimitiveType.TriangleStrip, 0, 4); #if DEBUG_INFO Pipeline.GLError("Graphics: Lighting: "); #endif } } GL.Disable(EnableCap.Blend); GL.Enable(EnableCap.DepthTest); }
internal void Update() { TimeContainer timeContainer = new TimeContainer() { DeltaTime = (float)PipelineTime.DeltaTime, TimePassed = (float)PipelineTime.TimePassed }; m_timeBuffer.UpdateData(timeContainer); m_timeBuffer.UpdateBuffer(); m_internalGraphics.Update(); }
void BindTransform(Matrix4 a_transform, Matrix3 a_rotationMatrix) { UniformBufferObject ubo = m_graphics.TransformBufferObject; Graphics.TransformContainer transContainer = new Graphics.TransformContainer { Transform = a_transform, RotationMatrix = a_rotationMatrix }; ubo.UpdateData(transContainer); ubo.UpdateBuffer(); GL.BindBufferBase(BufferRangeTarget.UniformBuffer, Material.TransformUBOIndex, ((OpenTKUniformBufferObject)ubo.InternalObject).Handle); #if DEBUG_INFO Pipeline.GLError("Graphics: Binding Transform: "); #endif }