From: kgv Date: Tue, 25 Nov 2014 05:52:08 +0000 (+0300) Subject: 0025304: Visualization, TKOpenGl - support texturing within built-in GLSL programs X-Git-Tag: V6_9_0_beta~268 X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=6c6aadb1ffc7d249776e9c53f54a8bcef09a1c2a;p=occt.git 0025304: Visualization, TKOpenGl - support texturing within built-in GLSL programs --- diff --git a/src/OpenGl/OpenGl_PrimitiveArray.cxx b/src/OpenGl/OpenGl_PrimitiveArray.cxx index 6a479237bf..593fe500e8 100755 --- a/src/OpenGl/OpenGl_PrimitiveArray.cxx +++ b/src/OpenGl/OpenGl_PrimitiveArray.cxx @@ -24,6 +24,7 @@ #include #include #include +#include namespace { @@ -796,7 +797,10 @@ void OpenGl_PrimitiveArray::Render (const Handle(OpenGl_Workspace)& theWorkspace } default: { - aCtx->ShaderManager()->BindProgram (anAspectFace, theWorkspace->ActiveTexture(), isLightOn, hasVertColor, anAspectFace->ShaderProgramRes (aCtx)); + const Standard_Boolean isLightOnFace = isLightOn + && (theWorkspace->ActiveTexture().IsNull() + || theWorkspace->ActiveTexture()->GetParams()->IsModulate()); + aCtx->ShaderManager()->BindProgram (anAspectFace, theWorkspace->ActiveTexture(), isLightOnFace, hasVertColor, anAspectFace->ShaderProgramRes (aCtx)); break; } } diff --git a/src/OpenGl/OpenGl_ShaderManager.cxx b/src/OpenGl/OpenGl_ShaderManager.cxx index e0ad71766b..890d85b7d0 100644 --- a/src/OpenGl/OpenGl_ShaderManager.cxx +++ b/src/OpenGl/OpenGl_ShaderManager.cxx @@ -36,6 +36,13 @@ namespace #define EOL "\n" +//! Definition of VertColor varying. +const char THE_VARY_VertColor[] = + EOL"varying vec4 VertColor;"; + +const char THE_VARY_TexCoord[] = + EOL"varying vec2 TexCoord;"; + //! Auxiliary function to transform normal const char THE_FUNC_transformNormal[] = EOL"vec3 transformNormal (in vec3 theNormal)" @@ -1060,11 +1067,24 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFlat (Handle(OpenGl_Shad EOL" gl_FragColor = aColor;"; } } + else + { + if ((theBits & OpenGl_PO_TextureRGB) != 0) + { + aSrcVertExtraOut += THE_VARY_TexCoord; + aSrcFragExtraOut += THE_VARY_TexCoord; + aSrcVertExtraMain += + EOL" TexCoord = occTexCoord.st;"; + + aSrcFragGetColor = + EOL"vec4 getColor(void) { return texture2D(occActiveSampler, TexCoord.st); }"; + } + } if ((theBits & OpenGl_PO_VertColor) != 0) { - aSrcVertExtraOut += EOL"varying vec4 VertColor;"; + aSrcVertExtraOut += THE_VARY_VertColor; aSrcVertExtraMain += EOL" VertColor = occVertColor;"; - aSrcFragExtraOut += EOL"varying vec4 VertColor;"; + aSrcFragExtraOut += THE_VARY_VertColor; aSrcFragGetColor = EOL"vec4 getColor(void) { return VertColor; }"; } if ((theBits & OpenGl_PO_ClipPlanes) != 0) @@ -1199,6 +1219,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramGouraud (Handle(OpenGl_S { Handle(Graphic3d_ShaderProgram) aProgramSrc = new Graphic3d_ShaderProgram(); TCollection_AsciiString aSrcVert, aSrcVertColor, aSrcVertExtraOut, aSrcVertExtraMain, aSrcFrag, aSrcFragExtraOut, aSrcFragExtraMain; + TCollection_AsciiString aSrcFragGetColor = EOL"vec4 getColor(void) { return gl_FrontFacing ? FrontColor : BackColor; }"; if ((theBits & OpenGl_PO_Point) != 0) { #if defined(GL_ES_VERSION_2_0) @@ -1209,6 +1230,35 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramGouraud (Handle(OpenGl_S { aSrcVertColor = EOL"vec4 getVertColor(void) { return occVertColor; }"; } + if ((theBits & OpenGl_PO_Point) != 0) + { + if ((theBits & OpenGl_PO_TextureRGB) != 0) + { + aSrcFragGetColor = + EOL"vec4 getColor(void)" + EOL"{" + EOL" vec4 aColor = gl_FrontFacing ? FrontColor : BackColor;" + EOL" return texture2D(occActiveSampler, gl_PointCoord) * aColor;" + EOL"}"; + } + } + else + { + if ((theBits & OpenGl_PO_TextureRGB) != 0) + { + aSrcVertExtraOut += THE_VARY_TexCoord; + aSrcFragExtraOut += THE_VARY_TexCoord; + aSrcVertExtraMain += + EOL" TexCoord = occTexCoord.st;"; + + aSrcFragGetColor = + EOL"vec4 getColor(void)" + EOL"{" + EOL" vec4 aColor = gl_FrontFacing ? FrontColor : BackColor;" + EOL" return texture2D(occActiveSampler, TexCoord.st) * aColor;" + EOL"}"; + } + } if ((theBits & OpenGl_PO_ClipPlanes) != 0) { const char THE_POS_VARY[] = @@ -1250,10 +1300,11 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramGouraud (Handle(OpenGl_S + EOL"varying vec4 FrontColor;" EOL"varying vec4 BackColor;" + aSrcFragExtraOut + + aSrcFragGetColor + EOL"void main()" EOL"{" + aSrcFragExtraMain - + EOL" gl_FragColor = gl_FrontFacing ? FrontColor : BackColor;" + + EOL" gl_FragColor = getColor();" EOL"}"; aProgramSrc->AttachShader (Graphic3d_ShaderObject::CreateFromSource (Graphic3d_TOS_VERTEX, aSrcVert)); @@ -1274,8 +1325,11 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramGouraud (Handle(OpenGl_S Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_ShaderProgram)& theProgram, const Standard_Integer theBits) { + #define thePhongCompLight "computeLighting (normalize (Normal), normalize (View), Position, gl_FrontFacing)" + Handle(Graphic3d_ShaderProgram) aProgramSrc = new Graphic3d_ShaderProgram(); - TCollection_AsciiString aSrcVert, aSrcVertExtraOut, aSrcVertExtraMain, aSrcFrag, aSrcFragGetColor, aSrcFragExtraMain; + TCollection_AsciiString aSrcVert, aSrcVertExtraOut, aSrcVertExtraMain, aSrcFrag, aSrcFragExtraOut, aSrcFragGetVertColor, aSrcFragExtraMain; + TCollection_AsciiString aSrcFragGetColor = EOL"vec4 getColor(void) { return " thePhongCompLight "; }"; if ((theBits & OpenGl_PO_Point) != 0) { #if defined(GL_ES_VERSION_2_0) @@ -1284,11 +1338,42 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_Sha } if ((theBits & OpenGl_PO_VertColor) != 0) { - aSrcVertExtraOut += EOL"varying vec4 VertColor;"; + aSrcVertExtraOut += THE_VARY_VertColor; aSrcVertExtraMain += EOL" VertColor = occVertColor;"; aSrcFragGetColor = EOL"varying vec4 VertColor;" EOL"vec4 getVertColor(void) { return VertColor; }"; } + + if ((theBits & OpenGl_PO_Point) != 0) + { + if ((theBits & OpenGl_PO_TextureRGB) != 0) + { + aSrcFragGetColor = + EOL"vec4 getColor(void)" + EOL"{" + EOL" vec4 aColor = " thePhongCompLight ";" + EOL" return texture2D(occActiveSampler, gl_PointCoord) * aColor;" + EOL"}"; + } + } + else + { + if ((theBits & OpenGl_PO_TextureRGB) != 0) + { + aSrcVertExtraOut += THE_VARY_TexCoord; + aSrcFragExtraOut += THE_VARY_TexCoord; + aSrcVertExtraMain += + EOL" TexCoord = occTexCoord.st;"; + + aSrcFragGetColor = + EOL"vec4 getColor(void)" + EOL"{" + EOL" vec4 aColor = " thePhongCompLight ";" + EOL" return texture2D(occActiveSampler, TexCoord.st) * aColor;" + EOL"}"; + } + } + if ((theBits & OpenGl_PO_ClipPlanes) != 0) { aSrcFragExtraMain += THE_FRAG_CLIP_PLANES; @@ -1320,13 +1405,15 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_Sha EOL"varying vec3 Normal;" EOL"varying vec3 View;" + EOL - + aSrcFragGetColor + + aSrcFragExtraOut + + aSrcFragGetVertColor + aLights + + aSrcFragGetColor + EOL EOL"void main()" EOL"{" + aSrcFragExtraMain - + EOL" gl_FragColor = computeLighting (normalize (Normal), normalize (View), Position, gl_FrontFacing);" + + EOL" gl_FragColor = getColor();" EOL"}"; aProgramSrc->AttachShader (Graphic3d_ShaderObject::CreateFromSource (Graphic3d_TOS_VERTEX, aSrcVert));