Index: game/LightGem.cpp
===================================================================
--- game/LightGem.cpp	(revision 6634)
+++ game/LightGem.cpp	(working copy)
@@ -429,16 +429,16 @@
 
 			// The order is RGB. NOTE: Serp - I have moved the scale into the rgb multiplier
 			// this is to move the calculation into the precompiler (could move to .h directly)
-			m_fColVal[in] += (buffer[0] * (DARKMOD_LG_RED  * DARKMOD_LG_SCALE) +
-							  buffer[1] * (DARKMOD_LG_GREEN* DARKMOD_LG_SCALE) +
-							  buffer[2] * (DARKMOD_LG_BLUE * DARKMOD_LG_SCALE));
+			m_fColVal[in] += (buffer[0] * (DARKMOD_LG_RED  ) +
+							  buffer[1] * (DARKMOD_LG_GREEN) +
+							  buffer[2] * (DARKMOD_LG_BLUE ));
 		}
 	}
 
 	// Calculate the average for each value
 	// Could be moved to the return
-	m_fColVal[0] *= DARKMOD_LG_TRIRATIO;
-	m_fColVal[1] *= DARKMOD_LG_TRIRATIO;
-	m_fColVal[2] *= DARKMOD_LG_TRIRATIO;
-	m_fColVal[3] *= DARKMOD_LG_TRIRATIO;
+	m_fColVal[0] *= DARKMOD_LG_TRIRATIO * DARKMOD_LG_SCALE;
+	m_fColVal[1] *= DARKMOD_LG_TRIRATIO * DARKMOD_LG_SCALE;
+	m_fColVal[2] *= DARKMOD_LG_TRIRATIO * DARKMOD_LG_SCALE;
+	m_fColVal[3] *= DARKMOD_LG_TRIRATIO * DARKMOD_LG_SCALE;
 }
Index: renderer/RenderSystem.cpp
===================================================================
--- renderer/RenderSystem.cpp	(revision 6634)
+++ renderer/RenderSystem.cpp	(working copy)
@@ -293,6 +293,7 @@
 =============
 */
 idRenderSystemLocal::~idRenderSystemLocal( void ) {
+	qglDeleteBuffersARB(1, &pbo);
 }
 
 /*
@@ -1011,7 +1012,27 @@
 
 	qglReadBuffer( GL_BACK );
 
-	qglReadPixels(rc->x, rc->y, rc->width, rc->height, GL_RGB, GL_UNSIGNED_BYTE, buffer);
+	if (1) {
+		static int nbytes = 64 * 64 * 3;
+		if (!pbo) {
+			qglGenBuffersARB(1, &pbo);
+			qglBindBufferARB(GL_PIXEL_PACK_BUFFER, pbo);
+			qglBufferDataARB(GL_PIXEL_PACK_BUFFER, nbytes, NULL, GL_STREAM_READ);
+			qglBindBufferARB(GL_PIXEL_PACK_BUFFER, 0);
+		}
+		qglBindBufferARB(GL_PIXEL_PACK_BUFFER, pbo);
+		unsigned char* ptr = (unsigned char*)qglMapBufferARB(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
+		if (ptr) {
+			memcpy(buffer, ptr, nbytes);
+			qglUnmapBufferARB(GL_PIXEL_PACK_BUFFER);
+		}
+		else {
+			// handle error
+		}
+		qglReadPixels(rc->x, rc->y, rc->width, rc->height, GL_RGB, GL_UNSIGNED_BYTE, 0);
+		qglBindBufferARB(GL_PIXEL_PACK_BUFFER, 0);
+	} else
+		qglReadPixels(rc->x, rc->y, rc->width, rc->height, GL_RGB, GL_UNSIGNED_BYTE, buffer);
 }
 
 /*
Index: renderer/tr_local.h
===================================================================
--- renderer/tr_local.h	(revision 6634)
+++ renderer/tr_local.h	(working copy)
@@ -696,6 +696,9 @@
 ** by the frontend.
 */
 class idRenderSystemLocal : public idRenderSystem {
+private:
+	GLuint pbo;
+
 public:
 	// external functions
 	virtual void			Init( void );