+ TCollection_AsciiString aSrcFrag;
+ switch (theStereoMode)
+ {
+ case Graphic3d_StereoMode_Anaglyph:
+ {
+ aSrcFrag =
+ EOL"uniform sampler2D uLeftSampler;"
+ EOL"uniform sampler2D uRightSampler;"
+ EOL
+ EOL"uniform mat4 uMultL;"
+ EOL"uniform mat4 uMultR;"
+ EOL
+ EOL"vec4 THE_POW_UP = vec4 (2.2, 2.2, 2.2, 1.0);"
+ EOL"vec4 THE_POW_DOWN = 1.0 / THE_POW_UP;"
+ EOL
+ EOL"THE_SHADER_IN vec2 TexCoord;"
+ EOL
+ EOL"void main()"
+ EOL"{"
+ EOL" vec4 aColorL = occTexture2D (uLeftSampler, TexCoord);"
+ EOL" vec4 aColorR = occTexture2D (uRightSampler, TexCoord);"
+ 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"}";
+ break;
+ }
+ case Graphic3d_StereoMode_RowInterlaced:
+ {
+ aSrcFrag =
+ EOL"uniform sampler2D uLeftSampler;"
+ EOL"uniform sampler2D uRightSampler;"
+ EOL
+ EOL"THE_SHADER_IN vec2 TexCoord;"
+ EOL
+ EOL"void main()"
+ EOL"{"
+ EOL" vec4 aColorL = occTexture2D (uLeftSampler, TexCoord);"
+ EOL" vec4 aColorR = occTexture2D (uRightSampler, TexCoord);"
+ EOL" if (int (mod (gl_FragCoord.y + 1.5, 2.0)) == 1)"
+ EOL" {"
+ EOL" occFragColor = aColorL;"
+ EOL" }"
+ EOL" else"
+ EOL" {"
+ EOL" occFragColor = aColorR;"
+ EOL" }"
+ EOL"}";
+ break;
+ }
+ case Graphic3d_StereoMode_ColumnInterlaced:
+ {
+ aSrcFrag =
+ EOL"uniform sampler2D uLeftSampler;"
+ EOL"uniform sampler2D uRightSampler;"
+ EOL
+ EOL"THE_SHADER_IN vec2 TexCoord;"
+ EOL
+ EOL"void main()"
+ EOL"{"
+ EOL" vec4 aColorL = occTexture2D (uLeftSampler, TexCoord);"
+ EOL" vec4 aColorR = occTexture2D (uRightSampler, TexCoord);"
+ EOL" if (int (mod (gl_FragCoord.x + 1.5, 2.0)) != 1)"
+ EOL" {"
+ EOL" occFragColor = aColorL;"
+ EOL" }"
+ EOL" else"
+ EOL" {"
+ EOL" occFragColor = aColorR;"
+ EOL" }"
+ EOL"}";
+ break;
+ }
+ case Graphic3d_StereoMode_ChessBoard:
+ {
+ aSrcFrag =
+ EOL"uniform sampler2D uLeftSampler;"
+ EOL"uniform sampler2D uRightSampler;"
+ EOL
+ EOL"THE_SHADER_IN vec2 TexCoord;"
+ EOL
+ EOL"void main()"
+ EOL"{"
+ EOL" vec4 aColorL = occTexture2D (uLeftSampler, TexCoord);"
+ EOL" vec4 aColorR = occTexture2D (uRightSampler, TexCoord);"
+ EOL" bool isEvenX = int(mod(floor(gl_FragCoord.x + 1.5), 2.0)) == 1;"
+ EOL" bool isEvenY = int(mod(floor(gl_FragCoord.y + 1.5), 2.0)) != 1;"
+ EOL" if ((isEvenX && isEvenY) || (!isEvenX && !isEvenY))"
+ EOL" {"
+ EOL" occFragColor = aColorL;"
+ EOL" }"
+ EOL" else"
+ EOL" {"
+ EOL" occFragColor = aColorR;"
+ EOL" }"
+ EOL"}";
+ break;
+ }
+ case Graphic3d_StereoMode_SideBySide:
+ {
+ aSrcFrag =
+ EOL"uniform sampler2D uLeftSampler;"
+ EOL"uniform sampler2D uRightSampler;"
+ EOL
+ EOL"THE_SHADER_IN vec2 TexCoord;"
+ EOL
+ EOL"void main()"
+ EOL"{"
+ EOL" vec2 aTexCoord = vec2 (TexCoord.x * 2.0, TexCoord.y);"
+ EOL" if (TexCoord.x > 0.5)"
+ EOL" {"
+ EOL" aTexCoord.x -= 1.0;"
+ EOL" }"
+ EOL" vec4 aColorL = occTexture2D (uLeftSampler, aTexCoord);"
+ EOL" vec4 aColorR = occTexture2D (uRightSampler, aTexCoord);"
+ EOL" if (TexCoord.x <= 0.5)"
+ EOL" {"
+ EOL" occFragColor = aColorL;"
+ EOL" }"
+ EOL" else"
+ EOL" {"
+ EOL" occFragColor = aColorR;"
+ EOL" }"
+ EOL"}";
+ break;
+ }
+ case Graphic3d_StereoMode_OverUnder:
+ {
+ aSrcFrag =
+ EOL"uniform sampler2D uLeftSampler;"
+ EOL"uniform sampler2D uRightSampler;"
+ EOL
+ EOL"THE_SHADER_IN vec2 TexCoord;"
+ EOL
+ EOL"void main()"
+ EOL"{"
+ EOL" vec2 aTexCoord = vec2 (TexCoord.x, TexCoord.y * 2.0);"
+ EOL" if (TexCoord.y > 0.5)"
+ EOL" {"
+ EOL" aTexCoord.y -= 1.0;"
+ EOL" }"
+ EOL" vec4 aColorL = occTexture2D (uLeftSampler, aTexCoord);"
+ EOL" vec4 aColorR = occTexture2D (uRightSampler, aTexCoord);"
+ EOL" if (TexCoord.y <= 0.5)"
+ EOL" {"
+ EOL" occFragColor = aColorL;"
+ EOL" }"
+ EOL" else"
+ EOL" {"
+ EOL" occFragColor = aColorR;"
+ EOL" }"
+ EOL"}";
+ break;
+ }
+ case Graphic3d_StereoMode_QuadBuffer:
+ case Graphic3d_StereoMode_SoftPageFlip:
+ default:
+ {
+ /*const Handle(OpenGl_ShaderProgram)& aProgram = myStereoPrograms[Graphic3d_StereoMode_QuadBuffer];
+ if (!aProgram.IsNull())
+ {
+ return aProgram->IsValid();
+ }*/
+ aSrcFrag =
+ EOL"uniform sampler2D uLeftSampler;"
+ EOL"uniform sampler2D uRightSampler;"
+ EOL
+ EOL"THE_SHADER_IN vec2 TexCoord;"
+ EOL
+ EOL"void main()"
+ EOL"{"
+ EOL" vec4 aColorL = occTexture2D (uLeftSampler, TexCoord);"
+ EOL" vec4 aColorR = occTexture2D (uRightSampler, TexCoord);"
+ EOL" aColorL.b = 0.0;"
+ EOL" aColorL.g = 0.0;"
+ EOL" aColorR.r = 0.0;"
+ EOL" occFragColor = aColorL + aColorR;"
+ EOL"}";
+ break;
+ }
+ }