Hi,
fix attached. There is no magic here, you should have been able to find
out the problems by looking at the osg examples.
You forgot to attach the prerender camera to you main scene. Also, the
prerender camera usually operates in the default OpenGL coord system, ie
z coming out of the screen. So your geom should be in x-y plane, not x-z.
jp
Brett Thomas Lee wrote:
Hi Can someone please find the bug in my code.I been trying it for the past two
days.What ive done is ,Ive set a prerender camera and render a quad to the
FBO and then to a texture with viewport to the size of the texture.And then
apply it to a quad.Im attaching my source along with this post.Thanks in
advance.
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=16400#16400
------------------------------------------------------------------------
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
--
This message is subject to the CSIR's copyright terms and conditions, e-mail legal notice, and implemented Open Document Format (ODF) standard.
The full disclaimer details can be found at http://www.csir.co.za/disclaimer.html.
This message has been scanned for viruses and dangerous content by MailScanner,
and is believed to be clean. MailScanner thanks Transtec Computers for their support.
#include<iostream>
#include<osg/Camera>
#include<osg/Geode>
#include<osg/Geometry>
#include<osg/Image>
#include<osg/MatrixTransform>
#include<osg/Material>
#include <osgDB/ReadFile>
#include <osg/ShapeDrawable>
#include<osg/StateSet>
#include<osg/StateAttribute>
#include<osg/ShadeModel>
#include<osg/Texture2D>
#include <osgGA/TrackballManipulator>
#include <osgViewer/Viewer>
#include <osgDB/Registry>
#include <osgDB/WriteFile>
#include <osg/Notify>
using namespace std;
using namespace osg;
#define ImageWidth 64
#define ImageHeight 64
GLubyte checkImage[64*64][4];
osg::ref_ptr<osg::Image> image;
osg::Texture2D *rendTexture;
osg::ref_ptr<osg::Camera> mPreRenderCamera;
void makeCheckImage(void);
osg::ref_ptr<osg::Node> createSceneGraph(void);
void createTexture(const unsigned int,const unsigned int);
void textureCamera();
int main()
{
osgViewer::Viewer viewer;
// renderTexture();
//osg::ref_ptr<osg::Node> scene=createSceneGraph();
//createTexture(ImageWidth,ImageHeight);
textureCamera();
osg::ref_ptr<osg::Group> root=new osg::Group;
osg::ref_ptr<osg::MatrixTransform> mTransform=new osg::MatrixTransform ;
osg::ref_ptr<osg::Geode> geode=new osg::Geode;
osg::ref_ptr<osg::Geometry> geom=new osg::Geometry;
osg::ref_ptr<osg::Vec3Array> ary=new osg::Vec3Array;
geom->setVertexArray(ary.get());
ary->push_back(osg::Vec3(-100.0,0.0,-100.0));
ary->push_back(osg::Vec3(100.0,0.0,-100.0));
ary->push_back(osg::Vec3(-100.0,0.0,100.0));
ary->push_back(osg::Vec3(100.0,0.0,100.0));
osg::ref_ptr<osg::Vec4Array> col=new osg::Vec4Array;
geom->setColorArray(col.get());
geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
col->push_back(osg::Vec4(1.0,1.0,1.0,1.0));
col->push_back(osg::Vec4(1.0,1.0,1.0,1.0));
col->push_back(osg::Vec4(1.0,1.0,1.0,1.0));
col->push_back(osg::Vec4(1.0,1.0,1.0,1.0));
osg::ref_ptr<osg::Vec3Array> n=new osg::Vec3Array;
geom->setNormalArray(n.get());
geom->setColorBinding(osg::Geometry::BIND_OVERALL);
n->push_back(osg::Vec3(0.0,-1.0,0.0));
osg::ref_ptr<osg::StateSet> ss1=mTransform->getOrCreateStateSet();
osg::ref_ptr<osg::Vec2Array> tex1=new osg::Vec2Array;
geom->setTexCoordArray(0,tex1.get());
tex1->push_back(osg::Vec2(0.0,0.0));
tex1->push_back(osg::Vec2(1.0,0.0));
tex1->push_back(osg::Vec2(0.0,1.0));
tex1->push_back(osg::Vec2(1.0,1.0));
/*int c;
for (int i = 0; i < ImageHeight; i++)
for (int j = 0; j < ImageWidth; j++)
{
c = (((i&0x8)==0)^((j&0x8)==0))*255;
checkImage[i][j][0] = (GLubyte) c;
checkImage[i][j][1] = (GLubyte) c;
checkImage[i][j][2] = (GLubyte) c;
checkImage[i][j][3] = (GLubyte) 255;
}
//osg::ref_ptr<osg::Image> image=new osg::Image;
//image->setImage(64,64,1,4,GL_RGBA,GL_UNSIGNED_BYTE,(unsigned char*)checkImage,osg::Image::USE_NEW_DELETE);
*/
//osg::ref_ptr<osg::Image> image = osgDB::readImageFile( "texture.jpg" );
// Attach the image in a Texture2D object
//osg::ref_ptr<osg::Texture2D> tex = new osg::Texture2D;
//tex->setImage( image.get() );
ss1->setTextureAttributeAndModes( 0,rendTexture,osg::StateAttribute::ON);
cout<<"Texture width"<<rendTexture->getTextureWidth()<<endl;
cout<<"Texture Height"<<rendTexture->getTextureHeight()<<endl;
osg::DrawElementsUInt* t1 =
new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
t1->push_back(0);
t1->push_back(1);
t1->push_back(2);
geom->addPrimitiveSet(t1);
osg::DrawElementsUInt* t2 =
new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
t2->push_back(2);
t2->push_back(3);
t2->push_back(1);
geom->addPrimitiveSet(t2);
geode->addDrawable(geom.get());
ss1->setMode( GL_LIGHTING, osg::StateAttribute::OFF);
ss1->setMode( GL_LIGHT1, osg::StateAttribute::ON);
ss1->setMode( GL_NORMALIZE, osg::StateAttribute::ON );
osg::ref_ptr<osg::Light> light1 = new osg::Light;
light1->setAmbient( osg::Vec4(0.8,0.8,0.0,1.0));
light1->setDiffuse( osg::Vec4( 1.0,1.0,0.0,1.0 ));
light1->setSpecular( osg::Vec4(1.0,1.0,0.0,1.0 ));
light1->setPosition( osg::Vec4( 0.0,120.0,0.0,1.0));
light1->setDirection( osg::Vec3( 0.f, -1.f, 0.f ));
//light->setSpotCutoff(25.f );
osg::ref_ptr<osg::Material> ma1= new osg::Material;
ma1->setAmbient(osg::Material::FRONT,osg::Vec4(1.0,1.0,0.0,1.0 ));
ma1->setDiffuse( osg::Material::FRONT,osg::Vec4(0.8000001,0.8000001,0.0,1.0 ) );
ma1->setSpecular( osg::Material::FRONT,osg::Vec4( 0.854902,0.6470588,0.0,1.0 ) );
ma1->setShininess( osg::Material::FRONT, 96.f );
ss1->setAttribute( ma1.get() );
osg::ref_ptr<osg::LightSource> ls = new osg::LightSource;
mTransform->addChild( ls.get() );
ls->setLight( light1.get() );
mTransform->addChild(geode.get());
root->addChild(mTransform.get());
root->addChild(mPreRenderCamera.get());
if (!root.valid())
osg::notify(osg::FATAL) <<"Failed in createSceneGraph()." << endl;
bool result = osgDB::writeNodeFile(*(root.get()), "Simple.osg" );
if ( !result )
osg::notify(osg::FATAL) <<
"Failed in osgDB::writeNodeFile()." << endl;
viewer.setSceneData( root.get());
// viewer.getCamera()->setProjectionMatrixAsOrtho(0,ImageWidth,0,ImageHeight,0,ImageHeight);
viewer.setCameraManipulator(new osgGA::TrackballManipulator());
viewer.realize();
while( !viewer.done() )
{
viewer.frame();
}
// tex->setUnRefImageDataAfterApply( true );
return 0;
}
void textureCamera()
{
createTexture(ImageWidth,ImageHeight);
osg::ref_ptr<osg::Node> scene=createSceneGraph();
mPreRenderCamera=new osg::Camera();
mPreRenderCamera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
mPreRenderCamera->setClearColor(osg::Vec4f(1.0,0.0,0.0,1.0));
mPreRenderCamera->setClearMask(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT);
//mPreRenderCamera->setComputeNearFarMode(osg::Camera::DO_NOT_COMPUTE_NEAR_FAR);
mPreRenderCamera->setProjectionMatrixAsOrtho2D(0,ImageWidth,0,ImageHeight);
mPreRenderCamera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
//mPreRenderCamera->setProjectionMatrixAsOrtho(0,ImageWidth,0,ImageHeight,0,ImageHeight);
mPreRenderCamera->setViewport(0.0,0.0,ImageWidth,ImageHeight);
//mPreRenderCamera->setProjectionMatrixAsPerspective(30.0, 40.0/30.0, 50.0, 2000.0);
mPreRenderCamera->setRenderOrder(osg::Camera::PRE_RENDER);
mPreRenderCamera->addChild(scene.get());
mPreRenderCamera->attach(osg::Camera::COLOR_BUFFER,rendTexture);
}
void createTexture(const unsigned int imageWidth,const unsigned int imageHeight)
{
rendTexture = new osg::Texture2D();
rendTexture->setTextureSize(imageWidth, imageHeight);
//rendTexture->setInternalFormat(GL_RGBA);
rendTexture->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR);
rendTexture->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR);
rendTexture->setSourceFormat(GL_RGBA);
rendTexture->setInternalFormat(GL_RGBA);
rendTexture->setSourceType(GL_UNSIGNED_BYTE);
}
osg::ref_ptr<osg::Node> createSceneGraph()
{
// Create an object to store geometry in.
osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
// Create an array of four vertices.
osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;
/*
v->push_back( osg::Vec3( 0.f,0.f ,0.f) );
v->push_back( osg::Vec3( ImageWidth,0.0,0.0) );
v->push_back( osg::Vec3( ImageWidth,0.f,ImageHeight) );
v->push_back( osg::Vec3( 0.f,0.f,ImageHeight ) );
*/
v->push_back( osg::Vec3( 0.f,0.f ,0.f) );
v->push_back( osg::Vec3( ImageWidth,0.0,0.0) );
v->push_back( osg::Vec3( ImageWidth,ImageHeight,0) );
v->push_back( osg::Vec3( 0.f,ImageHeight,0 ) );
geom->setVertexArray( v.get() );
// Create an array of four colors.
osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array;
/*geom->setColorBinding( osg::Geometry::BIND_PER_VERTEX );
c->push_back( osg::Vec4( 1.f, 0.f, 0.f, 1.f ) );
c->push_back( osg::Vec4( 0.f, 1.f, 0.f, 1.f ) );
c->push_back( osg::Vec4( 0.f, 0.f, 1.f, 1.f ) );
c->push_back( osg::Vec4( 1.f, 1.f, 1.f, 1.f ) );*/
geom->setColorBinding( osg::Geometry::BIND_OVERALL);
c->push_back( osg::Vec4( 1.f, 0.f, 0.f, 1.f ) );
geom->setColorArray( c.get() );
// Create an array for the single normal.
osg::ref_ptr<osg::Vec3Array> n = new osg::Vec3Array;
n->push_back( osg::Vec3( 0.f, -1.f, 0.f ) );
geom->setNormalArray( n.get() );
geom->setNormalBinding( osg::Geometry::BIND_OVERALL );
// Draw a four-vertex quad from the stored data.
geom->addPrimitiveSet(new osg::DrawArrays( osg::PrimitiveSet::QUADS, 0, 4 ) );
// Add the Geometry (Drawable) to a Geode and
// return the Geode.
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
geode->addDrawable( geom.get() );
return geode.get();
}
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org