//Here i allocate the buffer space and link them and the uniform blocks to their binding points.
void initOpenGLBuffer(){
//...
ShaderProgram::use("deferredShader_lStage");
int block_index = glGetUniformBlockIndex(ShaderProgram::currentProgram->ID, "LightDataBuffer");
glUniformBlockBinding(ShaderProgram::currentProgram->ID, block_index, 1);
block_index = glGetUniformBlockIndex(ShaderProgram::currentProgram->ID, "LightIndexBuffer");
glUniformBlockBinding(ShaderProgram::currentProgram->ID, block_index, 2);
ShaderProgram::unuse();
//Lightbuffers
glBindBuffer(GL_UNIFORM_BUFFER, lightDataBuffer);
glBindBufferBase(GL_UNIFORM_BUFFER, 1, lightDataBuffer);
glNamedBufferData(lightDataBuffer, sizeof(float)*11*App::MAX_LIGHTS_COUNT, nullptr, GL_DYNAMIC_DRAW);
glBindBuffer(GL_UNIFORM_BUFFER, lightIndexBuffer);
glBindBufferBase(GL_UNIFORM_BUFFER, 2, lightIndexBuffer);
glNamedBufferData(lightIndexBuffer, sizeof(unsigned int)*3*App::MAX_LIGHTS_COUNT, nullptr, GL_DYNAMIC_DRAW);
}
// i call this every frame when all my light data is updated to upload the updated data to the buffers. for this i invalidate the old buffer ( which should stay around for later use, according to the concept of orphaning) and then i refill the entire buffer
void uploadLightData(){
glInvalidateBufferData(lightDataBuffer);
glInvalidateBufferData(lightIndexBuffer);
glBindBuffer(GL_UNIFORM_BUFFER, lightDataBuffer);
//one light can at max contain 11 floats in my implementation
glMapBufferRange(GL_UNIFORM_BUFFER, 0, sizeof(float) * 11 * App::MAX_LIGHTS_COUNT, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
glBufferData(GL_UNIFORM_BUFFER, sizeof(float) * 11 * App::MAX_LIGHTS_COUNT, &allLightData[0], GL_DYNAMIC_DRAW);
//unmapping the buffer throws an opengl error string "invalid operation"
//glUnmapBuffer(GL_UNIFORM_BUFFER);
checkOpenGLErrors("OpenGL::uploadLightData()1:");
// the index array should be ignored right now, because i am still hardcoding the indices in the shader
glBindBuffer(GL_UNIFORM_BUFFER, lightIndexBuffer);
glMapBufferRange(GL_UNIFORM_BUFFER, 0, sizeof(unsigned int) * 3 * App::MAX_LIGHTS_COUNT, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
glBufferData(GL_UNIFORM_BUFFER, sizeof(unsigned int) * 3 * App::MAX_LIGHTS_COUNT, &lightIndices[0], GL_DYNAMIC_DRAW);
//unmapping the buffer throws an opengl error string "invalid operation"
//glUnmapBuffer(GL_UNIFORM_BUFFER);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
checkOpenGLErrors("OpenGL::uploadLightData()2:");
}