[osg-users] Creating a glowing sun in scene
Suraj Paul
suraj at isac.gov.in
Wed Feb 22 02:53:42 PST 2017
Hi All,
As i had posted previously, I could obtain the following results attached in the screen short in my attempt to create a glowing sun in the scene.
I am also attaching the source code.
As I am taking the baby-steps in doing shaders programming in OSG, i am having a really bad time. My problem is :
1)
I am not able to display the scene with both the glowing sun and cessna.osg in it. In the present form of the code it only displays me the blurred sphere( suppose to be the glowing sun). How to get bnoth the blurred sphere and cessna displayed together?
2) After referring to online resources as previously suggested replies i could not implement a Bloom pass using shader? Any code snippet to do this?
Basically i am not able to understand how to use the output of one fragment shader "combineFragSource"into another fragment shader that would make the HDR effect...
I know, its a novice question to ask but after putting efforts from my end i am really stalled! Please help, community.
...
Thank you!
Cheers,
Suraj
/* -*-c++-*- OpenSceneGraph Cookbook
* Chapter 6 Recipe 6
*
*/
#include <osg/Texture2D>
#include <osg/Group>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/ShapeDrawable>
#include "CommonFunctions"
#include <osg/MatrixTransform>
#include <iostream>
#include <osg/Node>
#define texsize 512
//uniform float weight[5] = float[] (0.227027, 0.1945946, 0.1216216, 0.054054, 0.016216);
static const char* vertSource = {
"void main(void)\n"
"{\n"
" gl_Position = ftransform();\n"
" gl_TexCoord[0] = gl_MultiTexCoord0;\n"
"}\n"
};
static const char* blurFragSource = {
"uniform sampler2D inputTex;\n"
"uniform vec2 blurDir;\n"
"void main(void)\n"
"{\n"
" vec2 uv = gl_TexCoord[0].st;\n"
" vec2 offset = vec2(0.02*blurDir.x, 0.02*blurDir.y);\n"
" vec4 color = texture2D(inputTex, uv) * 0.3;\n"
" color += texture2D(inputTex, uv - offset*3.0) * 0.15;\n"
" color += texture2D(inputTex, uv - offset*2.0) * 0.15;\n"
" color += texture2D(inputTex, uv - offset) * 0.25;\n"
" color += texture2D(inputTex, uv + offset) * 0.25;\n"
" color += texture2D(inputTex, uv + offset*2.0) * 0.1;\n"
" color += texture2D(inputTex, uv + offset*3.0) * 0.15;\n"
" gl_FragColor = color;\n"
"}\n"
};
static const char* combineFragSource = {
"uniform sampler2D sceneTex;\n"
"uniform sampler2D blurTex;\n"
"void main(void)\n"
"{\n"
" vec2 uv = gl_TexCoord[0].st;\n"
" vec4 fullColor = texture2D(sceneTex, uv);\n"
" vec4 blurColor = texture2D(blurTex, uv);\n"
" float mod_color = fullColor + 1.5* (blurColor + fullColor);\n"
" gl_FragColor = mod_color;\n"
"}\n"
};
typedef std::pair<osg::Camera*, osg::Texture*> RTTPair;
RTTPair createColorInput( osg::Node* scene )
{
osg::ref_ptr<osg::Texture2D> tex2D = new osg::Texture2D;
tex2D->setTextureSize( texsize, texsize );
tex2D->setInternalFormat( GL_RGBA );
osg::ref_ptr<osg::Camera> camera = osgCookBook::createRTTCamera(osg::Camera::COLOR_BUFFER, tex2D.get());
camera->addChild( scene );
return RTTPair(camera.release(), tex2D.get());
}
RTTPair createDepthInput( osg::Node* scene )
{
osg::ref_ptr<osg::Texture2D> tex2D = new osg::Texture2D;
tex2D->setTextureSize( texsize, texsize );
tex2D->setInternalFormat( GL_DEPTH_COMPONENT24 );
tex2D->setSourceFormat( GL_DEPTH_COMPONENT );
tex2D->setSourceType( GL_FLOAT );
osg::ref_ptr<osg::Camera> camera = osgCookBook::createRTTCamera(osg::Camera::DEPTH_BUFFER, tex2D.get());
camera->addChild( scene );
return RTTPair(camera.release(), tex2D.get());
}
RTTPair createBlurPass( osg::Texture* inputTex, const osg::Vec2& dir )
{
osg::ref_ptr<osg::Texture2D> tex2D = new osg::Texture2D;
tex2D->setTextureSize( texsize, texsize );
tex2D->setInternalFormat( GL_RGBA );
osg::ref_ptr<osg::Camera> camera = osgCookBook::createRTTCamera( osg::Camera::COLOR_BUFFER, tex2D.get(), true);
osg::ref_ptr<osg::Program> blurProg = new osg::Program;
blurProg->addShader( new osg::Shader(osg::Shader::VERTEX, vertSource) );
blurProg->addShader( new osg::Shader(osg::Shader::FRAGMENT, blurFragSource) );
osg::StateSet* ss = camera->getOrCreateStateSet();
ss->setTextureAttributeAndModes( 0, inputTex );
ss->setAttributeAndModes( blurProg.get(), osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE );
ss->addUniform( new osg::Uniform("sceneTex", 0) );
ss->addUniform( new osg::Uniform("blurDir", dir) );
return RTTPair(camera.release(), tex2D.get());
}
int main( int argc, char** argv )
{
osg::ArgumentParser arguments( &argc, argv );
//osg::ref_ptr<osg::Node> scene = osgDB::readNodeFiles( arguments );
osg::Node* scene = osgDB::readNodeFiles( arguments );
osg::Group* mygroup = new osg::Group;
osg::Node* cessna = osgDB::readNodeFile("/home/suraj/osgex/ex_cam/cessna.osg");
osg::MatrixTransform * mt_cessna = new osg::MatrixTransform;
mt_cessna->setMatrix(osg::Matrix::translate(0,0, 2));
mt_cessna->addChild(cessna);
if ( !scene )
{//scene = osgDB::readNodeFile("lz.osg");
//Model drawing
osg::ref_ptr<osg::Geode> geode = new osg::Geode();
osg::ref_ptr<osg::ShapeDrawable> sh1 = new osg::ShapeDrawable;
sh1->setShape(new osg::Sphere(osg::Vec3(0.0f,0.0f,0.0f),10.0f ) );
sh1->setColor(osg::Vec4(1.0,1.0,1.0,0.5));
geode->addDrawable(sh1.get() );
mygroup->addChild(geode);
scene=dynamic_cast <osg::Node*>(mygroup);
}
// The first pass: color
RTTPair pass0_color = createColorInput( scene );
// The first pass: depth
RTTPair pass0_depth = createDepthInput( scene );
// The horizonal blur pass
RTTPair pass1 = createBlurPass( pass0_color.second, osg::Vec2(1, 0) );
// The vertical blur pass
RTTPair pass2 = createBlurPass( pass1.second, osg::Vec2(0, 1) );
// The final pass
osg::ref_ptr<osg::Camera> hudCamera = osgCookBook::createHUDCamera(0.0, 1.0, 0.0, 1.0);
hudCamera->addChild( osgCookBook::createScreenQuad(1.0f, 1.0f, 1.) );
// hudCamera->addChild( mt_cessna );
osg::ref_ptr<osg::Program> finalProg = new osg::Program;
finalProg->addShader( new osg::Shader(osg::Shader::VERTEX, vertSource) );
finalProg->addShader( new osg::Shader(osg::Shader::FRAGMENT, combineFragSource) );
osg::StateSet* stateset = hudCamera->getOrCreateStateSet();
stateset->setTextureAttributeAndModes( 0, pass0_color.second );
stateset->setTextureAttributeAndModes( 1, pass2.second );
stateset->setTextureAttributeAndModes( 2, pass0_depth.second );
//stateset->setTextureAttributeAndModes( 3, pass3.second );
stateset->setAttributeAndModes( finalProg.get() );
stateset->addUniform( new osg::Uniform("sceneTex", 0) );
stateset->addUniform( new osg::Uniform("blurTex", 1) );
// Build the scene graph
osg::ref_ptr<osg::Group> root = new osg::Group;
root->addChild(mt_cessna);
root->addChild( pass0_color.first );
//root->addChild( pass0_depth.first );
root->addChild( pass1.first );
root->addChild( pass2.first );
root->addChild( hudCamera.get() );
osgViewer::Viewer viewer;
viewer.getCamera()->setComputeNearFarMode( osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR );
viewer.setSceneData( root.get() );
return viewer.run();
}
...
Thank you!
Cheers,
Suraj
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=70310#70310
Attachments:
http://forum.openscenegraph.org//files/screenshot_1_514.png
More information about the osg-users
mailing list