]> OCCT Git - occt.git/commitdiff
0032237: Visualization, TKOpenGl - fix Gouraud shading within perspective camera...
authorkgv <kgv@opencascade.com>
Mon, 22 Mar 2021 14:57:30 +0000 (17:57 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 25 Mar 2021 16:14:28 +0000 (19:14 +0300)
src/Graphic3d/Graphic3d_ShaderManager.cxx

index aec6b76ca4e5a2b8d531adb08e0cfe7aa68cac37..42796fe1950e89d53ae373269e06cbe47dba7db6 100644 (file)
@@ -1476,7 +1476,16 @@ Handle(Graphic3d_ShaderProgram) Graphic3d_ShaderManager::getStdProgramGouraud (c
       EOL"{"
       EOL"  vec4 aPositionWorld = occModelWorldMatrix * occVertex;"
       EOL"  vec3 aNormal        = transformNormal (occNormal);"
-      EOL"  vec3 aView = (occWorldViewMatrixInverse * vec4(0.0, 0.0, 1.0, 0.0)).xyz;"
+      EOL"  vec3 aView;"
+      EOL"  if (occProjectionMatrix[3][3] == 1.0)"
+      EOL"  {"
+      EOL"    aView = (occWorldViewMatrixInverse * vec4(0.0, 0.0, 1.0, 0.0)).xyz;"
+      EOL"  }"
+      EOL"  else"
+      EOL"  {"
+      EOL"    vec3 anEye = (occWorldViewMatrixInverse * vec4(0.0, 0.0, 0.0, 1.0)).xyz;"
+      EOL"    aView = normalize (anEye - aPositionWorld.xyz);"
+      EOL"  }"
       EOL"  FrontColor  = computeLighting (aNormal, aView, aPositionWorld, true);"
       EOL"  BackColor   = computeLighting (aNormal, aView, aPositionWorld, false);"
     + aSrcVertExtraMain
@@ -1693,14 +1702,13 @@ Handle(Graphic3d_ShaderProgram) Graphic3d_ShaderManager::getStdProgramPhong (con
       EOL"  PositionWorld = occModelWorldMatrix * occVertex;"
       EOL"  if (occProjectionMatrix[3][3] == 1.0)"
       EOL"  {"
-      EOL"    View = vec3(0.0, 0.0, 1.0);"
+      EOL"    View = (occWorldViewMatrixInverse * vec4(0.0, 0.0, 1.0, 0.0)).xyz;"
       EOL"  }"
       EOL"  else"
       EOL"  {"
-      EOL"    vec4 aPosition = occWorldViewMatrix * PositionWorld;"
-      EOL"    View = -aPosition.xyz;"
+      EOL"    vec3 anEye = (occWorldViewMatrixInverse * vec4(0.0, 0.0, 0.0, 1.0)).xyz;"
+      EOL"    View = normalize (anEye - PositionWorld.xyz);"
       EOL"  }"
-      EOL"  View = (occWorldViewMatrixInverse * vec4(View, 0.0)).xyz;"
     + aSrcVertExtraMain
     + THE_VERT_gl_Position
     + EOL"}";