diff --git a/plugins/GSdx/GSRendererOGL.cpp b/plugins/GSdx/GSRendererOGL.cpp
index bc18fbade1..9ba98aed4b 100644
--- a/plugins/GSdx/GSRendererOGL.cpp
+++ b/plugins/GSdx/GSRendererOGL.cpp
@@ -718,8 +718,14 @@ void GSRendererOGL::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sour
 		} else if (m_context->CLAMP.WMS == 3 && ((m_context->CLAMP.MINU & 0x8) == 0)) {
 			// Read either Red or Green. Let's go for Red ;)
 			// Pop
-			GL_INS("Red channel");
-			ps_sel.channel = 1;
+			if (m_context->FRAME.FBMSK == 0xF0FFFFFF) {
+				GL_INS("Terminator 3 G4B4 Channel");
+				ps_sel.channel = 6;
+				m_context->FRAME.FBMSK = 0x00FFFFFF;
+			} else {
+				GL_INS("Red channel");
+				ps_sel.channel = 1;
+			}
 		} else {
 			GL_INS("channel not supported");
 			m_channel_shuffle = false;
diff --git a/plugins/GSdx/res/glsl/tfx_fs.glsl b/plugins/GSdx/res/glsl/tfx_fs.glsl
index 22e4fdb71e..de22f9a129 100644
--- a/plugins/GSdx/res/glsl/tfx_fs.glsl
+++ b/plugins/GSdx/res/glsl/tfx_fs.glsl
@@ -345,6 +345,14 @@ vec4 fetch_rgb()
     return c * 255.0f;
 }
 
+vec4 fetch_g4b4()
+{
+    vec4 rt = fetch_raw_color() * 255.0f;
+    uint g4 = (uint(rt.g) >> 4u) & 0x0Fu;
+    uint b4 = (uint(rt.b) << 4u) & 0xF0u;
+    return vec4(float(g4 | b4));
+}
+
 //////////////////////////////////////////////////////////////////////
 
 vec4 sample_color(vec2 st)
@@ -514,6 +522,8 @@ vec4 ps_color()
     vec4 T = fetch_blue();
 #elif PS_CHANNEL_FETCH == 4
     vec4 T = fetch_alpha();
+#elif PS_CHANNEL_FETCH == 6
+    vec4 T = fetch_g4b4();
 #elif PS_CHANNEL_FETCH == 7
     vec4 T = fetch_rgb();
 #elif PS_DEPTH_FMT > 0
diff --git a/plugins/GSdx/res/glsl_source.h b/plugins/GSdx/res/glsl_source.h
index 7225be1046..339a4aae82 100644
--- a/plugins/GSdx/res/glsl_source.h
+++ b/plugins/GSdx/res/glsl_source.h
@@ -1189,6 +1189,14 @@ static const char* const tfx_fs_all_glsl =
 	"    return c * 255.0f;\n"
 	"}\n"
 	"\n"
+	"vec4 fetch_g4b4()\n"
+	"{\n"
+	"    vec4 rt = fetch_raw_color() * 255.0f;\n"
+	"    uint g4 = (uint(rt.g) >> 4u) & 0x0Fu;\n"
+	"    uint b4 = (uint(rt.b) << 4u) & 0xF0u;\n"
+	"    return vec4(float(g4 | b4));\n"
+	"}\n"
+	"\n"
 	"//////////////////////////////////////////////////////////////////////\n"
 	"\n"
 	"vec4 sample_color(vec2 st)\n"
@@ -1358,6 +1366,8 @@ static const char* const tfx_fs_all_glsl =
 	"    vec4 T = fetch_blue();\n"
 	"#elif PS_CHANNEL_FETCH == 4\n"
 	"    vec4 T = fetch_alpha();\n"
+	"#elif PS_CHANNEL_FETCH == 6\n"
+	"    vec4 T = fetch_g4b4();\n"
 	"#elif PS_CHANNEL_FETCH == 7\n"
 	"    vec4 T = fetch_rgb();\n"
 	"#elif PS_DEPTH_FMT > 0\n"