From b9cecd05dd7eef0e2bcd66d80245639718c29306 Mon Sep 17 00:00:00 2001
From: ansgar <ansgar@5a81b35b-ba03-0410-adc8-b2c5c5119f08>
Date: Sun, 2 May 2010 01:52:15 +0000
Subject: [PATCH] added scene fx normal map dump

git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/branches/new_gfx@2149 5a81b35b-ba03-0410-adc8-b2c5c5119f08
---
 modules/gfx/src/CMakeLists.txt             |  2 ++
 modules/gfx/src/impl/cpk_renderer.cc       |  3 ++
 modules/gfx/src/impl/scene_fx.cc           | 40 +++++++++++++++-------
 modules/gfx/src/shader.cc                  |  9 +++++
 modules/gfx/src/shader/amboccl_fs.glsl     |  2 +-
 modules/gfx/src/shader/basic_fs.glsl       |  2 +-
 modules/gfx/src/shader/dumpnorm_fs.glsl    |  5 +++
 modules/gfx/src/shader/dumpnorm_vs.glsl    |  7 ++++
 modules/gfx/src/shader/fast_sphere_fs.glsl |  9 ++++-
 modules/gfx/src/shader/fraglight_fs.glsl   |  2 +-
 10 files changed, 65 insertions(+), 16 deletions(-)
 create mode 100644 modules/gfx/src/shader/dumpnorm_fs.glsl
 create mode 100644 modules/gfx/src/shader/dumpnorm_vs.glsl

diff --git a/modules/gfx/src/CMakeLists.txt b/modules/gfx/src/CMakeLists.txt
index b5667bc33..3dd5c381c 100644
--- a/modules/gfx/src/CMakeLists.txt
+++ b/modules/gfx/src/CMakeLists.txt
@@ -246,6 +246,8 @@ if (USE_SHADER)
     shader/convolute1_fs.glsl
     shader/scenefx_vs.glsl
     shader/scenefx_fs.glsl
+    shader/dumpnorm_vs.glsl
+    shader/dumpnorm_fs.glsl
   )
   copy_if_different("./" "${SHARED_DATA_PATH}/shader" "${SHADER_FILES}" 
                     "SHADER_TARGETS" ost_gfx)  
diff --git a/modules/gfx/src/impl/cpk_renderer.cc b/modules/gfx/src/impl/cpk_renderer.cc
index 0dabd7360..2d94c8a57 100644
--- a/modules/gfx/src/impl/cpk_renderer.cc
+++ b/modules/gfx/src/impl/cpk_renderer.cc
@@ -220,9 +220,12 @@ void CPKRenderer::RenderCPK2()
       aelist = CPKOcclusion();
     }
 
+
+    uint write_normals = Shader::Instance().GetCurrentName()=="dumpnorm" ? 1 : 0;
     Shader::Instance().PushProgram();
     Shader::Instance().Activate("fast_sphere");
     Shader::Instance().UpdateState();
+    glUniform1i(glGetUniformLocation(Shader::Instance().GetCurrentProgram(),"write_normals"),write_normals);
 
     glPushAttrib(GL_ENABLE_BIT);
     glDisable(GL_LIGHTING);
diff --git a/modules/gfx/src/impl/scene_fx.cc b/modules/gfx/src/impl/scene_fx.cc
index 413ef43f9..08b0ed4c4 100644
--- a/modules/gfx/src/impl/scene_fx.cc
+++ b/modules/gfx/src/impl/scene_fx.cc
@@ -37,6 +37,8 @@ SceneFX::~SceneFX()
 
 void SceneFX::Setup()
 {
+  LOGN_VERBOSE("SceneFX: setup");
+
   glGenTextures(1,&scene_tex_id_);
   glGenTextures(1,&depth_tex_id_);
   glGenTextures(1,&shadow_tex_id_);
@@ -91,6 +93,7 @@ void SceneFX::Setup()
 
 void SceneFX::Resize(unsigned int w, unsigned int h)
 {
+#if 0
   glBindTexture(GL_TEXTURE_2D, scene_tex2_id_);
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
   glBindTexture(GL_TEXTURE_2D, norm_tex2_id_);
@@ -109,13 +112,14 @@ void SceneFX::Resize(unsigned int w, unsigned int h)
 
   if(status!=GL_FRAMEBUFFER_COMPLETE) {
     use_fb_=false;
-    LOGN_VERBOSE("framebuffer error code " << status);
+    LOGN_VERBOSE("SceneFX: framebuffer error code " << status);
   } else {
     use_fb_=true;
   }
 
   glBindRenderbuffer(GL_RENDERBUFFER, 0);
   glBindFramebuffer(GL_FRAMEBUFFER, 0);
+#endif
 }
 
 void SceneFX::Preprocess() 
@@ -128,23 +132,36 @@ void SceneFX::Preprocess()
 void SceneFX::Postprocess()
 {
   Viewport vp=Scene::Instance().GetViewport();
-  // grab color buffer
-  glBindTexture(GL_TEXTURE_2D, scene_tex_id_);
-  glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, vp.x, vp.y, vp.width, vp.height, 0);
-  // and depth buffer
-  glBindTexture(GL_TEXTURE_2D, depth_tex_id_);
-  glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, vp.x, vp.y, vp.width, vp.height, 0);
 
   if(use_fb_) {
     glBindFramebuffer(GL_FRAMEBUFFER, 0);
+  } else {
+    // grab color buffer
+    glBindTexture(GL_TEXTURE_2D, scene_tex_id_);
+    glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, vp.x, vp.y, vp.width, vp.height, 0);
+    // and depth buffer
+    glBindTexture(GL_TEXTURE_2D, depth_tex_id_);
+    glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, vp.x, vp.y, vp.width, vp.height, 0);
+
+    if(amb_occl_flag) {
+      // now for the normal buffer hack if the framebuffer stuff failed
+      Shader::Instance().PushProgram();
+      Shader::Instance().Activate("dumpnorm");
+      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+      Scene::Instance().GetRootNode()->RenderGL(STANDARD_RENDER_PASS);
+      Shader::Instance().PopProgram();
+      glBindTexture(GL_TEXTURE_2D, norm_tex_id_);
+      glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, vp.x, vp.y, vp.width, vp.height, 0);
+    }
   }
 
   if(shadow_flag) {
     prep_shadow_map();
   }
   if(amb_occl_flag) {
-    //prep_amb_occlusion();
-    //draw_debug_tex(vp.width,vp.height,norm_tex_id_);
+    prep_amb_occlusion();
+    draw_debug_tex(vp.width,vp.height,occl_tex_id_);
+    return;
   }
   if(depth_dark_flag) {
     //prep_depth_darkening();
@@ -272,7 +289,6 @@ void SceneFX::prep_amb_occlusion()
 {
   Viewport vp=Scene::Instance().GetViewport();
 
-  // kernel is static for now, inside the convolution shader
   Shader::Instance().PushProgram();
   Shader::Instance().Activate("amboccl");
   GLuint cpr=Shader::Instance().GetCurrentProgram();
@@ -287,9 +303,9 @@ void SceneFX::prep_amb_occlusion()
   // set up viewport filling quad to run the fragment shader
   draw_screen_quad(vp.width,vp.height);
 
-  glActiveTexture(GL_TEXTURE3);
+  glActiveTexture(GL_TEXTURE0);
   glBindTexture(GL_TEXTURE_2D, occl_tex_id_);
-  glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_INTENSITY, 0,0, vp.width, vp.height, 0);
+  glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0,0, vp.width, vp.height, 0);
 
   Shader::Instance().PopProgram();
 }
diff --git a/modules/gfx/src/shader.cc b/modules/gfx/src/shader.cc
index 3fed86bf6..f6d83bb3f 100644
--- a/modules/gfx/src/shader.cc
+++ b/modules/gfx/src/shader.cc
@@ -148,6 +148,8 @@ void Shader::Setup()
     {"fast_sphere_vs.glsl", GL_VERTEX_SHADER},
     {"fast_sphere_fs.glsl", GL_FRAGMENT_SHADER},
     {"outline_vs.glsl", GL_VERTEX_SHADER},
+    {"dumpnorm_vs.glsl", GL_VERTEX_SHADER},
+    {"dumpnorm_fs.glsl", GL_FRAGMENT_SHADER},
     {"quadpp_vs.glsl", GL_VERTEX_SHADER},
     {"convolute1_fs.glsl", GL_FRAGMENT_SHADER},
     {"amboccl_fs.glsl", GL_FRAGMENT_SHADER},
@@ -253,6 +255,13 @@ void Shader::Setup()
   if(link_shader(shader_program_list,"outline",shader_program_id)) {
     shader_program_map_["outline"]=shader_program_id;
   }
+  // dumpnorm shader
+  shader_program_list.clear();
+  shader_program_list.push_back(shader_code_map_["dumpnorm_vs.glsl"]);
+  shader_program_list.push_back(shader_code_map_["dumpnorm_fs.glsl"]);
+  if(link_shader(shader_program_list,"dumpnorm",shader_program_id)) {
+    shader_program_map_["dumpnorm"]=shader_program_id;
+  }
   // convolute1 shader
   shader_program_list.clear();
   shader_program_list.push_back(shader_code_map_["quadpp_vs.glsl"]);
diff --git a/modules/gfx/src/shader/amboccl_fs.glsl b/modules/gfx/src/shader/amboccl_fs.glsl
index 76501a6cb..1a6a365de 100644
--- a/modules/gfx/src/shader/amboccl_fs.glsl
+++ b/modules/gfx/src/shader/amboccl_fs.glsl
@@ -4,6 +4,6 @@ uniform sampler2D norm;
 void main()
 {
   float val = texture2D(depth,gl_TexCoord[0].xy).r;
-  gl_FragColor.rgb=1.0;
+  gl_FragColor.rgb=vec3(val,val,val);
   gl_FragColor.a=1.0;
 }
diff --git a/modules/gfx/src/shader/basic_fs.glsl b/modules/gfx/src/shader/basic_fs.glsl
index 68059f4d1..e38a3ada5 100644
--- a/modules/gfx/src/shader/basic_fs.glsl
+++ b/modules/gfx/src/shader/basic_fs.glsl
@@ -5,6 +5,6 @@ void main()
   float fog = fog_flag ? clamp((gl_Fog.end-gl_FogFragCoord) * gl_Fog.scale, 0.0, 1.0) : 1.0;
   gl_FragColor.rgb = mix(gl_Fog.color.rgb, gl_Color.rgb, fog);
   gl_FragColor.a = gl_Color.a;
-  gl_FragBuffer[1].rgb=gl_TexCoord[0].stp*0.5+0.5;
+  // gl_FragBuffer[1].rgb=gl_TexCoord[0].stp*0.5+0.5;
 }
 
diff --git a/modules/gfx/src/shader/dumpnorm_fs.glsl b/modules/gfx/src/shader/dumpnorm_fs.glsl
new file mode 100644
index 000000000..09bee9928
--- /dev/null
+++ b/modules/gfx/src/shader/dumpnorm_fs.glsl
@@ -0,0 +1,5 @@
+void main()
+{
+  gl_FragColor.rgb=normalize(gl_TexCoord[0]).stp*0.5+0.5;
+}
+
diff --git a/modules/gfx/src/shader/dumpnorm_vs.glsl b/modules/gfx/src/shader/dumpnorm_vs.glsl
new file mode 100644
index 000000000..f11d00259
--- /dev/null
+++ b/modules/gfx/src/shader/dumpnorm_vs.glsl
@@ -0,0 +1,7 @@
+void main()
+{
+  gl_Position = ftransform();
+  vec3 normal = gl_NormalMatrix * gl_Normal;
+  gl_TexCoord[0].stp=normal;
+}
+
diff --git a/modules/gfx/src/shader/fast_sphere_fs.glsl b/modules/gfx/src/shader/fast_sphere_fs.glsl
index f6c47e9be..0a18ab1ad 100644
--- a/modules/gfx/src/shader/fast_sphere_fs.glsl
+++ b/modules/gfx/src/shader/fast_sphere_fs.glsl
@@ -1,6 +1,7 @@
 uniform bool lighting_flag;
 uniform bool two_sided_flag;
 uniform bool fog_flag;
+uniform bool write_normals;
 
 // copy from basic_fl_vs !
 bool DirectionalLight(in vec3 normal,
@@ -32,6 +33,13 @@ void main()
   float z1 = gl_TexCoord[0].z*zz;
   float z2 = gl_TexCoord[0].w*zz;
 
+  gl_FragDepth = gl_FragCoord.z+z2;
+
+  if(write_normals) {
+    gl_FragColor.rgb=normal*0.5+0.5;
+    return;
+  }
+
   vec4 amb = vec4(0.0);
   vec4 diff = vec4(0.0);
   vec4 spec = vec4(0.0);
@@ -50,5 +58,4 @@ void main()
   gl_FragColor.rgb = color.rgb;
   gl_FragColor.a = 1.0;
 
-  gl_FragDepth = gl_FragCoord.z+z2;
 }
diff --git a/modules/gfx/src/shader/fraglight_fs.glsl b/modules/gfx/src/shader/fraglight_fs.glsl
index a19d6b9a5..f390283fc 100644
--- a/modules/gfx/src/shader/fraglight_fs.glsl
+++ b/modules/gfx/src/shader/fraglight_fs.glsl
@@ -81,5 +81,5 @@ void main()
   float fog = fog_flag ? clamp((gl_Fog.end-gl_FogFragCoord) * gl_Fog.scale, 0.0, 1.0) : 1.0;
   gl_FragColor.rgb = mix(gl_Fog.color.rgb, gl_FragColor.rgb, fog);
   gl_FragColor.a = gl_Color.a;
-  gl_FragBuffer[1].rgb=gl_TexCoord[0].stp*0.5+0.5;
+  //gl_FragBuffer[1].rgb=gl_TexCoord[0].stp*0.5+0.5;
 }
-- 
GitLab