From abdf0b107ef8761a2c84fdff1ad8508aa3d792c6 Mon Sep 17 00:00:00 2001 From: kgv Date: Sun, 23 Nov 2014 17:29:38 +0300 Subject: [PATCH] 0025474: Visualization, TKOpenGl - support lighting + colored vertices within built-in GLSL programs --- src/OpenGl/OpenGl_ShaderManager.cxx | 37 ++++++++++++++++++++++------- src/OpenGl/OpenGl_ShaderManager.hxx | 3 ++- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/OpenGl/OpenGl_ShaderManager.cxx b/src/OpenGl/OpenGl_ShaderManager.cxx index 0298b497ec..e0ad71766b 100644 --- a/src/OpenGl/OpenGl_ShaderManager.cxx +++ b/src/OpenGl/OpenGl_ShaderManager.cxx @@ -1114,7 +1114,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFlat (Handle(OpenGl_Shad // function : stdComputeLighting // purpose : // ======================================================================= -TCollection_AsciiString OpenGl_ShaderManager::stdComputeLighting() +TCollection_AsciiString OpenGl_ShaderManager::stdComputeLighting (const Standard_Boolean theHasVertColor) { bool aLightsMap[Visual3d_TOLS_SPOT + 1] = { false, false, false, false }; TCollection_AsciiString aLightsFunc, aLightsLoop; @@ -1157,6 +1157,14 @@ TCollection_AsciiString OpenGl_ShaderManager::stdComputeLighting() } } + TCollection_AsciiString aGetMatAmbient = "theIsFront ? occFrontMaterial_Ambient() : occBackMaterial_Ambient();"; + TCollection_AsciiString aGetMatDiffuse = "theIsFront ? occFrontMaterial_Diffuse() : occBackMaterial_Diffuse();"; + if (theHasVertColor) + { + aGetMatAmbient = "getVertColor();"; + aGetMatDiffuse = "getVertColor();"; + } + return TCollection_AsciiString() + THE_FUNC_lightDef + aLightsFunc @@ -1171,9 +1179,9 @@ TCollection_AsciiString OpenGl_ShaderManager::stdComputeLighting() EOL" Specular = vec3 (0.0);" EOL" vec3 aPoint = thePoint.xyz / thePoint.w;" + aLightsLoop - + EOL" vec4 aMaterialAmbient = theIsFront ? occFrontMaterial_Ambient() : occBackMaterial_Ambient();" - EOL" vec4 aMaterialDiffuse = theIsFront ? occFrontMaterial_Diffuse() : occBackMaterial_Diffuse();" - EOL" vec4 aMaterialSpecular = theIsFront ? occFrontMaterial_Specular() : occBackMaterial_Specular();" + + EOL" vec4 aMaterialAmbient = " + aGetMatAmbient + + EOL" vec4 aMaterialDiffuse = " + aGetMatDiffuse + + EOL" vec4 aMaterialSpecular = theIsFront ? occFrontMaterial_Specular() : occBackMaterial_Specular();" EOL" vec4 aMaterialEmission = theIsFront ? occFrontMaterial_Emission() : occBackMaterial_Emission();" EOL" return vec4 (Ambient, 1.0) * aMaterialAmbient" EOL" + vec4 (Diffuse, 1.0) * aMaterialDiffuse" @@ -1190,13 +1198,17 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramGouraud (Handle(OpenGl_S const Standard_Integer theBits) { Handle(Graphic3d_ShaderProgram) aProgramSrc = new Graphic3d_ShaderProgram(); - TCollection_AsciiString aSrcVert, aSrcVertExtraOut, aSrcVertExtraMain, aSrcFrag, aSrcFragExtraOut, aSrcFragExtraMain; + TCollection_AsciiString aSrcVert, aSrcVertColor, aSrcVertExtraOut, aSrcVertExtraMain, aSrcFrag, aSrcFragExtraOut, aSrcFragExtraMain; if ((theBits & OpenGl_PO_Point) != 0) { #if defined(GL_ES_VERSION_2_0) aSrcVertExtraMain += EOL" gl_PointSize = occPointSize;"; #endif } + if ((theBits & OpenGl_PO_VertColor) != 0) + { + aSrcVertColor = EOL"vec4 getVertColor(void) { return occVertColor; }"; + } if ((theBits & OpenGl_PO_ClipPlanes) != 0) { const char THE_POS_VARY[] = @@ -1211,10 +1223,11 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramGouraud (Handle(OpenGl_S aSrcFragExtraMain += THE_FRAG_CLIP_PLANES; } - const TCollection_AsciiString aLights = stdComputeLighting(); + const TCollection_AsciiString aLights = stdComputeLighting ((theBits & OpenGl_PO_VertColor) != 0); aSrcVert = TCollection_AsciiString() + THE_FUNC_transformNormal + EOL + + aSrcVertColor + aLights + EOL EOL"varying vec4 FrontColor;" @@ -1262,13 +1275,20 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_Sha const Standard_Integer theBits) { Handle(Graphic3d_ShaderProgram) aProgramSrc = new Graphic3d_ShaderProgram(); - TCollection_AsciiString aSrcVert, aSrcVertExtraOut, aSrcVertExtraMain, aSrcFrag, aSrcFragExtraMain; + TCollection_AsciiString aSrcVert, aSrcVertExtraOut, aSrcVertExtraMain, aSrcFrag, aSrcFragGetColor, aSrcFragExtraMain; if ((theBits & OpenGl_PO_Point) != 0) { #if defined(GL_ES_VERSION_2_0) aSrcVertExtraMain += EOL" gl_PointSize = occPointSize;"; #endif } + if ((theBits & OpenGl_PO_VertColor) != 0) + { + aSrcVertExtraOut += EOL"varying vec4 VertColor;"; + aSrcVertExtraMain += EOL" VertColor = occVertColor;"; + aSrcFragGetColor = EOL"varying vec4 VertColor;" + EOL"vec4 getVertColor(void) { return VertColor; }"; + } if ((theBits & OpenGl_PO_ClipPlanes) != 0) { aSrcFragExtraMain += THE_FRAG_CLIP_PLANES; @@ -1293,13 +1313,14 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_Sha + EOL" gl_Position = occProjectionMatrix * occWorldViewMatrix * occModelWorldMatrix * occVertex;" EOL"}"; - const TCollection_AsciiString aLights = stdComputeLighting(); + const TCollection_AsciiString aLights = stdComputeLighting ((theBits & OpenGl_PO_VertColor) != 0); aSrcFrag = TCollection_AsciiString() + EOL"varying vec4 PositionWorld;" EOL"varying vec4 Position;" EOL"varying vec3 Normal;" EOL"varying vec3 View;" + EOL + + aSrcFragGetColor + aLights + EOL EOL"void main()" diff --git a/src/OpenGl/OpenGl_ShaderManager.hxx b/src/OpenGl/OpenGl_ShaderManager.hxx index 3d2be8cf8f..d4ab02ce46 100644 --- a/src/OpenGl/OpenGl_ShaderManager.hxx +++ b/src/OpenGl/OpenGl_ShaderManager.hxx @@ -314,7 +314,8 @@ protected: const Standard_Integer theBits); //! Define computeLighting GLSL function depending on current lights configuration - Standard_EXPORT TCollection_AsciiString stdComputeLighting(); + //! @param theHasVertColor flag to use getVertColor() instead of Ambient and Diffuse components of active material + Standard_EXPORT TCollection_AsciiString stdComputeLighting (const Standard_Boolean theHasVertColor); //! Bind specified program to current context and apply state. Standard_EXPORT Standard_Boolean bindProgramWithState (const Handle(OpenGl_ShaderProgram)& theProgram,