diff --git a/main.c b/main.c
index 9e127b9..4d69e2f 100644
--- a/main.c
+++ b/main.c
@@ -454,6 +454,11 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk
     {
         This->render->height = 400;
     }
+    This->render->bpp = GetPrivateProfileIntA("ddraw", "bpp", 24, ini_path);
+    if(This->render->bpp != 16 && This->render->bpp != 24 && This->render->bpp != 32)
+    {
+        This->render->bpp = 24;
+    }
 
     GetPrivateProfileStringA("ddraw", "filter", tmp, tmp, sizeof(tmp), ini_path);
     if(tolower(tmp[0]) == 'l' || tolower(tmp[3]) == 'l')
diff --git a/main.h b/main.h
index b3d46ae..f9dce65 100644
--- a/main.h
+++ b/main.h
@@ -52,6 +52,7 @@ typedef struct IDirectDrawImpl
         int maxfps;
         int width;
         int height;
+        int bpp;
         int filter;
 
         HANDLE thread;
diff --git a/render_ddraw.c b/render_ddraw.c
index ed81eb7..1ea95f5 100644
--- a/render_ddraw.c
+++ b/render_ddraw.c
@@ -30,6 +30,7 @@ struct render_ddraw_impl
     int maxfps;
     int width;
     int height;
+    int bpp;
     int filter;
 
     HANDLE thread;
@@ -55,6 +56,7 @@ struct render_ddraw_impl render_ddraw =
     0,
     0,
     0,
+    0,
 
     NULL,
     TRUE,
diff --git a/render_opengl.c b/render_opengl.c
index e97d792..19f81c8 100644
--- a/render_opengl.c
+++ b/render_opengl.c
@@ -30,6 +30,7 @@ struct render_opengl_impl
     int maxfps;
     int width;
     int height;
+    int bpp;
     int filter;
 
     HANDLE thread;
@@ -53,6 +54,7 @@ struct render_opengl_impl render_opengl =
     0,
     0,
     0,
+    0,
 
     NULL,
     TRUE,
@@ -83,15 +85,18 @@ DWORD WINAPI render_opengl_main(IDirectDrawSurfaceImpl *surface)
 
     hDC = GetDC(ddraw->hWnd);
 
-    int *glTex = malloc(surface->width * surface->height * sizeof(int));
+    int tex_width = 1024;
+    int tex_height = 1024;
+    float scale_w = (float)surface->width/tex_width;
+    float scale_h = (float)surface->height/tex_height;
+    int *tex = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, tex_width * tex_height * sizeof(int));
 
     memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
     pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
     pfd.nVersion = 1;
     pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
     pfd.iPixelType = PFD_TYPE_RGBA;
-    pfd.cColorBits = 24;
-    pfd.cDepthBits = 16;
+    pfd.cColorBits = render_opengl.bpp;
     pfd.iLayerType = PFD_MAIN_PLANE;
     SetPixelFormat( hDC, ChoosePixelFormat( hDC, &pfd ), &pfd );
 
@@ -114,6 +119,22 @@ DWORD WINAPI render_opengl_main(IDirectDrawSurfaceImpl *surface)
 
     render_opengl.ev = CreateEvent(NULL, TRUE, FALSE, NULL);
 
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex_width, tex_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex);
+    glViewport(0, 0, render_opengl.width, render_opengl.height);
+
+    if(render_opengl.filter)
+    {
+        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+    }
+    else
+    {
+        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
+    }
+
+    glEnable(GL_TEXTURE_2D);
+
     while(render_opengl.run)
     {
         if(render_opengl.maxfps > 0)
@@ -126,32 +147,17 @@ DWORD WINAPI render_opengl_main(IDirectDrawSurfaceImpl *surface)
         {
             for(j=0; j<surface->width; j++)
             {
-                glTex[i*surface->width+j] = surface->palette->data_bgr[((unsigned char *)surface->surface)[i*surface->lPitch + j*surface->lXPitch]];
+                tex[i*surface->width+j] = surface->palette->data_bgr[((unsigned char *)surface->surface)[i*surface->lPitch + j*surface->lXPitch]];
             }
         }
 
-        glViewport(0, 0, render_opengl.width, render_opengl.height);
-
-        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, surface->width, surface->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, glTex);
-
-        if(render_opengl.filter)
-        {
-            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
-            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
-        }
-        else
-        {
-            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
-            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
-        }
-
-        glEnable(GL_TEXTURE_2D);
+        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, surface->width, surface->height, GL_RGBA, GL_UNSIGNED_BYTE, tex);
 
         glBegin(GL_TRIANGLE_FAN);
-        glTexCoord2f(0,0); glVertex2f(-1,  1);
-        glTexCoord2f(1,0); glVertex2f( 1,  1);
-        glTexCoord2f(1,1); glVertex2f( 1, -1);	
-        glTexCoord2f(0,1); glVertex2f(-1, -1);
+        glTexCoord2f(0,0);              glVertex2f(-1,  1);
+        glTexCoord2f(scale_w,0);        glVertex2f( 1,  1);
+        glTexCoord2f(scale_w,scale_h);  glVertex2f( 1, -1);	
+        glTexCoord2f(0,scale_h);        glVertex2f(-1, -1);
         glEnd();
 
         SwapBuffers(hDC);
@@ -171,7 +177,7 @@ DWORD WINAPI render_opengl_main(IDirectDrawSurfaceImpl *surface)
 
     CloseHandle(render_opengl.ev);
 
-    free(glTex);
+    free(tex);
 
     wglMakeCurrent(NULL, NULL);
     wglDeleteContext(hRC);