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); - } }