70 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
#include "uniforms.h"
 | 
						|
#include <GL/glew.h>
 | 
						|
 | 
						|
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
 | 
						|
    }
 | 
						|
};
 |