Improved support for stats, fonts and shadergen for GLES2, GLES3 and GL3

This commit is contained in:
Robert Osfield
2017-03-20 14:07:14 +00:00
parent e0592b6d11
commit 6670a6e070
3 changed files with 63 additions and 19 deletions

View File

@@ -35,13 +35,17 @@ using namespace std;
static osg::ApplicationUsageProxy Font_e0(osg::ApplicationUsage::ENVIRONMENTAL_VARIABLE,"OSG_TEXT_INCREMENTAL_SUBLOADING <type>","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"

View File

@@ -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";

View File

@@ -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()"<<std::endl;
OSG_INFO<<"StatsHandler::StatsHandler()"<<std::endl;
_camera = new osg::Camera;
_camera->getOrCreateStateSet()->setGlobalDefaults();