diff --git a/src/osgText/Font.cpp b/src/osgText/Font.cpp index e1d15f885..2a7415fdf 100644 --- a/src/osgText/Font.cpp +++ b/src/osgText/Font.cpp @@ -35,13 +35,17 @@ using namespace std; static osg::ApplicationUsageProxy Font_e0(osg::ApplicationUsage::ENVIRONMENTAL_VARIABLE,"OSG_TEXT_INCREMENTAL_SUBLOADING ","ON | OFF"); #define FIXED_FUNCTION defined(OSG_GL_FIXED_FUNCTION_AVAILABLE) -#define SHADERS_GL3 (defined(OSG_GL3_AVAILABLE) || defined(OSG_GLES3_AVAILABLE)) +#define SHADERS_GL3 (defined(OSG_GL3_AVAILABLE)) #define SHADERS_GL2 !FIXED_FUNCTION && !SHADERS_GL3 #if SHADERS_GL3 static const char* gl3_TextVertexShader = { "#version 330 core\n" + "// gl3_TextVertexShader\n" + "#ifdef GL_ES\n" + " precision highp float;\n" + "#endif\n" "in vec4 osg_Vertex;\n" "in vec4 osg_Color;\n" "in vec4 osg_MultiTexCoord0;\n" @@ -58,6 +62,10 @@ static const char* gl3_TextVertexShader = { static const char* gl3_TextFragmentShader = { "#version 330 core\n" + "// gl3_TextFragmentShader\n" + "#ifdef GL_ES\n" + " precision highp float;\n" + "#endif\n" "uniform sampler2D glyphTexture;\n" "in vec2 texCoord;\n" "in vec4 vertexColor;\n" @@ -74,6 +82,10 @@ static const char* gl3_TextFragmentShader = { #if SHADERS_GL2 static const char* gl2_TextVertexShader = { + "// gl2_TextVertexShader\n" + "#ifdef GL_ES\n" + " precision highp float;\n" + "#endif\n" "varying vec2 texCoord;\n" "varying vec4 vertexColor;\n" "void main(void)\n" @@ -85,6 +97,10 @@ static const char* gl2_TextVertexShader = { }; static const char* gl2_TextFragmentShader = { + "// gl2_TextFragmentShader\n" + "#ifdef GL_ES\n" + " precision highp float;\n" + "#endif\n" "uniform sampler2D glyphTexture;\n" "varying vec2 texCoord;\n" "varying vec4 vertexColor;\n" diff --git a/src/osgUtil/ShaderGen.cpp b/src/osgUtil/ShaderGen.cpp index 41f90e462..4fb248e6d 100644 --- a/src/osgUtil/ShaderGen.cpp +++ b/src/osgUtil/ShaderGen.cpp @@ -116,27 +116,37 @@ osg::StateSet *ShaderGenCache::createStateSet(int stateMask) const osg::Program *program = new osg::Program; stateSet->setAttribute(program); - std::ostringstream vert; - std::ostringstream frag; + std::ostringstream vert_frag; + + vert_frag << "// ShaderGen shader\n"; + vert_frag << "#ifdef GL_ES\n" + " precision highp float;\n" + "#endif\n"; // write varyings if ((stateMask & LIGHTING) && !(stateMask & NORMAL_MAP)) { - vert << "varying vec3 normalDir;\n"; + vert_frag << "varying vec3 normalDir;\n"; } if (stateMask & (LIGHTING | NORMAL_MAP)) { - vert << "varying vec3 lightDir;\n"; + vert_frag << "varying vec3 lightDir;\n"; } if (stateMask & (LIGHTING | NORMAL_MAP | FOG)) { - vert << "varying vec3 viewDir;\n"; + vert_frag << "varying vec3 viewDir;\n"; } - // copy varying to fragment shader - frag << vert.str(); + vert_frag << "varying vec4 vertexColor;\n"; + + std::ostringstream vert; + std::ostringstream frag; + + // copy varying to vertex ad fragment shader + vert << vert_frag.str(); + frag << vert_frag.str(); // write uniforms and attributes int unit = 0; @@ -185,6 +195,7 @@ osg::StateSet *ShaderGenCache::createStateSet(int stateMask) const " lightDir.y = dot(dir, b);\n"\ " lightDir.z = dot(dir, n);\n"; } +#if !OSG_GLES2_FEATURES && !OSG_GLES3_FEATURES && !OSG_GL2_FEATURES else if (stateMask & LIGHTING) { vert << @@ -201,11 +212,12 @@ osg::StateSet *ShaderGenCache::createStateSet(int stateMask) const { vert << " viewDir = -vec3(gl_ModelViewMatrix * gl_Vertex);\n"\ - " gl_FrontColor = gl_Color;\n"; + " vertexColor = gl_Color;\n"; } +#endif else { - vert << " gl_FrontColor = gl_Color;\n"; + vert << " vertexColor = gl_Color;\n"; } vert << "}\n"; @@ -216,11 +228,11 @@ osg::StateSet *ShaderGenCache::createStateSet(int stateMask) const if (stateMask & DIFFUSE_MAP) { - frag << " vec4 base = texture2D(diffuseMap, gl_TexCoord[0].st);\n"; + frag << " vec4 base = vertexColor * texture2D(diffuseMap, gl_TexCoord[0].st);\n"; } else { - frag << " vec4 base = vec4(1.0);\n"; + frag << " vec4 base = vertexColor;\n"; } if (stateMask & NORMAL_MAP) @@ -228,6 +240,7 @@ osg::StateSet *ShaderGenCache::createStateSet(int stateMask) const frag << " vec3 normalDir = texture2D(normalMap, gl_TexCoord[0].st).xyz*2.0-1.0;\n"; } +#if !OSG_GLES2_FEATURES && !OSG_GLES3_FEATURES && !OSG_GL2_FEATURES if (stateMask & (LIGHTING | NORMAL_MAP)) { frag << @@ -247,15 +260,13 @@ osg::StateSet *ShaderGenCache::createStateSet(int stateMask) const " }\n"; } else +#endif { frag << " vec4 color = base;\n"; } - if (!(stateMask & LIGHTING)) - { - frag << " color *= gl_Color;\n"; - } +#if !OSG_GLES2_FEATURES && !OSG_GLES3_FEATURES && !OSG_GL2_FEATURES if (stateMask & FOG) { frag << @@ -263,6 +274,7 @@ osg::StateSet *ShaderGenCache::createStateSet(int stateMask) const " float f = exp2(-1.442695*gl_Fog.density*gl_Fog.density*d2);\n"\ " color.rgb = mix(gl_Fog.color.rgb, color.rgb, clamp(f, 0.0, 1.0));\n"; } +#endif frag << " gl_FragColor = color;\n"; frag << "}\n"; diff --git a/src/osgViewer/StatsHandler.cpp b/src/osgViewer/StatsHandler.cpp index f426b5cc8..6a82943f8 100644 --- a/src/osgViewer/StatsHandler.cpp +++ b/src/osgViewer/StatsHandler.cpp @@ -29,12 +29,16 @@ namespace osgViewer { #define FIXED_FUNCTION defined(OSG_GL_FIXED_FUNCTION_AVAILABLE) -#define SHADERS_GL3 (defined(OSG_GL3_AVAILABLE) || defined(OSG_GLES3_AVAILABLE)) +#define SHADERS_GL3 (defined(OSG_GL3_AVAILABLE)) #define SHADERS_GL2 !FIXED_FUNCTION && !SHADERS_GL3 #if SHADERS_GL3 static const char* gl3_StatsVertexShader = { "#version 330 core\n" + "// gl3_StatsVertexShader\n" + "#ifdef GL_ES\n" + " precision highp float;\n" + "#endif\n" "in vec4 osg_Vertex;\n" "in vec4 osg_Color;\n" "uniform mat4 osg_ModelViewProjectionMatrix;\n" @@ -48,11 +52,15 @@ static const char* gl3_StatsVertexShader = { static const char* gl3_StatsFragmentShader = { "#version 330 core\n" + "// gl3_StatsFragmentShader\n" + "#ifdef GL_ES\n" + " precision highp float;\n" + "#endif\n" "in vec4 vertexColor;\n" "out vec4 color;\n" "void main(void)\n" "{\n" - " gl_FragColor = vertexColor;\n" + " color = vertexColor;\n" "}\n" }; @@ -61,6 +69,10 @@ static const char* gl3_StatsFragmentShader = { #if SHADERS_GL2 static const char* gl2_StatsVertexShader = { + "// gl2_StatsVertexShader\n" + "#ifdef GL_ES\n" + " precision highp float;\n" + "#endif\n" "varying vec4 vertexColor;\n" "void main(void)\n" "{\n" @@ -70,6 +82,10 @@ static const char* gl2_StatsVertexShader = { }; static const char* gl2_StatsFragmentShader = { + "// gl2_StatsFragmentShader\n" + "#ifdef GL_ES\n" + " precision highp float;\n" + "#endif\n" "varying vec4 vertexColor;\n" "void main(void)\n" "{\n" @@ -98,7 +114,7 @@ StatsHandler::StatsHandler(): _characterSize(20.0f), _lineHeight(1.5f) { - OSG_NOTICE<<"StatsHandler::StatsHandler()"<getOrCreateStateSet()->setGlobalDefaults();