- glGenTextures( 1, rgb );
- glBindTexture( GL_TEXTURE_2D, *rgb );
- glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, vg_window_x, vg_window_y,
- 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
+ glActiveTexture( GL_TEXTURE0 + texture_id );
+ glBindTexture( GL_TEXTURE_2D, gpipeline.rgb_depthmap );
+ glUniform1i( glGetUniformLocation( shader, "g_world_depth" ), texture_id );
+}
+
+static void render_update_lighting_ub(void)
+{
+ glBindBuffer( GL_UNIFORM_BUFFER, gpipeline.ubo_world_lighting );
+
+ glBufferSubData( GL_UNIFORM_BUFFER, 0, sizeof(struct ub_world_lighting),
+ &gpipeline.ub_world_lighting );
+}
+
+static void render_alloc_ub(void)
+{
+ glGenBuffers( 1, &gpipeline.ubo_world_lighting );
+ glBindBuffer( GL_UNIFORM_BUFFER, gpipeline.ubo_world_lighting );
+ glBufferData( GL_UNIFORM_BUFFER, sizeof(struct ub_world_lighting),
+ NULL, GL_DYNAMIC_DRAW );
+
+ render_update_lighting_ub();
+ glBindBufferBase( GL_UNIFORM_BUFFER, 0, gpipeline.ubo_world_lighting );
+}
+
+/*
+ * Framebuffers
+ */
+struct framebuffer
+{
+ GLuint fb, colour, rb;
+ int div;
+ GLuint format;
+};
+
+static void fb_use( struct framebuffer *fb )
+{
+ if( !fb )
+ {
+ glBindFramebuffer( GL_FRAMEBUFFER, 0 );
+ glViewport( 0, 0, vg_window_x, vg_window_y );
+ }
+ else
+ {
+ glBindFramebuffer( GL_FRAMEBUFFER, fb->fb );
+ glViewport( 0, 0, vg_window_x / fb->div, vg_window_y / fb->div );
+ }
+}
+
+static void fb_init( struct framebuffer *fb )
+{
+ i32 ix = vg_window_x / fb->div,
+ iy = vg_window_y / fb->div;
+
+ glGenFramebuffers( 1, &fb->fb );
+ glBindFramebuffer( GL_FRAMEBUFFER, fb->fb );
+
+ glGenTextures( 1, &fb->colour );
+ glBindTexture( GL_TEXTURE_2D, fb->colour );
+ glTexImage2D( GL_TEXTURE_2D, 0, fb->format, ix, iy,
+ 0, fb->format, GL_UNSIGNED_BYTE, NULL);