diff --git a/modules/gfx/src/CMakeLists.txt b/modules/gfx/src/CMakeLists.txt
index 57cf1601f715667068611be5abaa0559efaf7165..f1671c0de0edb909ef11bf0c61cbebec2a4c61f2 100644
--- a/modules/gfx/src/CMakeLists.txt
+++ b/modules/gfx/src/CMakeLists.txt
@@ -268,6 +268,7 @@ if (USE_SHADER)
     shader/material_hemi.glsl
     shader/material_toon1.glsl
     shader/material_toon2.glsl
+    shader/anaglyph_fs.glsl
   )
   copy_if_different("${CMAKE_CURRENT_SOURCE_DIR}" "${SHARED_DATA_PATH}/shader" "${SHADER_FILES}" 
                     "SHADER_TARGETS" ost_gfx)  
diff --git a/modules/gfx/src/scene.cc b/modules/gfx/src/scene.cc
index b3fd78bc235f3c90d6a3f41a8ef9463f58a518eb..aaff9c1e9765102becce8297d798dfc47fe57123 100644
--- a/modules/gfx/src/scene.cc
+++ b/modules/gfx/src/scene.cc
@@ -815,7 +815,7 @@ void Scene::RenderGL()
 
   prep_blur();
 
-  if(stereo_mode_==1 || stereo_mode_==2) {
+  if(stereo_mode_==1 || stereo_mode_==2 || stereo_mode_==3) {
     render_stereo();
   } else {
     render_scene();
@@ -1488,6 +1488,8 @@ void Scene::SetStereoMode(unsigned int m)
     }
   } else if(m==2) {
     stereo_mode_=2;
+  } else if(m==3) {
+    stereo_mode_=3;
   } else {
     stereo_mode_=0;
   }
@@ -2380,71 +2382,94 @@ void Scene::render_stereo()
   glPushMatrix();
   glLoadIdentity();
 
-  if(stereo_mode_==2) {
-    // draw interlaced lines in stencil buffer
-    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-    glLineWidth(1.0);
-    glEnable(GL_STENCIL_TEST);
-    glStencilMask(0x1);
-    glClearStencil(0x0);
-    glClear(GL_STENCIL_BUFFER_BIT);
-    glStencilFunc(GL_ALWAYS,0x1,0x1);
-    glStencilOp(GL_REPLACE,GL_REPLACE,GL_REPLACE);
-    glBegin(GL_LINES);
-    glColor3f(1.0,1.0,1.0);
-    for(unsigned int i=0;i<vp_height_;i+=2) {
-      glVertex2i(0,i);
-      glVertex2i(vp_width_-1,i);
-    } 
+  if(stereo_mode_==3) {
+#if OST_SHADER_SUPPORT_ENABLED
+    // anaglyph shader
+    Shader::Instance().PushProgram();
+    Shader::Instance().Activate("anaglyph");
+    GLuint cpr=Shader::Instance().GetCurrentProgram();
+    glActiveTexture(GL_TEXTURE0);
+    glBindTexture(GL_TEXTURE_2D, stereo_inverted_ ? scene_right_tex_ : scene_left_tex_);
+    glUniform1i(glGetUniformLocation(cpr,"left_scene"),0);
+    glActiveTexture(GL_TEXTURE1);
+    glBindTexture(GL_TEXTURE_2D, stereo_inverted_ ? scene_left_tex_ : scene_right_tex_);
+    glUniform1i(glGetUniformLocation(cpr,"right_scene"),1);
+    glActiveTexture(GL_TEXTURE0);
+    // draw screen quad
+    glColor3f(1.0,0.0,1.0);
+    glBegin(GL_QUADS);
+    glTexCoord2f(0.0,0.0); glVertex2i(0,0);
+    glTexCoord2f(0.0,1.0); glVertex2i(0,vp_height_);
+    glTexCoord2f(1.0,1.0); glVertex2i(vp_width_,vp_height_);
+    glTexCoord2f(1.0,0.0); glVertex2i(vp_width_,0);
     glEnd();
-    
-    glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP);
-  }
+    Shader::Instance().PopProgram();
+#endif
+  } else {
+    if(stereo_mode_==2) {
+      // draw interlaced lines in stencil buffer
+      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+      glLineWidth(1.0);
+      glEnable(GL_STENCIL_TEST);
+      glStencilMask(0x1);
+      glClearStencil(0x0);
+      glClear(GL_STENCIL_BUFFER_BIT);
+      glStencilFunc(GL_ALWAYS,0x1,0x1);
+      glStencilOp(GL_REPLACE,GL_REPLACE,GL_REPLACE);
+      glBegin(GL_LINES);
+      glColor3f(1.0,1.0,1.0);
+      for(unsigned int i=0;i<vp_height_;i+=2) {
+        glVertex2i(0,i);
+        glVertex2i(vp_width_-1,i);
+      } 
+      glEnd();
+      glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP);
+    }
 
-  // right eye
-  if(stereo_mode_==1) {
-    glDrawBuffer(GL_BACK_RIGHT);
-    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-  } else if(stereo_mode_==2) {
-    glStencilFunc(GL_EQUAL,0x0,0x1);
-  }
+    // right eye
+    if(stereo_mode_==1) {
+      glDrawBuffer(GL_BACK_RIGHT);
+      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+    } else if(stereo_mode_==2) {
+      glStencilFunc(GL_EQUAL,0x0,0x1);
+    } 
 #if OST_SHADER_SUPPORT_ENABLED
-  if(OST_GL_VERSION_2_0) {
-    glActiveTexture(GL_TEXTURE0);
-  }
+    if(OST_GL_VERSION_2_0) {
+      glActiveTexture(GL_TEXTURE0);
+    }
 #endif
-  glBindTexture(GL_TEXTURE_2D, stereo_inverted_ ? scene_left_tex_ : scene_right_tex_);
-  // draw
-  glColor3f(1.0,0.0,1.0);
-  glBegin(GL_QUADS);
-  glTexCoord2f(0.0,0.0); glVertex2i(0,0);
-  glTexCoord2f(0.0,1.0); glVertex2i(0,vp_height_);
-  glTexCoord2f(1.0,1.0); glVertex2i(vp_width_,vp_height_);
-  glTexCoord2f(1.0,0.0); glVertex2i(vp_width_,0);
-  glEnd();
+    glBindTexture(GL_TEXTURE_2D, stereo_inverted_ ? scene_left_tex_ : scene_right_tex_);
+    // draw
+    glColor3f(1.0,0.0,1.0);
+    glBegin(GL_QUADS);
+    glTexCoord2f(0.0,0.0); glVertex2i(0,0);
+    glTexCoord2f(0.0,1.0); glVertex2i(0,vp_height_);
+    glTexCoord2f(1.0,1.0); glVertex2i(vp_width_,vp_height_);
+    glTexCoord2f(1.0,0.0); glVertex2i(vp_width_,0);
+    glEnd();
 
-  // left eye
-  if(stereo_mode_==1) {
-    glDrawBuffer(GL_BACK_LEFT);
-    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-  } else if(stereo_mode_==2) {
-    glStencilFunc(GL_EQUAL,0x1,0x1);
-  }
+    // left eye
+    if(stereo_mode_==1) {
+      glDrawBuffer(GL_BACK_LEFT);
+      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+    } else if(stereo_mode_==2) {
+      glStencilFunc(GL_EQUAL,0x1,0x1);
+    }
 #if OST_SHADER_SUPPORT_ENABLED
-  if(OST_GL_VERSION_2_0) {
-    glActiveTexture(GL_TEXTURE0);
-  }
+    if(OST_GL_VERSION_2_0) {
+      glActiveTexture(GL_TEXTURE0);
+    }
 #endif
-  glBindTexture(GL_TEXTURE_2D, stereo_inverted_ ? scene_right_tex_ : scene_left_tex_);
-  // draw
-  glColor3f(1.0,0.0,1.0);
-  glBegin(GL_QUADS);
-  glTexCoord2f(0.0,0.0); glVertex2i(0,0);
-  glTexCoord2f(0.0,1.0); glVertex2i(0,vp_height_);
-  glTexCoord2f(1.0,1.0); glVertex2i(vp_width_,vp_height_);
-  glTexCoord2f(1.0,0.0); glVertex2i(vp_width_,0);
-  glEnd();
-  
+    glBindTexture(GL_TEXTURE_2D, stereo_inverted_ ? scene_right_tex_ : scene_left_tex_);
+    // draw
+    glColor3f(1.0,0.0,1.0);
+    glBegin(GL_QUADS);
+    glTexCoord2f(0.0,0.0); glVertex2i(0,0);
+    glTexCoord2f(0.0,1.0); glVertex2i(0,vp_height_);
+    glTexCoord2f(1.0,1.0); glVertex2i(vp_width_,vp_height_);
+    glTexCoord2f(1.0,0.0); glVertex2i(vp_width_,0);
+    glEnd();
+  }
   // restore settings
   glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 0, 0, 0);
   glBindTexture(GL_TEXTURE_2D, 0);
diff --git a/modules/gfx/src/shader.cc b/modules/gfx/src/shader.cc
index 3ed15cac334785fbb45e4d1b63fb91d62c70f599..f514aeebf3e0a401da2bfde639a5ecc6f66fcfaa 100644
--- a/modules/gfx/src/shader.cc
+++ b/modules/gfx/src/shader.cc
@@ -176,7 +176,8 @@ void Shader::Setup()
     {"material_phong.glsl", GL_FRAGMENT_SHADER},
     {"material_hemi.glsl", GL_FRAGMENT_SHADER},
     {"material_toon1.glsl", GL_FRAGMENT_SHADER},
-    {"material_toon2.glsl", GL_FRAGMENT_SHADER}
+    {"material_toon2.glsl", GL_FRAGMENT_SHADER},
+    {"anaglyph_fs.glsl", GL_FRAGMENT_SHADER}
     //////////////////////////////////////////////////////////////////
   };
 
@@ -287,6 +288,9 @@ void Shader::Setup()
   Link("test_tex",
        shader_code_map["fraglight_vs.glsl"],
        shader_code_map["test_tex_fs.glsl"]);
+  Link("anaglyph",
+       shader_code_map["quadpp_vs.glsl"],
+       shader_code_map["anaglyph_fs.glsl"]);
 
   valid_=true;
 }
diff --git a/modules/gfx/src/shader/anaglyph_fs.glsl b/modules/gfx/src/shader/anaglyph_fs.glsl
new file mode 100644
index 0000000000000000000000000000000000000000..85f334882d32139df19110e95ae44a3aba30e797
--- /dev/null
+++ b/modules/gfx/src/shader/anaglyph_fs.glsl
@@ -0,0 +1,12 @@
+uniform sampler2D left_scene;
+uniform sampler2D right_scene;
+
+void main()
+{
+  vec4 left_color=texture2D(left_scene,gl_TexCoord[0].xy);
+  vec4 right_color=texture2D(right_scene,gl_TexCoord[0].xy);
+  gl_FragColor.a = left_color.a+right_color.a;
+  gl_FragColor.r=pow(0.7*left_color.g+0.3*left_color.b,1.5);
+  gl_FragColor.gb=right_color.gb;
+}
+
diff --git a/modules/gfx/src/shader/fraglight_vs.glsl b/modules/gfx/src/shader/fraglight_vs.glsl
index 18472b2c150c6297ddb5d606437d0dfa1fa6e84d..8a7ca2a3bc6e7fbac32e8420f867f5a833a876bc 100644
--- a/modules/gfx/src/shader/fraglight_vs.glsl
+++ b/modules/gfx/src/shader/fraglight_vs.glsl
@@ -1,6 +1,3 @@
-uniform vec4 clip_plane;
-uniform bool clip_flag;
-
 void main()
 {
   // transformed position
@@ -24,8 +21,5 @@ void main()
 
   gl_FrontColor=gl_Color;
   gl_BackColor=gl_Color;
-  if(clip_flag) {
-    gl_ClipDistance[0] = dot(ec_Pos, clip_plane);
-  }
 }