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