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