Hi Brett,
problem seems to be that lighting was on in your RTT camera. See
attached. I added
geode->getOrCreateStateSet()->setMode( GL_LIGHTING,
osg::StateAttribute::OFF);
Also be aware of the way OSG blends your RTT texture with your final
geometry. OSG defaults to GL_MODULATE. Search
http://news.gmane.org/gmane.comp.graphics.openscenegraph.user
for
"GL_MODULATE" or "GL_DECAL" and you'll find some things. Also look at
http://www.opengl.org/resources/faq/technical/texture.htm
rgds
jp
Brett Thomas Lee wrote:
Hi,
I have attached my expected and current output.Just remove the quotes for
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 ) );
and check once.Thanks again.
--
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;
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));
geom->setVertexArray(ary.get());
osg::ref_ptr<osg::Vec4Array> col=new osg::Vec4Array;
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));
geom->setColorArray(col.get());
osg::ref_ptr<osg::Vec3Array> n=new osg::Vec3Array;
geom->setColorBinding(osg::Geometry::BIND_OVERALL);
n->push_back(osg::Vec3(0.0,-1.0,0.0));
geom->setNormalArray(n.get());
osg::ref_ptr<osg::StateSet> ss1=geode->getOrCreateStateSet();
osg::ref_ptr<osg::Vec2Array> tex1=new osg::Vec2Array;
tex1->push_back(osg::Vec2(0.0,0.0));
tex1->push_back(osg::Vec2(1.0,0.0));
tex1->push_back(osg::Vec2(1.0,1.0));
tex1->push_back(osg::Vec2(0.0,1.0));
geom->setTexCoordArray(0,tex1.get());
/*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());
*/
geom->addPrimitiveSet(new osg::DrawArrays( osg::PrimitiveSet::QUADS, 0, 4 ));
geode->addDrawable(geom.get());
ss1->setMode( GL_BLEND, osg::StateAttribute::ON);
ss1->setMode( GL_LIGHTING, osg::StateAttribute::OFF);
ss1->setMode( GL_LIGHT1, osg::StateAttribute::OFF);
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, 0.f, 1.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() );
geode->getOrCreateStateSet()->setMode( GL_LIGHTING, osg::StateAttribute::OFF);
return geode.get();
}
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org