]> OCCT Git - occt.git/commitdiff
0032780: Visualization, TKOpenGl - add smoothing to row interlaced stereoscopic output
authorkgv <kgv@opencascade.com>
Sun, 16 Jan 2022 15:20:45 +0000 (18:20 +0300)
committersmoskvin <smoskvin@opencascade.com>
Mon, 17 Jan 2022 17:04:30 +0000 (20:04 +0300)
Added new option Graphic3d_RenderingParams::ToSmoothInterlacing enabled by default.
Added -smooth   option to vstereo command.
Added -dpiAware option to vinit   command (Windows).

src/Graphic3d/Graphic3d_RenderingParams.hxx
src/Graphic3d/Graphic3d_ShaderManager.cxx
src/Graphic3d/Graphic3d_StereoMode.hxx
src/OpenGl/OpenGl_ShaderManager.cxx
src/OpenGl/OpenGl_View.cxx
src/ViewerTest/ViewerTest_ViewerCommands.cxx
tests/opengl/data/general/stereo

index 38fafd4a787d4547dd7e202189f6f55665027a97..e2996630321ee799f089d3626bf45154f9ca67a5 100644 (file)
@@ -146,6 +146,7 @@ public:
     HmdFov2d (30.0f),
     AnaglyphFilter (Anaglyph_RedCyan_Optimized),
     ToReverseStereo (Standard_False),
+    ToSmoothInterlacing (Standard_True),
     ToMirrorComposer (Standard_True),
     //
     StatsPosition (new Graphic3d_TransformPers (Graphic3d_TMF_2d, Aspect_TOTP_LEFT_UPPER,  Graphic3d_Vec2i (20, 20))),
@@ -260,6 +261,7 @@ public: //! @name VR / stereoscopic parameters
   Graphic3d_Mat4                    AnaglyphLeft;                //!< left  anaglyph filter (in normalized colorspace), Color = AnaglyphRight * theColorRight + AnaglyphLeft * theColorLeft;
   Graphic3d_Mat4                    AnaglyphRight;               //!< right anaglyph filter (in normalized colorspace), Color = AnaglyphRight * theColorRight + AnaglyphLeft * theColorLeft;
   Standard_Boolean                  ToReverseStereo;             //!< flag to reverse stereo pair, FALSE by default
+  Standard_Boolean                  ToSmoothInterlacing;         //!< flag to smooth output on interlaced displays (improves text readability / reduces line aliasing), TRUE by default
   Standard_Boolean                  ToMirrorComposer;            //!< if output device is an external composer - mirror rendering results in window in addition to sending frame to composer, TRUE by default
 
 public: //! @name on-screen display parameters
index b553462225deafd248f1012505e7bafb7b05e012..b78d99a00d6384cf30c169a575d24d98be681ca7 100644 (file)
@@ -1800,11 +1800,14 @@ Handle(Graphic3d_ShaderProgram) Graphic3d_ShaderManager::getStdProgramStereo (Gr
     case Graphic3d_StereoMode_RowInterlaced:
     {
       aName = "row-interlaced";
+      aUniforms.Append (Graphic3d_ShaderObject::ShaderVariable ("vec2 uTexOffset", Graphic3d_TOS_FRAGMENT));
       aSrcFrag =
           EOL"void main()"
           EOL"{"
-          EOL"  vec4 aColorL = occTexture2D (uLeftSampler,  TexCoord);"
-          EOL"  vec4 aColorR = occTexture2D (uRightSampler, TexCoord);"
+          EOL"  vec2 aTexCoordL = TexCoord - uTexOffset;"
+          EOL"  vec2 aTexCoordR = TexCoord + uTexOffset;"
+          EOL"  vec4 aColorL = occTexture2D (uLeftSampler,  aTexCoordL);"
+          EOL"  vec4 aColorR = occTexture2D (uRightSampler, aTexCoordR);"
           EOL"  if (int (mod (gl_FragCoord.y - 1023.5, 2.0)) != 1)"
           EOL"  {"
           EOL"    occSetFragColor (aColorL);"
@@ -1819,11 +1822,14 @@ Handle(Graphic3d_ShaderProgram) Graphic3d_ShaderManager::getStdProgramStereo (Gr
     case Graphic3d_StereoMode_ColumnInterlaced:
     {
       aName = "column-interlaced";
+      aUniforms.Append (Graphic3d_ShaderObject::ShaderVariable ("vec2 uTexOffset", Graphic3d_TOS_FRAGMENT));
       aSrcFrag =
           EOL"void main()"
           EOL"{"
-          EOL"  vec4 aColorL = occTexture2D (uLeftSampler,  TexCoord);"
-          EOL"  vec4 aColorR = occTexture2D (uRightSampler, TexCoord);"
+          EOL"  vec2 aTexCoordL = TexCoord - uTexOffset;"
+          EOL"  vec2 aTexCoordR = TexCoord + uTexOffset;"
+          EOL"  vec4 aColorL = occTexture2D (uLeftSampler,  aTexCoordL);"
+          EOL"  vec4 aColorR = occTexture2D (uRightSampler, aTexCoordR);"
           EOL"  if (int (mod (gl_FragCoord.x - 1023.5, 2.0)) == 1)"
           EOL"  {"
           EOL"    occSetFragColor (aColorL);"
@@ -1838,11 +1844,14 @@ Handle(Graphic3d_ShaderProgram) Graphic3d_ShaderManager::getStdProgramStereo (Gr
     case Graphic3d_StereoMode_ChessBoard:
     {
       aName = "chessboard";
+      aUniforms.Append (Graphic3d_ShaderObject::ShaderVariable ("vec2 uTexOffset", Graphic3d_TOS_FRAGMENT));
       aSrcFrag =
           EOL"void main()"
           EOL"{"
-          EOL"  vec4 aColorL = occTexture2D (uLeftSampler,  TexCoord);"
-          EOL"  vec4 aColorR = occTexture2D (uRightSampler, TexCoord);"
+          EOL"  vec2 aTexCoordL = TexCoord - uTexOffset;"
+          EOL"  vec2 aTexCoordR = TexCoord + uTexOffset;"
+          EOL"  vec4 aColorL = occTexture2D (uLeftSampler,  aTexCoordL);"
+          EOL"  vec4 aColorR = occTexture2D (uRightSampler, aTexCoordR);"
           EOL"  bool isEvenX = int(mod(floor(gl_FragCoord.x - 1023.5), 2.0)) != 1;"
           EOL"  bool isEvenY = int(mod(floor(gl_FragCoord.y - 1023.5), 2.0)) == 1;"
           EOL"  if ((isEvenX && isEvenY) || (!isEvenX && !isEvenY))"
index 4aef0c133299fe614b59c6dd0196780c03f522aa..e2ca4f56c21c4434c0bac7c2fa10e3e6d634ce41 100644 (file)
@@ -28,7 +28,7 @@ enum Graphic3d_StereoMode
   Graphic3d_StereoMode_OverUnder,        //!< vertical   pair
   Graphic3d_StereoMode_SoftPageFlip,     //!< software PageFlip for shutter glasses, should NOT be used!
   Graphic3d_StereoMode_OpenVR,           //!< OpenVR (HMD)
-  Graphic3d_StereoMode_NB                //!< the number of modes
 };
+enum { Graphic3d_StereoMode_NB = Graphic3d_StereoMode_OpenVR + 1 };
 
 #endif // _Graphic3d_StereoMode_HeaderFile
index 0023cf89d4baf2ee80f946db6c988cecb672ba1b..fa660e54925fb83025b41cfd4c55de88360e47b8 100644 (file)
@@ -1249,7 +1249,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_Sha
 // =======================================================================
 Standard_Boolean OpenGl_ShaderManager::BindStereoProgram (Graphic3d_StereoMode theStereoMode)
 {
-  if (theStereoMode < 0 || theStereoMode >= Graphic3d_StereoMode_NB)
+  if (theStereoMode < 0 || (int )theStereoMode >= Graphic3d_StereoMode_NB)
   {
     return false;
   }
@@ -1271,6 +1271,7 @@ Standard_Boolean OpenGl_ShaderManager::BindStereoProgram (Graphic3d_StereoMode t
   myContext->BindProgram (aProgram);
   aProgram->SetSampler (myContext, "uLeftSampler",  Graphic3d_TextureUnit_0);
   aProgram->SetSampler (myContext, "uRightSampler", Graphic3d_TextureUnit_1);
+  aProgram->SetUniform (myContext, "uTexOffset",    Graphic3d_Vec2(0.0f));
   return true;
 }
 
index d398a4a9ec1345985fa9c5b0d78604d41204d7ef..97a98a6737bbde5098d0450eb802431173c02cd3 100644 (file)
@@ -175,6 +175,8 @@ OpenGl_View::OpenGl_View (const Handle(Graphic3d_StructureManager)& theMgr,
   myRaytraceFBO2[1]          = new OpenGl_FrameBuffer ("fbo1_raytrace2");
   myDepthPeelingFbos = new OpenGl_DepthPeeling();
   myShadowMaps = new OpenGl_ShadowMapArray();
+
+  myXrSceneFbo->ColorTexture()->Sampler()->Parameters()->SetFilter (Graphic3d_TOTF_BILINEAR);
 }
 
 // =======================================================================
@@ -2862,10 +2864,7 @@ void OpenGl_View::drawStereoPair (OpenGl_FrameBuffer* theDrawFbo)
     if (!myOpenGlFBO ->InitLazy (aCtx, aPair[0]->GetVPSize(), myFboColorFormat, myFboDepthFormat, 0)
      || !myOpenGlFBO2->InitLazy (aCtx, aPair[0]->GetVPSize(), myFboColorFormat, 0, 0))
     {
-      aCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION,
-                         GL_DEBUG_TYPE_ERROR,
-                         0,
-                         GL_DEBUG_SEVERITY_HIGH,
+      aCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH,
                          "Error! Unable to allocate FBO for blitting stereo pair");
       bindDefaultFbo (theDrawFbo);
       return;
@@ -2924,10 +2923,16 @@ void OpenGl_View::drawStereoPair (OpenGl_FrameBuffer* theDrawFbo)
   OpenGl_VertexBuffer* aVerts = initBlitQuad (myToFlipOutput);
 
   const Handle(OpenGl_ShaderManager)& aManager = aCtx->ShaderManager();
-  if (aVerts->IsValid()
-   && aManager->BindStereoProgram (myRenderParams.StereoMode))
+  if (!aVerts->IsValid()
+   || !aManager->BindStereoProgram (myRenderParams.StereoMode))
   {
-    if (myRenderParams.StereoMode == Graphic3d_StereoMode_Anaglyph)
+    aCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, "Error! Anaglyph has failed");
+    return;
+  }
+
+  switch (myRenderParams.StereoMode)
+  {
+    case Graphic3d_StereoMode_Anaglyph:
     {
       OpenGl_Mat4 aFilterL, aFilterR;
       aFilterL.SetDiagonal (Graphic3d_Vec4 (0.0f, 0.0f, 0.0f, 0.0f));
@@ -2988,28 +2993,55 @@ void OpenGl_View::drawStereoPair (OpenGl_FrameBuffer* theDrawFbo)
       }
       aCtx->ActiveProgram()->SetUniform (aCtx, "uMultL", aFilterL);
       aCtx->ActiveProgram()->SetUniform (aCtx, "uMultR", aFilterR);
+      break;
     }
-
-    aPair[0]->ColorTexture()->Bind (aCtx, Graphic3d_TextureUnit_0);
-    aPair[1]->ColorTexture()->Bind (aCtx, Graphic3d_TextureUnit_1);
-    aVerts->BindVertexAttrib (aCtx, 0);
-
-    aCtx->core20fwd->glDrawArrays (GL_TRIANGLE_STRIP, 0, 4);
-
-    aVerts->UnbindVertexAttrib (aCtx, 0);
-    aPair[1]->ColorTexture()->Unbind (aCtx, Graphic3d_TextureUnit_1);
-    aPair[0]->ColorTexture()->Unbind (aCtx, Graphic3d_TextureUnit_0);
+    case Graphic3d_StereoMode_RowInterlaced:
+    {
+      Graphic3d_Vec2 aTexOffset = myRenderParams.ToSmoothInterlacing
+                                ? Graphic3d_Vec2 (0.0f, -0.5f / float(aPair[0]->GetSizeY()))
+                                : Graphic3d_Vec2();
+      aCtx->ActiveProgram()->SetUniform (aCtx, "uTexOffset", aTexOffset);
+      break;
+    }
+    case Graphic3d_StereoMode_ColumnInterlaced:
+    {
+      Graphic3d_Vec2 aTexOffset = myRenderParams.ToSmoothInterlacing
+                                ? Graphic3d_Vec2 (0.5f / float(aPair[0]->GetSizeX()), 0.0f)
+                                : Graphic3d_Vec2();
+      aCtx->ActiveProgram()->SetUniform (aCtx, "uTexOffset", aTexOffset);
+      break;
+    }
+    case Graphic3d_StereoMode_ChessBoard:
+    {
+      Graphic3d_Vec2 aTexOffset = myRenderParams.ToSmoothInterlacing
+                                ? Graphic3d_Vec2 (0.5f / float(aPair[0]->GetSizeX()),
+                                                 -0.5f / float(aPair[0]->GetSizeY()))
+                                : Graphic3d_Vec2();
+      aCtx->ActiveProgram()->SetUniform (aCtx, "uTexOffset", aTexOffset);
+      break;
+    }
+    default: break;
   }
-  else
+
+  for (int anEyeIter = 0; anEyeIter < 2; ++anEyeIter)
   {
-    TCollection_ExtendedString aMsg = TCollection_ExtendedString()
-      + "Error! Anaglyph has failed";
-    aCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION,
-                       GL_DEBUG_TYPE_ERROR,
-                       0,
-                       GL_DEBUG_SEVERITY_HIGH,
-                       aMsg);
+    OpenGl_FrameBuffer* anEyeFbo = aPair[anEyeIter];
+    anEyeFbo->ColorTexture()->Bind (aCtx, (Graphic3d_TextureUnit )(Graphic3d_TextureUnit_0 + anEyeIter));
+    if (anEyeFbo->ColorTexture()->Sampler()->Parameters()->Filter() != Graphic3d_TOTF_BILINEAR)
+    {
+      // force filtering
+      anEyeFbo->ColorTexture()->Sampler()->Parameters()->SetFilter (Graphic3d_TOTF_BILINEAR);
+      aCtx->core20fwd->glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+      aCtx->core20fwd->glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    }
   }
+  aVerts->BindVertexAttrib (aCtx, 0);
+
+  aCtx->core20fwd->glDrawArrays (GL_TRIANGLE_STRIP, 0, 4);
+
+  aVerts->UnbindVertexAttrib (aCtx, 0);
+  aPair[1]->ColorTexture()->Unbind (aCtx, Graphic3d_TextureUnit_1);
+  aPair[0]->ColorTexture()->Unbind (aCtx, Graphic3d_TextureUnit_0);
 }
 
 // =======================================================================
index 77520fe13c991f6a1186207457cf881e0c5c2e66..3bf244970bb36244a9dba000c3f61271971569f5 100644 (file)
@@ -957,7 +957,7 @@ static int VInit (Draw_Interpretor& theDi, Standard_Integer theArgsNb, const cha
   Standard_Boolean isVirtual = false;
   Handle(V3d_View) aCopyFrom;
   TCollection_AsciiString aName, aValue;
-  int is2dMode = -1;
+  int is2dMode = -1, aDpiAware = -1;
   for (Standard_Integer anArgIt = 1; anArgIt < theArgsNb; ++anArgIt)
   {
     const TCollection_AsciiString anArg = theArgVec[anArgIt];
@@ -1039,6 +1039,10 @@ static int VInit (Draw_Interpretor& theDi, Standard_Integer theArgsNb, const cha
     {
       aDisplayName = theArgVec[++anArgIt];
     }
+    else if (anArgCase == "-dpiaware")
+    {
+      aDpiAware = Draw::ParseOnOffIterator (theArgsNb, theArgVec, anArgIt) ? 1 : 0;
+    }
     else if (!ViewerTest::CurrentView().IsNull()
           &&  aCopyFrom.IsNull()
           && (anArgCase == "-copy"
@@ -1098,12 +1102,44 @@ static int VInit (Draw_Interpretor& theDi, Standard_Integer theArgsNb, const cha
     }
   }
 
+#if defined(_WIN32)
+  if (aDpiAware != -1)
+  {
+    typedef void* (WINAPI *SetThreadDpiAwarenessContext_t)(void*);
+    if (HMODULE aUser32Module = GetModuleHandleW (L"User32"))
+    {
+      SetThreadDpiAwarenessContext_t aSetDpiAware = (SetThreadDpiAwarenessContext_t )GetProcAddress (aUser32Module, "SetThreadDpiAwarenessContext");
+      if (aDpiAware == 1)
+      {
+        // DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
+        if (aSetDpiAware ((void* )-4) == NULL)
+        {
+          // DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE for older systems
+          if (aSetDpiAware ((void* )-3) == NULL)
+          {
+            Message::SendFail() << "Error: unable to enable DPI awareness";
+          }
+        }
+      }
+      else
+      {
+        // DPI_AWARENESS_CONTEXT_UNAWARE
+        if (aSetDpiAware ((void* )-1) == NULL)
+        {
+          Message::SendFail() << "Error: unable to disable DPI awareness";
+        }
+      }
+    }
+  }
+#else
+  (void )aDpiAware;
 #if !defined(HAVE_XLIB)
   if (!aDisplayName.IsEmpty())
   {
     aDisplayName.Clear();
     Message::SendWarning() << "Warning: display parameter will be ignored.\n";
   }
+#endif
 #endif
 
   ViewerTest_Names aViewNames (aViewName);
@@ -9373,15 +9409,60 @@ static int VStereo (Draw_Interpretor& theDI,
       TCollection_AsciiString aMode;
       switch (aView->RenderingParams().StereoMode)
       {
-        case Graphic3d_StereoMode_QuadBuffer       : aMode = "quadBuffer";       break;
-        case Graphic3d_StereoMode_RowInterlaced    : aMode = "rowInterlaced";    break;
-        case Graphic3d_StereoMode_ColumnInterlaced : aMode = "columnInterlaced"; break;
-        case Graphic3d_StereoMode_ChessBoard       : aMode = "chessBoard";       break;
-        case Graphic3d_StereoMode_SideBySide       : aMode = "sideBySide";       break;
-        case Graphic3d_StereoMode_OverUnder        : aMode = "overUnder";        break;
-        case Graphic3d_StereoMode_SoftPageFlip     : aMode = "softpageflip";     break;
-        case Graphic3d_StereoMode_OpenVR           : aMode = "openVR";           break;
-        case Graphic3d_StereoMode_Anaglyph  :
+        case Graphic3d_StereoMode_QuadBuffer:
+        {
+          aMode = "quadBuffer";
+          break;
+        }
+        case Graphic3d_StereoMode_RowInterlaced:
+        {
+          aMode = "rowInterlaced";
+          if (aView->RenderingParams().ToSmoothInterlacing)
+          {
+            aMode.AssignCat (" (smoothed)");
+          }
+          break;
+        }
+        case Graphic3d_StereoMode_ColumnInterlaced:
+        {
+          aMode = "columnInterlaced";
+          if (aView->RenderingParams().ToSmoothInterlacing)
+          {
+            aMode.AssignCat (" (smoothed)");
+          }
+          break;
+        }
+        case Graphic3d_StereoMode_ChessBoard:
+        {
+          aMode = "chessBoard";
+          if (aView->RenderingParams().ToSmoothInterlacing)
+          {
+            aMode.AssignCat (" (smoothed)");
+          }
+          break;
+        }
+        case Graphic3d_StereoMode_SideBySide:
+        {
+          aMode = "sideBySide";
+          break;
+        }
+        case Graphic3d_StereoMode_OverUnder:
+        {
+          aMode = "overUnder";
+          break;
+        }
+        case Graphic3d_StereoMode_SoftPageFlip:
+        {
+          aMode = "softPageFlip";
+          break;
+        }
+        case Graphic3d_StereoMode_OpenVR:
+        {
+          aMode = "openVR";
+          break;
+        }
+        case Graphic3d_StereoMode_Anaglyph:
+        {
           aMode = "anaglyph";
           switch (aView->RenderingParams().AnaglyphFilter)
           {
@@ -9390,9 +9471,9 @@ static int VStereo (Draw_Interpretor& theDI,
             case Graphic3d_RenderingParams::Anaglyph_YellowBlue_Simple   : aMode.AssignCat (" (yellowBlueSimple)");   break;
             case Graphic3d_RenderingParams::Anaglyph_YellowBlue_Optimized: aMode.AssignCat (" (yellowBlue)");         break;
             case Graphic3d_RenderingParams::Anaglyph_GreenMagenta_Simple : aMode.AssignCat (" (greenMagentaSimple)"); break;
-            default: break;
+            case Graphic3d_RenderingParams::Anaglyph_UserDefined         : aMode.AssignCat (" (userDefined)");        break;
           }
-        default: break;
+        }
       }
       theDI << "Mode " << aMode << "\n";
     }
@@ -9441,27 +9522,12 @@ static int VStereo (Draw_Interpretor& theDI,
       }
     }
     else if (aFlag == "-reverse"
+          || aFlag == "-noreverse"
           || aFlag == "-reversed"
-          || aFlag == "-swap")
-    {
-      Standard_Boolean toEnable = Standard_True;
-      if (++anArgIter < theArgNb
-      && !Draw::ParseOnOff (theArgVec[anArgIter], toEnable))
-      {
-        --anArgIter;
-      }
-      aParams->ToReverseStereo = toEnable;
-    }
-    else if (aFlag == "-noreverse"
+          || aFlag == "-swap"
           || aFlag == "-noswap")
     {
-      Standard_Boolean toDisable = Standard_True;
-      if (++anArgIter < theArgNb
-      && !Draw::ParseOnOff (theArgVec[anArgIter], toDisable))
-      {
-        --anArgIter;
-      }
-      aParams->ToReverseStereo = !toDisable;
+      aParams->ToReverseStereo = Draw::ParseOnOffNoIterator (theArgNb, theArgVec, anArgIter);
     }
     else if (aFlag == "-mode"
           || aFlag == "-stereomode")
@@ -9513,13 +9579,14 @@ static int VStereo (Draw_Interpretor& theDI,
     else if (aFlag == "-mirror"
           || aFlag == "-mirrorcomposer")
     {
-      Standard_Boolean toEnable = Standard_True;
-      if (++anArgIter < theArgNb
-      && !Draw::ParseOnOff (theArgVec[anArgIter], toEnable))
-      {
-        --anArgIter;
-      }
-      aParams->ToMirrorComposer = toEnable;
+      aParams->ToMirrorComposer = Draw::ParseOnOffNoIterator (theArgNb, theArgVec, anArgIter);;
+    }
+    else if (aFlag == "-smooth"
+          || aFlag == "-nosmooth"
+          || aFlag == "-smoothinterlacing"
+          || aFlag == "-nosmoothinterlacing")
+    {
+      aParams->ToSmoothInterlacing = Draw::ParseOnOffNoIterator (theArgNb, theArgVec, anArgIter);
     }
     else if (anArgIter + 1 < theArgNb
           && (aFlag == "-unitfactor"
@@ -13735,7 +13802,7 @@ Makes specified driver active when ActiveName argument is specified.
   addCmd ("vinit", VInit, /* [vinit] */ R"(
 vinit [-name viewName] [-left leftPx] [-top topPx] [-width widthPx] [-height heightPx]
       [-exitOnClose] [-closeOnEscape] [-cloneActive] [-virtual {on|off}=off] [-2d_mode {on|off}=off]
-      [-display displayName]
+      [-display displayName] [-dpiAware {on|off}]
 Creates new View window with specified name viewName.
 By default the new view is created in the viewer and in graphic driver shared with active view.
  -name {driverName/viewerName/viewName | viewerName/viewName | viewName}
@@ -13751,6 +13818,7 @@ Display name will be used within creation of graphic driver, when specified.
  -closeOnEscape when specified, view will be closed on pressing Escape.
  -virtual create an offscreen window within interactive session
  -2d_mode when on, view will not react on rotate scene events
+ -dpiAware override dpi aware hint (Windows platform)
 Additional commands for operations with views: vclose, vactivate, vviewlist.
 )" /* [vinit] */);
 
@@ -14061,7 +14129,7 @@ vfps [framesNb=100] [-duration seconds] : estimate average frame rate for active
   addCmd ("vstereo", VStereo, /* [vstereo] */ R"(
 vstereo [0|1] [-mode Mode] [-reverse {0|1}]
         [-mirrorComposer] [-hmdfov2d AngleDegrees] [-unitFactor MetersFactor]
-        [-anaglyph Filter]
+        [-anaglyph Filter] [-smoothInterlacing]
 Control stereo output mode. Available modes for -mode:
   quadBuffer       OpenGL QuadBuffer stereo;
     requires driver support;
@@ -14069,6 +14137,7 @@ Control stereo output mode. Available modes for -mode:
   anaglyph         Anaglyph glasses, filters for -anaglyph:
     redCyan, redCyanSimple, yellowBlue, yellowBlueSimple, greenMagentaSimple.
   rowInterlaced    row-interlaced display
+    smooth         smooth interlaced output for better text readability
   columnInterlaced column-interlaced display
   chessBoard       chess-board output
   sideBySide       horizontal pair
index 493b8dd80f6073c41d07c84c0dcb1ed4394266f6..19ad87e2abf2b9f847b1315949efd6f0ba17ff92 100644 (file)
@@ -18,15 +18,24 @@ vstereo -mode anaglyph
 vfit
 vdump $::imagedir/${::casename}_anaglyph.png -stereo blend
 
-vstereo -mode columnInterlaced
+vstereo -mode columnInterlaced -smooth 0
 vdump $::imagedir/${::casename}_col.png -stereo blend
 
-vstereo -mode chessBoard
+vstereo -mode columnInterlaced -smooth 1
+vdump $::imagedir/${::casename}_col_smooth.png -stereo blend
+
+vstereo -mode chessBoard -smooth 0
 vdump $::imagedir/${::casename}_chess.png -stereo blend
 
-vstereo -mode rowInterlaced
+vstereo -mode chessBoard -smooth 1
+vdump $::imagedir/${::casename}_chess_smooth.png -stereo blend
+
+vstereo -mode rowInterlaced -smooth 0
 vdump $::imagedir/${::casename}_row.png -stereo blend
 
+vstereo -mode rowInterlaced -smooth 1
+vdump $::imagedir/${::casename}_row_smooth.png -stereo blend
+
 vstereo -mode sideBySide
 vdump $::imagedir/${::casename}_sbs_anamorph.png -stereo blend