Index: color.vert
===================================================================
--- color.vert	(revision cffca4d29396387d707220e40d5c35e06aaae72e)
+++ color.vert	(revision e165b853cf7814dc4e0137917e6c3ffb361b6de7)
@@ -2,4 +2,8 @@
 
 uniform mat4 model, view, proj;
+
+layout (std140) uniform shader_data {
+  mat4 model_mat;
+};
 
 layout(location = 0) in vec3 vertex_position;
Index: new-game.cpp
===================================================================
--- new-game.cpp	(revision cffca4d29396387d707220e40d5c35e06aaae72e)
+++ new-game.cpp	(revision e165b853cf7814dc4e0137917e6c3ffb361b6de7)
@@ -395,8 +395,10 @@
    GLsizeiptr points_buffer_size = 0;
    GLsizeiptr textures_buffer_size = 0;
+   GLsizeiptr ubo_buffer_size = 0;
 
    for (obj_it = objects.begin(); obj_it != objects.end(); obj_it++) {
       points_buffer_size += obj_it->points.size() * sizeof(GLfloat);
       textures_buffer_size += obj_it->texcoords.size() * sizeof(GLfloat);
+      ubo_buffer_size += 16 * sizeof(GLfloat);
    }
 
@@ -455,4 +457,20 @@
       offset += obj_it->normals.size() * sizeof(GLfloat);
    }
+
+   /*
+   GLuint ubo = 0;
+   glGenBuffers(1, &ubo);
+
+   //glBindBuffer(GL_UNIFORM_BUFFER, ubo);
+   //glBufferData(GL_UNIFORM_BUFFER, ubo_buffer_size/2, NULL, GL_DYNAMIC_DRAW);
+
+   offset = 0;
+   for (obj_it = objects.begin(); obj_it != objects.end(); obj_it++) {
+      //glBufferSubData(GL_UNIFORM_BUFFER, offset, sizeof(obj_it->model_mat), value_ptr(obj_it->model_mat));
+      //glBufferSubData(GL_UNIFORM_BUFFER, offset, sizeof(obj_it->model_mat), value_ptr(objects[0].model_mat));
+      offset += 16 * sizeof(GLfloat);
+   }
+   //glBindBuffer(GL_UNIFORM_BUFFER, 0);
+   */
 
    GLuint vao = 0;
@@ -523,4 +541,6 @@
    GLuint view_test_loc = glGetUniformLocation(color_sp, "view");
    GLuint proj_test_loc = glGetUniformLocation(color_sp, "proj");
+   GLuint ub_index = glGetUniformBlockIndex(color_sp, "shader_data");
+   cout << "UBO index: " << ub_index << endl;
 
    GLuint model_mat_loc = glGetUniformLocation(texture_sp, "model");
@@ -529,10 +549,10 @@
 
    glUseProgram(color_sp);
-   glUniformMatrix4fv(model_test_loc, 1, GL_FALSE, value_ptr(objects[0].model_mat));
    glUniformMatrix4fv(view_test_loc, 1, GL_FALSE, value_ptr(view_mat));
    glUniformMatrix4fv(proj_test_loc, 1, GL_FALSE, value_ptr(proj_mat));
 
+   //glUniformBlockBinding(color_sp, ub_index, 0);
+
    glUseProgram(texture_sp);
-   glUniformMatrix4fv(model_mat_loc, 1, GL_FALSE, value_ptr(objects[1].model_mat));
    glUniformMatrix4fv(view_mat_loc, 1, GL_FALSE, value_ptr(view_mat));
    glUniformMatrix4fv(proj_mat_loc, 1, GL_FALSE, value_ptr(proj_mat));
