0031225: Visualization, TKOpenGl - support cubemap for environment texture within...
[occt.git] / src / Shaders / Shaders_RaytraceBase_fs.pxx
index 43c36ba..6b852d4 100644 (file)
@@ -73,8 +73,18 @@ static const char Shaders_RaytraceBase_fs[] =
   "uniform samplerBuffer uRaytraceMaterialTexture;\n"
   "//! Texture buffer of light source properties.\n"
   "uniform samplerBuffer uRaytraceLightSrcTexture;\n"
-  "//! Environment map texture.\n"
-  "uniform sampler2D uEnvironmentMapTexture;\n"
+  "\n"
+  "#ifdef BACKGROUND_CUBEMAP\n"
+  "  //! Environment cubemap texture.\n"
+  "  uniform samplerCube uEnvMapTexture;\n"
+  "  //! Coefficient of Y controlling horizontal flip of cubemap\n"
+  "  uniform int uYCoeff;\n"
+  "  //! Coefficient of Z controlling vertical flip of cubemap\n"
+  "  uniform int uZCoeff;\n"
+  "#else\n"
+  "  //! Environment map texture.\n"
+  "  uniform sampler2D uEnvMapTexture;\n"
+  "#endif\n"
   "\n"
   "//! Total number of light sources.\n"
   "uniform int uLightCount;\n"
@@ -85,10 +95,10 @@ static const char Shaders_RaytraceBase_fs[] =
   "uniform int uShadowsEnabled;\n"
   "//! Enables/disables specular reflections.\n"
   "uniform int uReflectEnabled;\n"
-  "//! Enables/disables spherical environment map.\n"
-  "uniform int uSphereMapEnabled;\n"
+  "//! Enables/disables environment map lighting.\n"
+  "uniform int uEnvMapEnabled;\n"
   "//! Enables/disables environment map background.\n"
-  "uniform int uSphereMapForBack;\n"
+  "uniform int uEnvMapForBack;\n"
   "\n"
   "//! Radius of bounding sphere of the scene.\n"
   "uniform float uSceneRadius;\n"
@@ -851,6 +861,17 @@ static const char Shaders_RaytraceBase_fs[] =
   "               aPsi * 0.3183098f);\n"
   "}\n"
   "\n"
+  "#ifdef BACKGROUND_CUBEMAP\n"
+  "//! Transform texture coordinates for cubemap lookup.\n"
+  "vec3 cubemapVectorTransform (in vec3 theVec, in float theRadius)\n"
+  "{\n"
+  "  vec3 aVec = theVec.yzx;\n"
+  "  aVec.y *= float(uYCoeff);\n"
+  "  aVec.z *= float(uZCoeff);\n"
+  "  return aVec;\n"
+  "}\n"
+  "#endif\n"
+  "\n"
   "// =======================================================================\n"
   "// function : SmoothNormal\n"
   "// purpose  : Interpolates normal across the triangle\n"
@@ -912,10 +933,25 @@ static const char Shaders_RaytraceBase_fs[] =
   "// function : FetchEnvironment\n"
   "// purpose  :\n"
   "// =======================================================================\n"
-  "vec4 FetchEnvironment (in vec2 theTexCoord)\n"
+  "vec4 FetchEnvironment (in vec3 theTexCoord, in float theRadius, in bool theIsBackground)\n"
   "{\n"
-  "  return uSphereMapEnabled == 0 ?\n"
-  "    vec4 (0.f, 0.f, 0.f, 1.f) : textureLod (uEnvironmentMapTexture, theTexCoord, 0.f);\n"
+  "  if (uEnvMapEnabled == 0)\n"
+  "  {\n"
+  "#ifdef PATH_TRACING\n"
+  "    return theIsBackground ? vec4 (0.0, 0.0, 0.0, 1.0) : uGlobalAmbient;\n"
+  "#else\n"
+  "    return vec4 (0.0, 0.0, 0.0, 1.0);\n"
+  "#endif\n"
+  "  }\n"
+  "\n"
+  "  vec4 anAmbScale = theIsBackground ? vec4(1.0) : uGlobalAmbient;\n"
+  "  vec4 anEnvColor =\n"
+  "#ifdef BACKGROUND_CUBEMAP\n"
+  "    textureLod (uEnvMapTexture, cubemapVectorTransform (theTexCoord, theRadius), 0.0);\n"
+  "#else\n"
+  "    textureLod (uEnvMapTexture, Latlong (theTexCoord, theRadius), 0.0);\n"
+  "#endif\n"
+  "  return anEnvColor * anAmbScale;\n"
   "}\n"
   "\n"
   "// =======================================================================\n"
@@ -982,12 +1018,11 @@ static const char Shaders_RaytraceBase_fs[] =
   "    {\n"
   "      vec4 aColor = vec4 (0.0);\n"
   "\n"
-  "      if (bool(uSphereMapForBack) || aWeight.w == 0.0f /* reflection */)\n"
+  "      if (bool(uEnvMapForBack) || aWeight.w == 0.0f /* reflection */)\n"
   "      {\n"
   "        float aTime = IntersectSphere (theRay, uSceneRadius);\n"
   "\n"
-  "        aColor = FetchEnvironment (Latlong (\n"
-  "          theRay.Direct * aTime + theRay.Origin, uSceneRadius));\n"
+  "        aColor = FetchEnvironment (theRay.Direct * aTime + theRay.Origin, uSceneRadius, aWeight.w != 0.0);\n"
   "      }\n"
   "      else\n"
   "      {\n"