Added base texture support.
This commit is contained in:
parent
aedb187718
commit
5959362e5c
@ -23,6 +23,8 @@
|
|||||||
#include <osg/CameraNode>
|
#include <osg/CameraNode>
|
||||||
#include <osg/TexGenNode>
|
#include <osg/TexGenNode>
|
||||||
|
|
||||||
|
#include <osgDB/ReadFile>
|
||||||
|
|
||||||
using namespace osg;
|
using namespace osg;
|
||||||
|
|
||||||
class LightTransformCallback: public osg::NodeCallback
|
class LightTransformCallback: public osg::NodeCallback
|
||||||
@ -264,13 +266,27 @@ class UpdateCameraAndTexGenCallback : public osg::NodeCallback
|
|||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
// fragment shader
|
// fragment shader
|
||||||
//
|
//
|
||||||
char fragmentShaderSource[] =
|
char fragmentShaderSource_noBaseTexture[] =
|
||||||
"uniform sampler2DShadow baseTexture; \n"
|
"uniform sampler2DShadow shadowTexture; \n"
|
||||||
"uniform vec2 ambientBias; \n"
|
"uniform vec2 ambientBias; \n"
|
||||||
"\n"
|
"\n"
|
||||||
"void main(void) \n"
|
"void main(void) \n"
|
||||||
"{ \n"
|
"{ \n"
|
||||||
" gl_FragColor = gl_Color*(ambientBias.x + shadow2DProj( baseTexture, gl_TexCoord[0] ) * ambientBias.y); \n"
|
" gl_FragColor = gl_Color * (ambientBias.x + shadow2DProj( shadowTexture, gl_TexCoord[0] ) * ambientBias.y); \n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////
|
||||||
|
// fragment shader
|
||||||
|
//
|
||||||
|
char fragmentShaderSource_withBaseTexture[] =
|
||||||
|
"uniform sampler2D baseTexture; \n"
|
||||||
|
"uniform sampler2DShadow shadowTexture; \n"
|
||||||
|
"uniform vec2 ambientBias; \n"
|
||||||
|
"\n"
|
||||||
|
"void main(void) \n"
|
||||||
|
"{ \n"
|
||||||
|
" vec4 color = gl_Color * texture2D( baseTexture, gl_TexCoord[0] ); \n"
|
||||||
|
" gl_FragColor = color * (ambientBias.x + shadow2DProj( shadowTexture, gl_TexCoord[1] ) * ambientBias.y); \n"
|
||||||
"}\n";
|
"}\n";
|
||||||
|
|
||||||
|
|
||||||
@ -309,7 +325,7 @@ osg::Group* createShadowedScene(osg::Node* shadowed,osg::MatrixTransform* light_
|
|||||||
|
|
||||||
|
|
||||||
float factor = 0.0f;
|
float factor = 0.0f;
|
||||||
float units = 0.0f;
|
float units = 1.0f;
|
||||||
|
|
||||||
ref_ptr<PolygonOffset> polygon_offset = new PolygonOffset;
|
ref_ptr<PolygonOffset> polygon_offset = new PolygonOffset;
|
||||||
polygon_offset->setFactor(factor);
|
polygon_offset->setFactor(factor);
|
||||||
@ -364,12 +380,26 @@ osg::Group* createShadowedScene(osg::Node* shadowed,osg::MatrixTransform* light_
|
|||||||
osg::Program* program = new osg::Program;
|
osg::Program* program = new osg::Program;
|
||||||
stateset->setAttribute(program);
|
stateset->setAttribute(program);
|
||||||
|
|
||||||
osg::Shader* fragment_shader = new osg::Shader(osg::Shader::FRAGMENT, fragmentShaderSource);
|
if (unit==0)
|
||||||
program->addShader(fragment_shader);
|
{
|
||||||
|
osg::Shader* fragment_shader = new osg::Shader(osg::Shader::FRAGMENT, fragmentShaderSource_noBaseTexture);
|
||||||
|
program->addShader(fragment_shader);
|
||||||
|
|
||||||
osg::Uniform* baseTextureSampler = new osg::Uniform("baseTexture",0);
|
osg::Uniform* shadowTextureSampler = new osg::Uniform("shadowTexture",(int)unit);
|
||||||
stateset->addUniform(baseTextureSampler);
|
stateset->addUniform(shadowTextureSampler);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
osg::Shader* fragment_shader = new osg::Shader(osg::Shader::FRAGMENT, fragmentShaderSource_withBaseTexture);
|
||||||
|
program->addShader(fragment_shader);
|
||||||
|
|
||||||
|
osg::Uniform* baseTextureSampler = new osg::Uniform("baseTexture",0);
|
||||||
|
stateset->addUniform(baseTextureSampler);
|
||||||
|
|
||||||
|
osg::Uniform* shadowTextureSampler = new osg::Uniform("shadowTexture",(int)unit);
|
||||||
|
stateset->addUniform(shadowTextureSampler);
|
||||||
|
}
|
||||||
|
|
||||||
osg::Uniform* ambientBias = new osg::Uniform("ambientBias",osg::Vec2(0.2f,0.8f));
|
osg::Uniform* ambientBias = new osg::Uniform("ambientBias",osg::Vec2(0.2f,0.8f));
|
||||||
stateset->addUniform(ambientBias);
|
stateset->addUniform(ambientBias);
|
||||||
|
|
||||||
@ -391,6 +421,8 @@ int main(int argc, char** argv)
|
|||||||
arguments.getApplicationUsage()->setDescription(arguments.getApplicationName() + " is the example which demonstrates using of GL_ARB_shadow extension implemented in osg::Texture class");
|
arguments.getApplicationUsage()->setDescription(arguments.getApplicationName() + " is the example which demonstrates using of GL_ARB_shadow extension implemented in osg::Texture class");
|
||||||
arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName());
|
arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName());
|
||||||
arguments.getApplicationUsage()->addCommandLineOption("-h or --help", "Display this information");
|
arguments.getApplicationUsage()->addCommandLineOption("-h or --help", "Display this information");
|
||||||
|
arguments.getApplicationUsage()->addCommandLineOption("--with-base-texture", "Adde base texture to shadowed model.");
|
||||||
|
arguments.getApplicationUsage()->addCommandLineOption("--no-base-texture", "Adde base texture to shadowed model.");
|
||||||
|
|
||||||
// construct the viewer.
|
// construct the viewer.
|
||||||
osgProducer::Viewer viewer(arguments);
|
osgProducer::Viewer viewer(arguments);
|
||||||
@ -401,6 +433,10 @@ int main(int argc, char** argv)
|
|||||||
// get details on keyboard and mouse bindings used by the viewer.
|
// get details on keyboard and mouse bindings used by the viewer.
|
||||||
viewer.getUsage(*arguments. getApplicationUsage());
|
viewer.getUsage(*arguments. getApplicationUsage());
|
||||||
|
|
||||||
|
bool withBaseTexture = true;
|
||||||
|
while(arguments.read("--with-base-texture")) { withBaseTexture = true; }
|
||||||
|
while(arguments.read("--no-base-texture")) { withBaseTexture = false; }
|
||||||
|
|
||||||
// if user request help write it out to cout.
|
// if user request help write it out to cout.
|
||||||
if (arguments.read("-h") || arguments.read("--help"))
|
if (arguments.read("-h") || arguments.read("--help"))
|
||||||
{
|
{
|
||||||
@ -427,8 +463,19 @@ int main(int argc, char** argv)
|
|||||||
ref_ptr<MatrixTransform> light_transform = _create_lights();
|
ref_ptr<MatrixTransform> light_transform = _create_lights();
|
||||||
if (!light_transform.valid()) return 1;
|
if (!light_transform.valid()) return 1;
|
||||||
|
|
||||||
ref_ptr<Group> shadowedScene = createShadowedScene(shadowed_scene.get(),light_transform.get(),0);
|
ref_ptr<Group> shadowedScene;
|
||||||
|
|
||||||
|
|
||||||
|
if (withBaseTexture)
|
||||||
|
{
|
||||||
|
shadowed_scene->getOrCreateStateSet()->setTextureAttributeAndModes( 0, new osg::Texture2D(osgDB::readImageFile("lz.rgb")), osg::StateAttribute::ON);
|
||||||
|
shadowedScene = createShadowedScene(shadowed_scene.get(),light_transform.get(),1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
shadowedScene = createShadowedScene(shadowed_scene.get(),light_transform.get(),0);
|
||||||
|
}
|
||||||
|
|
||||||
scene->addChild(shadowedScene.get());
|
scene->addChild(shadowedScene.get());
|
||||||
|
|
||||||
viewer.setSceneData(scene.get());
|
viewer.setSceneData(scene.get());
|
||||||
|
Loading…
Reference in New Issue
Block a user