0029337: Visualization, TKOpenGl - visual artifacts on Intel Broadwell GPU
[occt.git] / src / OpenGl / OpenGl_ShaderManager.cxx
index fe84cac..a664c07 100644 (file)
@@ -265,12 +265,6 @@ const char THE_FRAG_CLIP_PLANES_2[] =
   EOL"    discard;"
   EOL"  }";
 
-//! Output color and coverage for accumulation by OIT algorithm.
-const char THE_FRAG_write_oit_buffers[] =
-  EOL"  float aWeight     = occFragColor.a * clamp (1e+2 * pow (1.0 - gl_FragCoord.z * occOitDepthFactor, 3.0), 1e-2, 1e+2);"
-  EOL"  occFragCoverage.r = occFragColor.a * aWeight;"
-  EOL"  occFragColor      = vec4 (occFragColor.rgb * occFragColor.a * aWeight, occFragColor.a);";
-
 #if !defined(GL_ES_VERSION_2_0)
 
   static const GLfloat THE_DEFAULT_AMBIENT[4]    = { 0.0f, 0.0f, 0.0f, 1.0f };
@@ -1194,7 +1188,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFont()
        EOL"  vec4 aColor = occColor;"
        EOL"  aColor.a *= getAlpha();"
        EOL"  if (aColor.a <= 0.285) discard;"
-       EOL"  occFragColor = aColor;"
+       EOL"  occSetFragColor (aColor);"
        EOL"}";
 
 #if !defined(GL_ES_VERSION_2_0)
@@ -1245,7 +1239,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFboBlit()
       EOL"void main()"
       EOL"{"
       EOL"  gl_FragDepth = occTexture2D (uDepthSampler, TexCoord).r;"
-      EOL"  occFragColor = occTexture2D (uColorSampler, TexCoord);"
+      EOL"  occSetFragColor (occTexture2D (uColorSampler, TexCoord));"
       EOL"}";
 
 #if defined(GL_ES_VERSION_2_0)
@@ -1268,7 +1262,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFboBlit()
       EOL
       EOL"void main()"
       EOL"{"
-      EOL"  occFragColor = occTexture2D (uColorSampler, TexCoord);"
+      EOL"  occSetFragColor (occTexture2D (uColorSampler, TexCoord));"
       EOL"}";
   }
 #else
@@ -1325,7 +1319,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramOitCompositing (const St
       EOL"{"
       EOL"  vec4 aAccum   = occTexture2D (uAccumTexture,  TexCoord);"
       EOL"  float aWeight = occTexture2D (uWeightTexture, TexCoord).r;"
-      EOL"  occFragColor = vec4 (aAccum.rgb / max (aWeight, 0.00001), aAccum.a);"
+      EOL"  occSetFragColor (vec4 (aAccum.rgb / max (aWeight, 0.00001), aAccum.a));"
       EOL"}";
   #if !defined(GL_ES_VERSION_2_0)
     if (myContext->IsGlGreaterEqual (3, 2))
@@ -1352,7 +1346,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramOitCompositing (const St
       EOL"  ivec2 aTexel  = ivec2 (textureSize (uAccumTexture) * TexCoord);"
       EOL"  vec4 aAccum   = texelFetch (uAccumTexture,  aTexel, gl_SampleID);"
       EOL"  float aWeight = texelFetch (uWeightTexture, aTexel, gl_SampleID).r;"
-      EOL"  occFragColor = vec4 (aAccum.rgb / max (aWeight, 0.00001), aAccum.a);"
+      EOL"  occSetFragColor (vec4 (aAccum.rgb / max (aWeight, 0.00001), aAccum.a));"
       EOL"}";
   #if !defined(GL_ES_VERSION_2_0)
     if (myContext->IsGlGreaterEqual (4, 0))
@@ -1429,7 +1423,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFlat (Handle(OpenGl_Shad
   TCollection_AsciiString aSrcVert, aSrcVertExtraOut, aSrcVertExtraMain, aSrcVertExtraFunc, aSrcGetAlpha;
   TCollection_AsciiString aSrcFrag, aSrcFragExtraOut, aSrcFragExtraMain, aSrcFragWriteOit;
   TCollection_AsciiString aSrcFragGetColor     = EOL"vec4 getColor(void) { return occColor; }";
-  TCollection_AsciiString aSrcFragMainGetColor = EOL"  occFragColor = getColor();";
+  TCollection_AsciiString aSrcFragMainGetColor = EOL"  occSetFragColor (getColor());";
   if ((theBits & OpenGl_PO_Point) != 0)
   {
   #if defined(GL_ES_VERSION_2_0)
@@ -1458,14 +1452,14 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFlat (Handle(OpenGl_Shad
         EOL"  vec4 aColor = getColor();"
         EOL"  aColor.a = getAlpha();"
         EOL"  if (aColor.a <= 0.1) discard;"
-        EOL"  occFragColor = aColor;";
+        EOL"  occSetFragColor (aColor);";
     }
     else
     {
       aSrcFragMainGetColor =
         EOL"  vec4 aColor = getColor();"
         EOL"  if (aColor.a <= 0.1) discard;"
-        EOL"  occFragColor = aColor;";
+        EOL"  occSetFragColor (aColor);";
     }
   }
   else
@@ -1536,7 +1530,8 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFlat (Handle(OpenGl_Shad
   }
   if ((theBits & OpenGl_PO_WriteOit) != 0)
   {
-    aSrcFragWriteOit += THE_FRAG_write_oit_buffers;
+    aProgramSrc->SetNbFragmentOutputs (2);
+    aProgramSrc->SetWeightOitOutput (true);
   }
 
   TCollection_AsciiString aSrcVertEndMain;
@@ -1578,7 +1573,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFlat (Handle(OpenGl_Shad
         EOL"  if ((uint (uPattern) & (1U << aBit)) == 0U) discard;"
         EOL"  vec4 aColor = getColor();"
         EOL"  if (aColor.a <= 0.1) discard;"
-        EOL"  occFragColor = aColor;";
+        EOL"  occSetFragColor (aColor);";
     }
     else
     {
@@ -1888,7 +1883,8 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramGouraud (Handle(OpenGl_S
   }
   if ((theBits & OpenGl_PO_WriteOit) != 0)
   {
-    aSrcFragWriteOit += THE_FRAG_write_oit_buffers;
+    aProgramSrc->SetNbFragmentOutputs (2);
+    aProgramSrc->SetWeightOitOutput (true);
   }
 
   Standard_Integer aNbLights = 0;
@@ -1923,7 +1919,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramGouraud (Handle(OpenGl_S
     + EOL"void main()"
       EOL"{"
     + aSrcFragExtraMain
-    + EOL"  occFragColor = getColor();"
+    + EOL"  occSetFragColor (getColor());"
     + aSrcFragWriteOit
     + EOL"}";
 
@@ -2037,7 +2033,8 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_Sha
   }
   if ((theBits & OpenGl_PO_WriteOit) != 0)
   {
-    aSrcFragWriteOit += THE_FRAG_write_oit_buffers;
+    aProgramSrc->SetNbFragmentOutputs (2);
+    aProgramSrc->SetWeightOitOutput (true);
   }
 
   aSrcVert = TCollection_AsciiString()
@@ -2082,7 +2079,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_Sha
     + (isFlatNormal
     ? EOL"  Normal = normalize (cross (dFdx (Position.xyz / Position.w), dFdy (Position.xyz / Position.w)));"
     : "")
-    + EOL"  occFragColor = getColor();"
+    + EOL"  occSetFragColor (getColor());"
     + aSrcFragWriteOit
     + EOL"}";
 
@@ -2163,7 +2160,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramStereo (Handle(OpenGl_Sh
           EOL"  aColorL = pow (aColorL, THE_POW_UP);" // normalize
           EOL"  aColorR = pow (aColorR, THE_POW_UP);"
           EOL"  vec4 aColor = uMultR * aColorR + uMultL * aColorL;"
-          EOL"  occFragColor = pow (aColor, THE_POW_DOWN);"
+          EOL"  occSetFragColor (pow (aColor, THE_POW_DOWN));"
           EOL"}";
       break;
     }
@@ -2181,11 +2178,11 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramStereo (Handle(OpenGl_Sh
           EOL"  vec4 aColorR = occTexture2D (uRightSampler, TexCoord);"
           EOL"  if (int (mod (gl_FragCoord.y - 1023.5, 2.0)) != 1)"
           EOL"  {"
-          EOL"    occFragColor = aColorL;"
+          EOL"    occSetFragColor (aColorL);"
           EOL"  }"
           EOL"  else"
           EOL"  {"
-          EOL"    occFragColor = aColorR;"
+          EOL"    occSetFragColor (aColorR);"
           EOL"  }"
           EOL"}";
       break;
@@ -2204,11 +2201,11 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramStereo (Handle(OpenGl_Sh
           EOL"  vec4 aColorR = occTexture2D (uRightSampler, TexCoord);"
           EOL"  if (int (mod (gl_FragCoord.x - 1023.5, 2.0)) == 1)"
           EOL"  {"
-          EOL"    occFragColor = aColorL;"
+          EOL"    occSetFragColor (aColorL);"
           EOL"  }"
           EOL"  else"
           EOL"  {"
-          EOL"    occFragColor = aColorR;"
+          EOL"    occSetFragColor (aColorR);"
           EOL"  }"
           EOL"}";
       break;
@@ -2229,11 +2226,11 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramStereo (Handle(OpenGl_Sh
           EOL"  bool isEvenY = int(mod(floor(gl_FragCoord.y - 1023.5), 2.0)) == 1;"
           EOL"  if ((isEvenX && isEvenY) || (!isEvenX && !isEvenY))"
           EOL"  {"
-          EOL"    occFragColor = aColorL;"
+          EOL"    occSetFragColor (aColorL);"
           EOL"  }"
           EOL"  else"
           EOL"  {"
-          EOL"    occFragColor = aColorR;"
+          EOL"    occSetFragColor (aColorR);"
           EOL"  }"
           EOL"}";
       break;
@@ -2257,11 +2254,11 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramStereo (Handle(OpenGl_Sh
           EOL"  vec4 aColorR = occTexture2D (uRightSampler, aTexCoord);"
           EOL"  if (TexCoord.x <= 0.5)"
           EOL"  {"
-          EOL"    occFragColor = aColorL;"
+          EOL"    occSetFragColor (aColorL);"
           EOL"  }"
           EOL"  else"
           EOL"  {"
-          EOL"    occFragColor = aColorR;"
+          EOL"    occSetFragColor (aColorR);"
           EOL"  }"
           EOL"}";
       break;
@@ -2285,11 +2282,11 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramStereo (Handle(OpenGl_Sh
           EOL"  vec4 aColorR = occTexture2D (uRightSampler, aTexCoord);"
           EOL"  if (TexCoord.y <= 0.5)"
           EOL"  {"
-          EOL"    occFragColor = aColorL;"
+          EOL"    occSetFragColor (aColorL);"
           EOL"  }"
           EOL"  else"
           EOL"  {"
-          EOL"    occFragColor = aColorR;"
+          EOL"    occSetFragColor (aColorR);"
           EOL"  }"
           EOL"}";
       break;
@@ -2316,7 +2313,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramStereo (Handle(OpenGl_Sh
           EOL"  aColorL.b = 0.0;"
           EOL"  aColorL.g = 0.0;"
           EOL"  aColorR.r = 0.0;"
-          EOL"  occFragColor = aColorL + aColorR;"
+          EOL"  occSetFragColor (aColorL + aColorR);"
           EOL"}";
       break;
     }