From 9848c1d264b4480b7c5b4064432acb7c6d374aa3 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 23 Mar 2017 11:09:49 +0000 Subject: [PATCH] First pass at default shader for GLES2,GLES3 and GL3. --- src/osg/StateSet.cpp | 126 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) diff --git a/src/osg/StateSet.cpp b/src/osg/StateSet.cpp index 8e6c5aa28..1c939e0fd 100644 --- a/src/osg/StateSet.cpp +++ b/src/osg/StateSet.cpp @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -38,6 +39,102 @@ using namespace osg; + +#define FIXED_FUNCTION defined(OSG_GL_FIXED_FUNCTION_AVAILABLE) +#define SHADERS_GL3 (defined(OSG_GL3_AVAILABLE) || defined(OSG_GLES3_AVAILABLE)) +#define SHADERS_GL2 !FIXED_FUNCTION && !SHADERS_GL3 +#define IS_ES (defined(OSG_GLES2_AVAILABLE) || defined(OSG_GLES3_AVAILABLE)) + +#if SHADERS_GL3 + +#if !IS_ES + #define GLSL_VERSION_STR "330 core" +#else + #define GLSL_VERSION_STR "300 es" +#endif + +static const char* gl3_VertexShader = { + "#version " GLSL_VERSION_STR "\n" + "// gl3_VertexShader\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" + "uniform mat4 osg_ModelViewProjectionMatrix;\n" + "out vec2 texCoord;\n" + "out vec4 vertexColor;\n" + "void main(void)\n" + "{\n" + " gl_Position = osg_ModelViewProjectionMatrix * osg_Vertex;\n" + " texCoord = osg_MultiTexCoord0.xy;\n" + " vertexColor = osg_Color; \n" + "}\n" +}; + +static const char* gl3_FragmentShader = { + "#version " GLSL_VERSION_STR "\n" + "// gl3_FragmentShader\n" + "#ifdef GL_ES\n" + " precision highp float;\n" + "#endif\n" + "uniform sampler2D baseTexture;\n" + "in vec2 texCoord;\n" + "in vec4 vertexColor;\n" + "out vec4 color;\n" + "void main(void)\n" + "{\n" + " color = vertexColor * texture2D(baseTexture, texCoord);\n" + "}\n" +}; + +#endif + + +#if SHADERS_GL2 +static const char* gl2_VertexShader = { + "// gl2_VertexShader\n" + "#ifdef GL_ES\n" + " precision highp float;\n" + "#endif\n" + "varying vec2 texCoord;\n" + "varying vec4 vertexColor;\n" + "void main(void)\n" + "{\n" + " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" + " texCoord = gl_MultiTexCoord0.xy;\n" + " vertexColor = gl_Color; \n" + "}\n" +}; + +static const char* gl2_FragmentShader = { + "// gl2_FragmentShader\n" + "#ifdef GL_ES\n" + " precision highp float;\n" + "#endif\n" + "uniform sampler2D baseTexture;\n" + "varying vec2 texCoord;\n" + "varying vec4 vertexColor;\n" + "void main(void)\n" + "{\n" + " gl_FragColor = vertexColor * texture2D(baseTexture, texCoord);\n" + "}\n" +}; +#endif + + +extern osg::Texture2D* createDefaultTexture() +{ + osg::ref_ptr image = new osg::Image; + image->allocateImage(1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE); + image->setColor(osg::Vec4(1.0,1.0,1.0,1.0), 0, 0, 0); + + osg::ref_ptr texture = new osg::Texture2D(image.get()); + return texture.release(); +} + + // local class to help porting from OSG0.8.x to 0.9.x class TextureGLModeSet { @@ -602,6 +699,35 @@ void StateSet::setGlobalDefaults() setAttributeAndModes(material,StateAttribute::ON); #endif + + + OSG_INFO<<"void StateSet::setGlobalDefaults()"< program = new osg::Program; + program->addShader(new osg::Shader(osg::Shader::VERTEX, gl3_VertexShader)); + program->addShader(new osg::Shader(osg::Shader::FRAGMENT, gl3_FragmentShader)); + setAttributeAndModes(program.get()); + setTextureAttribute(0, createDefaultTexture()); + addUniform(new osg::Uniform("baseTexture", 0)); + +#elif SHADERS_GL2 + + OSG_INFO<<" StateSet::setGlobalDefaults() Setting up GL2 compatible shaders"< program = new osg::Program; + program->addShader(new osg::Shader(osg::Shader::VERTEX, gl2_VertexShader)); + program->addShader(new osg::Shader(osg::Shader::FRAGMENT, gl2_FragmentShader)); + setAttributeAndModes(program.get()); + setTextureAttribute(0, createDefaultTexture()); + addUniform(new osg::Uniform("baseTexture", 0)); + +#endif + + }