[osg-users] Multitexture: projection a texture on another texture
Sebastian Messerschmidt
sebastian.messerschmidt at gmx.de
Mon Feb 6 12:26:53 PST 2017
Hi,
I can you give you some pointers tomorrow. Basically it boils down to
the use of shaders and mixing the textures there. Also generating
texture coordinates should be done in the vertex shader.
Cheers
Sebastian
> 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=70116#70116
>
>
>
>
>
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
More information about the osg-users
mailing list