From aed3339e43dbf7f1e22c5c6e0cdc16ad50cf32c9 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 30 Jan 2009 18:56:30 +0000 Subject: [PATCH] Improved shaders to better handle region of constant values when doing normal generation --- src/osgVolume/Shaders/volume_frag.cpp | 3 +- src/osgVolume/Shaders/volume_iso_frag.cpp | 31 +++++++------------- src/osgVolume/Shaders/volume_lit_frag.cpp | 18 +++++++----- src/osgVolume/Shaders/volume_lit_tf_frag.cpp | 16 +++++----- src/osgVolume/Shaders/volume_mip_frag.cpp | 3 +- src/osgVolume/Shaders/volume_tf_frag.cpp | 3 +- src/osgVolume/Shaders/volume_tf_iso_frag.cpp | 3 +- src/osgVolume/Shaders/volume_tf_mip_frag.cpp | 3 +- 8 files changed, 35 insertions(+), 45 deletions(-) diff --git a/src/osgVolume/Shaders/volume_frag.cpp b/src/osgVolume/Shaders/volume_frag.cpp index 1cc4cfb90..d2e97f362 100644 --- a/src/osgVolume/Shaders/volume_frag.cpp +++ b/src/osgVolume/Shaders/volume_frag.cpp @@ -95,5 +95,4 @@ char volume_frag[] = "uniform sampler3D baseTexture;\n" " if (fragColor.w1.0) fragColor.w = 1.0; \n" - " gl_FragColor = fragColor;\n" + " if (color.w>1.0) color.w = 1.0; \n" + " gl_FragColor = color;\n" " \n" " return;\n" " }\n" @@ -132,5 +124,4 @@ char volume_iso_frag[] = "uniform sampler3D baseTexture;\n" "\n" " // we didn't find an intersection so just discard fragment\n" " discard;\n" - "}\n" - "\n"; + "}\n"; diff --git a/src/osgVolume/Shaders/volume_lit_frag.cpp b/src/osgVolume/Shaders/volume_lit_frag.cpp index 647ab5217..cb2ca122a 100644 --- a/src/osgVolume/Shaders/volume_lit_frag.cpp +++ b/src/osgVolume/Shaders/volume_lit_frag.cpp @@ -80,6 +80,7 @@ char volume_lit_frag[] = "uniform sampler3D baseTexture;\n" " while(num_iterations>0.0)\n" " {\n" " vec4 color = texture3D( baseTexture, texcoord);\n" + "\n" " float a = color.a;\n" " float px = texture3D( baseTexture, texcoord + deltaX).a;\n" " float py = texture3D( baseTexture, texcoord + deltaY).a;\n" @@ -90,13 +91,15 @@ char volume_lit_frag[] = "uniform sampler3D baseTexture;\n" " float nz = texture3D( baseTexture, texcoord - deltaZ).a;\n" "\n" " vec3 grad = vec3(px-nx, py-ny, pz-nz);\n" - " vec3 normal = normalize(grad);\n" + " if (grad.x!=0.0 || grad.y!=0.0 || grad.z!=0.0)\n" + " {\n" + " vec3 normal = normalize(grad);\n" + " float lightScale = 0.1 + abs(dot(normal.xyz, eyeDirection))*0.9;\n" "\n" - " float lightScale = 0.1 + abs(dot(normal.xyz, eyeDirection));\n" - "\n" - " color.x *= lightScale;\n" - " color.y *= lightScale;\n" - " color.z *= lightScale;\n" + " color.x *= lightScale;\n" + " color.y *= lightScale;\n" + " color.z *= lightScale;\n" + " }\n" "\n" " float r = color[3]*TransparencyValue;\n" " if (r>AlphaFuncValue)\n" @@ -120,5 +123,4 @@ char volume_lit_frag[] = "uniform sampler3D baseTexture;\n" " if (fragColor.wAlphaFuncValue)\n" @@ -123,5 +126,4 @@ char volume_lit_tf_frag[] = "uniform sampler3D baseTexture;\n" " if (fragColor.w1.0) fragColor.w = 1.0; \n" " if (fragColor.w