#include "uniforms.h" #include namespace Uniforms { SceneUniforms SceneData; LightUniforms LightData; MaterialUniforms MaterialData; GeoUniforms GeoData; //IDs for the buffer objects holding the uniform block data GLuint sceneUbo = 0; GLuint lightUbo = 0; GLuint materialUbo = 0; GLuint geoUbo = 0; namespace UboBinding { //These values come from the binding value specified in the shader block layout int scene = 0; int light = 1; int material = 2; int geometry = 4; }; //Locations for the uniforms which are not in uniform blocks namespace UniformLocs { int M = 0; //model matrix int time = 1; }; void Init() { //Create and initialize uniform buffers glGenBuffers(1, &Uniforms::sceneUbo); glBindBuffer(GL_UNIFORM_BUFFER, sceneUbo); glBufferData(GL_UNIFORM_BUFFER, sizeof(SceneUniforms), nullptr, GL_STREAM_DRAW); //Allocate memory for the buffer, but don't copy (since pointer is null). glBindBufferBase(GL_UNIFORM_BUFFER, UboBinding::scene, sceneUbo); //Associate this uniform buffer with the uniform block in the shader that has the same binding. glGenBuffers(1, &lightUbo); glBindBuffer(GL_UNIFORM_BUFFER, lightUbo); glBufferData(GL_UNIFORM_BUFFER, sizeof(LightUniforms), &LightData, GL_STREAM_DRAW); //Allocate memory for the buffer, but don't copy (since pointer is null). glBindBufferBase(GL_UNIFORM_BUFFER, UboBinding::light, lightUbo); //Associate this uniform buffer with the uniform block in the shader that has the same binding. glGenBuffers(1, &materialUbo); glBindBuffer(GL_UNIFORM_BUFFER, materialUbo); glBufferData(GL_UNIFORM_BUFFER, sizeof(MaterialUniforms), &MaterialData, GL_STREAM_DRAW); //Allocate memory for the buffer, but don't copy (since pointer is null). glBindBufferBase(GL_UNIFORM_BUFFER, UboBinding::material, materialUbo); //Associate this uniform buffer with the uniform block in the shader that has the same binding. glGenBuffers(1, &geoUbo); glBindBuffer(GL_UNIFORM_BUFFER, geoUbo); glBufferData(GL_UNIFORM_BUFFER, sizeof(GeoUniforms), &GeoData, GL_STREAM_DRAW); //Allocate memory for the buffer, but don't copy (since pointer is null). glBindBufferBase(GL_UNIFORM_BUFFER, UboBinding::geometry, geoUbo); //Associate this uniform buffer with the uniform block in the shader that has the same binding. glBindBuffer(GL_UNIFORM_BUFFER, 0); } void BufferSceneData() { glBindBuffer(GL_UNIFORM_BUFFER, sceneUbo); //Bind the OpenGL UBO before we update the data. glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(SceneData), &SceneData); //Upload the new uniform values. glBindBuffer(GL_UNIFORM_BUFFER, 0); //unbind the ubo glBindBuffer(GL_UNIFORM_BUFFER, geoUbo); //Bind the OpenGL UBO before we update the data. glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(GeoData), &GeoData); //Upload the new uniform values. glBindBuffer(GL_UNIFORM_BUFFER, 0); //unbind the ubo } };