Hi Ekaterina
I don't understand why you would use TexEnv..

Am I correct?
You want to create a texture2 resulting from viewing geode2 from camera 
perspective,
And then use this result on geode according camera projection.

If it is what you want you will require osg::TexGen instead (see osgshadow as 
an example on how to set planes eqs according to camera projection) to generate 
projective texture coordinates.

Further I've never used glTexenv(seams deprecated since gl3)  but i think it 
could be simplier to mix explicily textures in a custom fragment program ..

Hope it helps


Ekaterina wrote:
> Hello dear osg masters,
> 
> I am not very expirienced yet with osg and trying to do a simple example of 
> projection a texture on another texture, but somehow it is not working, seems 
> that some settings are wrong. Could you please have a look at the code:
>       osg::Geode* geode = new osg::Geode;
> 
>       // set up the texture of the base.
>       osg::StateSet* stateset = new osg::StateSet();
>       osg::Image* image = osgDB::readImageFile("Images/lz.rgb");
>       if (image)
>       {
>               osg::Texture2D* texture = new osg::Texture2D;
>               texture->setImage(image);
>               stateset->setTextureAttributeAndModes(0, texture, 
> osg::StateAttribute::ON);
>       }
> 
>       geode->setStateSet(stateset);
> 
> 
>       osg::HeightField* grid = new osg::HeightField;
>         ...
>       geode->addDrawable(new osg::ShapeDrawable(grid));
>         
>         osg::TexEnv *texenv = new osg::TexEnv;
>       texenv->setMode(osg::TexEnv::DECAL);
> 
>       int tex_width = 1024;
>       int tex_height = 1024;
> 
>         //Geometry which has to be projected
>       osg::Geode* geode2 = new osg::Geode;
>       osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;
>       vertices->push_back(center);
>       vertices->push_back(osg::Vec3(center.x(), center.y() + 10, center.z()));
>       vertices->push_back(osg::Vec3(center.x() + 10, center.y() + 10, 
> center.z()));
>       vertices->push_back(osg::Vec3(center.x() + 10, center.y(), center.z()));
>       osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;
>       normals->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));
> 
>       osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;
>       colors->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));//red
>         
>       osg::ref_ptr<osg::Geometry> quad = new osg::Geometry;
>       quad->setVertexArray(vertices.get());
>       quad->setNormalArray(normals.get());
>       quad->setNormalBinding(osg::Geometry::BIND_OVERALL);
>       quad->setColorArray(colors.get());
>       quad->setColorBinding(osg::Geometry::BIND_OVERALL);
>       quad->addPrimitiveSet(new osg::DrawArrays(GL_QUADS, 0, 4));
>       geode2->addDrawable(quad.get());
> 
> 
>       osg::Texture2D* texture2 = new osg::Texture2D;
>       texture2->setTextureSize(tex_width, tex_height);
>       texture2->setInternalFormat(GL_RGBA);
>       texture2->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR);
>       texture2->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR);
> 
>       stateset->setTextureAttributeAndModes(1, texture2, 
> osg::StateAttribute::ON);
>       stateset->setTextureAttribute(0, texenv);
>       stateset->setTextureAttribute(1, texenv);
> 
> 
> 
>       osg::Camera* camera = new osg::Camera;
> 
>       float znear = 10;
>       float zfar = 30;
>       float proj_top = 0.25f*znear;
>       float proj_right = 0.5f*znear;
>       camera->setProjectionMatrixAsFrustum(-proj_right, proj_right, 
> -proj_top, proj_top, znear, zfar);
> 
>       camera->setViewMatrixAsLookAt(osg::Vec3(0.0f, 0.0f, 0.0f) - 
> osg::Vec3(0.0f, 2.0f, 0.0f) * 10, osg::Vec3(0.0f, 0.0f, 0.0f), 
> osg::Vec3(0.0f, 0.0f, 1.0f));
>       camera->setViewport(0, 0, tex_width, tex_height);
>       //camera->setClearColor(osg::Vec4(1.0f, 1.0f, 1.0f, 0.0f)); 
>       camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
>       camera->setRenderOrder(osg::Camera::PRE_RENDER);
> 
>       camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
>       camera->attach(osg::Camera::COLOR_BUFFER, texture2);
>       camera->setReferenceFrame(osg::Camera::ABSOLUTE_RF);
>       camera->addChild(geode2);
> 
>       osg::Group* group = new osg::Group;
>       group->addChild(geode);
>       group->addChild(camera);
> 
> 
> 
> 
> Thank you!
> 
> Cheers,
> Ekaterina


------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=70117#70117





_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to