diff --git a/inc/debug.h b/inc/debug.h
index 7861154..04e5509 100644
--- a/inc/debug.h
+++ b/inc/debug.h
@@ -3,6 +3,8 @@
 #include <windows.h>
 #include <stdio.h>
 
+void CounterStart();
+double CounterStop();
 void DebugPrint(const char *format, ...);
 
 //#define _DEBUG 1
diff --git a/inc/opengl.h b/inc/opengl.h
index 4386059..394c1ae 100644
--- a/inc/opengl.h
+++ b/inc/opengl.h
@@ -10,7 +10,6 @@ GLuint OpenGL_BuildProgramFromFile(const char *filePath);
 
 typedef void (APIENTRYP PFNWGLSWAPINTERVALEXT) (int interval);
 
-// Program
 extern PFNGLCREATEPROGRAMPROC glCreateProgram;
 extern PFNGLDELETEPROGRAMPROC glDeleteProgram;
 extern PFNGLUSEPROGRAMPROC glUseProgram;
@@ -43,17 +42,18 @@ extern PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray;
 extern PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation;
 extern PFNGLGETACTIVEUNIFORMPROC glGetActiveUniform;
 
-// Shader
 extern PFNGLCREATESHADERPROC glCreateShader;
 extern PFNGLDELETESHADERPROC glDeleteShader;
 extern PFNGLSHADERSOURCEPROC glShaderSource;
 extern PFNGLCOMPILESHADERPROC glCompileShader;
 extern PFNGLGETSHADERIVPROC glGetShaderiv;
 
-// VBO
 extern PFNGLGENBUFFERSPROC glGenBuffers;
 extern PFNGLBINDBUFFERPROC	glBindBuffer;
 extern PFNGLBUFFERDATAPROC	glBufferData;
+extern PFNGLMAPBUFFERPROC glMapBuffer;
+extern PFNGLUNMAPBUFFERPROC glUnmapBuffer;
+extern PFNGLBUFFERSUBDATAPROC glBufferSubData;
 extern PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;
 extern PFNGLDELETEBUFFERSPROC glDeleteBuffers;
 extern PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
@@ -70,3 +70,5 @@ extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
 extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
 
 extern PFNWGLSWAPINTERVALEXT wglSwapIntervalEXT;
+
+extern PFNGLTEXBUFFERPROC glTexBuffer;
diff --git a/src/debug.c b/src/debug.c
index c9df9bb..9c359a5 100644
--- a/src/debug.c
+++ b/src/debug.c
@@ -2,6 +2,26 @@
 #include <windows.h>
 #include <stdio.h>
 
+
+static LONGLONG CounterStartTime = 0;
+static double CounterFreq = 0.0;
+
+void CounterStart()
+{
+    LARGE_INTEGER li;
+    QueryPerformanceFrequency(&li);
+    CounterFreq = (double)(li.QuadPart) / 1000.0;
+    QueryPerformanceCounter(&li);
+    CounterStartTime = li.QuadPart;
+}
+
+double CounterStop()
+{
+    LARGE_INTEGER li;
+    QueryPerformanceCounter(&li);
+    return (double)(li.QuadPart - CounterStartTime) / CounterFreq;
+}
+
 void DebugPrint(const char *format, ...)
 {
 	va_list args;
diff --git a/src/opengl.c b/src/opengl.c
index c7d5c67..be8cbcc 100644
--- a/src/opengl.c
+++ b/src/opengl.c
@@ -36,17 +36,18 @@ PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray = NULL;
 PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation = NULL;
 PFNGLGETACTIVEUNIFORMPROC glGetActiveUniform = NULL;
 
-// Shader
 PFNGLCREATESHADERPROC glCreateShader = NULL;
 PFNGLDELETESHADERPROC glDeleteShader = NULL;
 PFNGLSHADERSOURCEPROC glShaderSource = NULL;
 PFNGLCOMPILESHADERPROC glCompileShader = NULL;
 PFNGLGETSHADERIVPROC glGetShaderiv = NULL;
 
-// VBO
 PFNGLGENBUFFERSPROC glGenBuffers = NULL;
 PFNGLBINDBUFFERPROC	glBindBuffer = NULL;
 PFNGLBUFFERDATAPROC	glBufferData = NULL;
+PFNGLMAPBUFFERPROC glMapBuffer = NULL;
+PFNGLUNMAPBUFFERPROC glUnmapBuffer = NULL;
+PFNGLBUFFERSUBDATAPROC glBufferSubData = NULL;
 PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer = NULL;
 PFNGLDELETEBUFFERSPROC glDeleteBuffers = NULL;
 PFNGLGENVERTEXARRAYSPROC glGenVertexArrays = NULL;
@@ -64,6 +65,8 @@ PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers = NULL;
 
 PFNWGLSWAPINTERVALEXT wglSwapIntervalEXT = NULL;
 
+PFNGLTEXBUFFERPROC glTexBuffer = NULL;
+
 void OpenGL_Init()
 {
     // Program
@@ -97,17 +100,18 @@ void OpenGL_Init()
     glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glEnableVertexAttribArray");
     glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)wglGetProcAddress("glBindAttribLocation");
 
-    // Shader
     glCreateShader = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader");
     glDeleteShader = (PFNGLDELETESHADERPROC)wglGetProcAddress("glDeleteShader");
     glShaderSource = (PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource");
     glCompileShader = (PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader");
     glGetShaderiv = (PFNGLGETSHADERIVPROC)wglGetProcAddress("glGetShaderiv");
 
-    // VBO
     glGenBuffers = (PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffers");
     glBindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer");
     glBufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferData");
+    glMapBuffer = (PFNGLMAPBUFFERPROC)wglGetProcAddress("glMapBuffer");
+    glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)wglGetProcAddress("glUnmapBuffer");
+    glBufferSubData = (PFNGLBUFFERSUBDATAPROC)wglGetProcAddress("glBufferSubData");
     glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)wglGetProcAddress("glVertexAttribPointer");
     glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)wglGetProcAddress("glDeleteBuffers");
     glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)wglGetProcAddress("glGenVertexArrays");
@@ -124,6 +128,8 @@ void OpenGL_Init()
     glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)wglGetProcAddress("glDeleteFramebuffers");
 
     wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXT)wglGetProcAddress("wglSwapIntervalEXT");
+
+    glTexBuffer = (PFNGLTEXBUFFERPROC)wglGetProcAddress("glTexBuffer");
 }
 
 BOOL OpenGL_ExtExists(char *ext)