Improved support for stats, fonts and shadergen for GLES2, GLES3 and GL3
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user