1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-07-30 13:05:50 +03:00

0025304: Visualization, TKOpenGl - support texturing within built-in GLSL programs

This commit is contained in:
kgv 2014-11-25 08:52:08 +03:00 committed by bugmaster
parent abdf0b107e
commit 6c6aadb1ff
2 changed files with 99 additions and 8 deletions

View File

@ -24,6 +24,7 @@
#include <OpenGl_Structure.hxx> #include <OpenGl_Structure.hxx>
#include <OpenGl_VertexBufferCompat.hxx> #include <OpenGl_VertexBufferCompat.hxx>
#include <OpenGl_Workspace.hxx> #include <OpenGl_Workspace.hxx>
#include <Graphic3d_TextureParams.hxx>
namespace namespace
{ {
@ -796,7 +797,10 @@ void OpenGl_PrimitiveArray::Render (const Handle(OpenGl_Workspace)& theWorkspace
} }
default: 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; break;
} }
} }

View File

@ -36,6 +36,13 @@ namespace
#define EOL "\n" #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 //! Auxiliary function to transform normal
const char THE_FUNC_transformNormal[] = const char THE_FUNC_transformNormal[] =
EOL"vec3 transformNormal (in vec3 theNormal)" EOL"vec3 transformNormal (in vec3 theNormal)"
@ -1060,11 +1067,24 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFlat (Handle(OpenGl_Shad
EOL" gl_FragColor = aColor;"; 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) if ((theBits & OpenGl_PO_VertColor) != 0)
{ {
aSrcVertExtraOut += EOL"varying vec4 VertColor;"; aSrcVertExtraOut += THE_VARY_VertColor;
aSrcVertExtraMain += EOL" VertColor = occVertColor;"; aSrcVertExtraMain += EOL" VertColor = occVertColor;";
aSrcFragExtraOut += EOL"varying vec4 VertColor;"; aSrcFragExtraOut += THE_VARY_VertColor;
aSrcFragGetColor = EOL"vec4 getColor(void) { return VertColor; }"; aSrcFragGetColor = EOL"vec4 getColor(void) { return VertColor; }";
} }
if ((theBits & OpenGl_PO_ClipPlanes) != 0) 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(); Handle(Graphic3d_ShaderProgram) aProgramSrc = new Graphic3d_ShaderProgram();
TCollection_AsciiString aSrcVert, aSrcVertColor, aSrcVertExtraOut, aSrcVertExtraMain, aSrcFrag, aSrcFragExtraOut, aSrcFragExtraMain; 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 ((theBits & OpenGl_PO_Point) != 0)
{ {
#if defined(GL_ES_VERSION_2_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; }"; 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) if ((theBits & OpenGl_PO_ClipPlanes) != 0)
{ {
const char THE_POS_VARY[] = const char THE_POS_VARY[] =
@ -1250,10 +1300,11 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramGouraud (Handle(OpenGl_S
+ EOL"varying vec4 FrontColor;" + EOL"varying vec4 FrontColor;"
EOL"varying vec4 BackColor;" EOL"varying vec4 BackColor;"
+ aSrcFragExtraOut + aSrcFragExtraOut
+ aSrcFragGetColor
+ EOL"void main()" + EOL"void main()"
EOL"{" EOL"{"
+ aSrcFragExtraMain + aSrcFragExtraMain
+ EOL" gl_FragColor = gl_FrontFacing ? FrontColor : BackColor;" + EOL" gl_FragColor = getColor();"
EOL"}"; EOL"}";
aProgramSrc->AttachShader (Graphic3d_ShaderObject::CreateFromSource (Graphic3d_TOS_VERTEX, aSrcVert)); 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, Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_ShaderProgram)& theProgram,
const Standard_Integer theBits) const Standard_Integer theBits)
{ {
#define thePhongCompLight "computeLighting (normalize (Normal), normalize (View), Position, gl_FrontFacing)"
Handle(Graphic3d_ShaderProgram) aProgramSrc = new Graphic3d_ShaderProgram(); 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 ((theBits & OpenGl_PO_Point) != 0)
{ {
#if defined(GL_ES_VERSION_2_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) if ((theBits & OpenGl_PO_VertColor) != 0)
{ {
aSrcVertExtraOut += EOL"varying vec4 VertColor;"; aSrcVertExtraOut += THE_VARY_VertColor;
aSrcVertExtraMain += EOL" VertColor = occVertColor;"; aSrcVertExtraMain += EOL" VertColor = occVertColor;";
aSrcFragGetColor = EOL"varying vec4 VertColor;" aSrcFragGetColor = EOL"varying vec4 VertColor;"
EOL"vec4 getVertColor(void) { return 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) if ((theBits & OpenGl_PO_ClipPlanes) != 0)
{ {
aSrcFragExtraMain += THE_FRAG_CLIP_PLANES; aSrcFragExtraMain += THE_FRAG_CLIP_PLANES;
@ -1320,13 +1405,15 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_Sha
EOL"varying vec3 Normal;" EOL"varying vec3 Normal;"
EOL"varying vec3 View;" EOL"varying vec3 View;"
+ EOL + EOL
+ aSrcFragGetColor + aSrcFragExtraOut
+ aSrcFragGetVertColor
+ aLights + aLights
+ aSrcFragGetColor
+ EOL + EOL
EOL"void main()" EOL"void main()"
EOL"{" EOL"{"
+ aSrcFragExtraMain + aSrcFragExtraMain
+ EOL" gl_FragColor = computeLighting (normalize (Normal), normalize (View), Position, gl_FrontFacing);" + EOL" gl_FragColor = getColor();"
EOL"}"; EOL"}";
aProgramSrc->AttachShader (Graphic3d_ShaderObject::CreateFromSource (Graphic3d_TOS_VERTEX, aSrcVert)); aProgramSrc->AttachShader (Graphic3d_ShaderObject::CreateFromSource (Graphic3d_TOS_VERTEX, aSrcVert));