0027256: Visualization, Path Tracing - add support of alpha-channel of texture
authordbp <dbp@opencascade.com>
Thu, 17 Nov 2016 15:51:38 +0000 (18:51 +0300)
committerapn <apn@opencascade.com>
Fri, 18 Nov 2016 12:17:36 +0000 (15:17 +0300)
Regenerate resource files.

src/Graphic3d/Graphic3d_NameOfTexture2D.hxx
src/Graphic3d/Graphic3d_Texture2D.cxx
src/Shaders/PathtraceBase.fs
src/Shaders/RaytraceBase.fs
src/Shaders/Shaders_PathtraceBase_fs.pxx
src/Shaders/Shaders_RaytraceBase_fs.pxx
src/Textures/2d_chess.rgba [new file with mode: 0644]
src/Textures/FILES
tests/v3d/raytrace/sample_ball_alpha [new file with mode: 0644]

index 44448b4..d3ec934 100644 (file)
@@ -41,6 +41,7 @@ Graphic3d_NOT_2D_MAPLE,
 Graphic3d_NOT_2D_MARBLE,
 Graphic3d_NOT_2D_MOTTLED,
 Graphic3d_NOT_2D_RAIN,
+Graphic3d_NOT_2D_CHESS,
 Graphic3d_NOT_2D_UNKNOWN
 };
 
index 37e7308..ca8ac55 100644 (file)
@@ -42,7 +42,8 @@ static const char *NameOfTexture_to_FileName[] =
   "2d_maple.rgb",
   "2d_marble.rgb",
   "2d_mottled.rgb",
-  "2d_rain.rgb"
+  "2d_rain.rgb",
+  "2d_chess.rgba"
 };
 
 // =======================================================================
index 98400cc..916ac69 100644 (file)
@@ -759,10 +759,16 @@ vec4 PathTrace (in SRay theRay, in vec3 theInverse)
       aTexCoord.st = vec2 (dot (aTrsfRow1, aTexCoord),
                            dot (aTrsfRow2, aTexCoord));
 
-      vec3 aTexColor = textureLod (
-        sampler2D (uTextureSamplers[int (aMaterial.Kd.w)]), aTexCoord.st, 0.f).rgb;
+      vec4 aTexColor = textureLod (
+        sampler2D (uTextureSamplers[int (aMaterial.Kd.w)]), aTexCoord.st, 0.f);
 
-      aMaterial.Kd.rgb *= aTexColor * aTexColor; // de-gamma correction (for gamma = 2)
+      aMaterial.Kd.rgb *= (aTexColor.rgb, aTexColor.rgb) * aTexColor.w; // de-gamma correction (for gamma = 2)
+
+      if (aTexColor.w != 1.0f)
+      {
+        // mix transparency BTDF with texture alpha-channel
+        aMaterial.Kt = (UNIT - aTexColor.www) + aTexColor.w * aMaterial.Kt;
+      }
     }
 #endif
 
index 31520ad..a7f7be1 100644 (file)
@@ -969,11 +969,14 @@ vec4 Radiance (in SRay theRay, in vec3 theInverse)
       aTexCoord.st = vec2 (dot (aTrsfRow1, aTexCoord),
                            dot (aTrsfRow2, aTexCoord));
 
-      vec3 aTexColor = textureLod (
-        sampler2D (uTextureSamplers[int(aDiffuse.w)]), aTexCoord.st, 0.f).rgb;
+      vec4 aTexColor = textureLod (
+        sampler2D (uTextureSamplers[int(aDiffuse.w)]), aTexCoord.st, 0.f);
 
-      aDiffuse.rgb *= aTexColor;
-      aAmbient.rgb *= aTexColor;
+      aDiffuse.rgb *= aTexColor.rgb;
+      aAmbient.rgb *= aTexColor.rgb;
+
+      // keep refractive index untouched (Z component)
+      aOpacity.xy = vec2 (aTexColor.w * aOpacity.x, 1.0f - aTexColor.w * aOpacity.x);
     }
 #endif
 
index 527a49e..187e127 100644 (file)
@@ -762,10 +762,16 @@ static const char Shaders_PathtraceBase_fs[] =
   "      aTexCoord.st = vec2 (dot (aTrsfRow1, aTexCoord),\n"
   "                           dot (aTrsfRow2, aTexCoord));\n"
   "\n"
-  "      vec3 aTexColor = textureLod (\n"
-  "        sampler2D (uTextureSamplers[int (aMaterial.Kd.w)]), aTexCoord.st, 0.f).rgb;\n"
+  "      vec4 aTexColor = textureLod (\n"
+  "        sampler2D (uTextureSamplers[int (aMaterial.Kd.w)]), aTexCoord.st, 0.f);\n"
   "\n"
-  "      aMaterial.Kd.rgb *= aTexColor * aTexColor; // de-gamma correction (for gamma = 2)\n"
+  "      aMaterial.Kd.rgb *= (aTexColor.rgb, aTexColor.rgb) * aTexColor.w; // de-gamma correction (for gamma = 2)\n"
+  "\n"
+  "      if (aTexColor.w != 1.0f)\n"
+  "      {\n"
+  "        // mix transparency BTDF with texture alpha-channel\n"
+  "        aMaterial.Kt = (UNIT - aTexColor.www) + aTexColor.w * aMaterial.Kt;\n"
+  "      }\n"
   "    }\n"
   "#endif\n"
   "\n"
index 63c7309..2df5281 100644 (file)
@@ -972,11 +972,14 @@ static const char Shaders_RaytraceBase_fs[] =
   "      aTexCoord.st = vec2 (dot (aTrsfRow1, aTexCoord),\n"
   "                           dot (aTrsfRow2, aTexCoord));\n"
   "\n"
-  "      vec3 aTexColor = textureLod (\n"
-  "        sampler2D (uTextureSamplers[int(aDiffuse.w)]), aTexCoord.st, 0.f).rgb;\n"
+  "      vec4 aTexColor = textureLod (\n"
+  "        sampler2D (uTextureSamplers[int(aDiffuse.w)]), aTexCoord.st, 0.f);\n"
   "\n"
-  "      aDiffuse.rgb *= aTexColor;\n"
-  "      aAmbient.rgb *= aTexColor;\n"
+  "      aDiffuse.rgb *= aTexColor.rgb;\n"
+  "      aAmbient.rgb *= aTexColor.rgb;\n"
+  "\n"
+  "      // keep refractive index untouched (Z component)\n"
+  "      aOpacity.xy = vec2 (aTexColor.w * aOpacity.x, 1.0f - aTexColor.w * aOpacity.x);\n"
   "    }\n"
   "#endif\n"
   "\n"
diff --git a/src/Textures/2d_chess.rgba b/src/Textures/2d_chess.rgba
new file mode 100644 (file)
index 0000000..ce455d4
Binary files /dev/null and b/src/Textures/2d_chess.rgba differ
index c71f1d2..40b9c55 100755 (executable)
@@ -20,6 +20,7 @@ icon:::2d_MatraDatavision.rgb
 icon:::2d_mottled.rgb
 icon:::2d_rain.rgb
 icon:::2d_rock.rgb
+icon:::2d_chess.rgba
 icon:::env_clouds.rgb
 icon:::env_cv.rgb
 icon:::env_lines.rgb
diff --git a/tests/v3d/raytrace/sample_ball_alpha b/tests/v3d/raytrace/sample_ball_alpha
new file mode 100644 (file)
index 0000000..df43214
--- /dev/null
@@ -0,0 +1,13 @@
+puts "============"
+puts "Visualization - Path Tracing, Ball sample"
+puts "============"
+puts ""
+
+source $env(CSF_OCCTSamplesPath)/tcl/pathtrace_ball.tcl
+
+vtexture ball 21 -scale 0.1 0.1
+vsetmaterial ball plaster
+vbsdf ball -fresnel Constant 0.0
+
+vfps 100
+vdump $imagedir/${casename}_zoom.png