#include <QCoreApplication>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/Texture2D>
#include <osg/TexEnv>
#include <osg/TexGen>
osg::Image* createImage( int width, int height,osg::Vec3 color )
{
osg::ref_ptr<osg::Image> image = new osg::Image;
image->allocateImage( width, height, 1, GL_RGB, GL_UNSIGNED_BYTE );
unsigned char* data = image->data();
for ( int y=0; y<height; ++y )
{
for ( int x=0; x<width; ++x )
{
*(data++) = color.x();
*(data++) = color.y();
*(data++) = color.z();
}
}
return image.release();
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
osgViewer::Viewer viewer;
osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("cow.osg");
if(model.valid())
{
osg::ref_ptr<osg::Image> image= createImage(256,256,osg::Vec3(255.0,1.0,0.0));
if (image.get())
{
osg::ref_ptr<osg::Texture2D> texture=new osg::Texture2D();
texture->setImage(image.get());
//设置自动生成纹理坐标
osg::ref_ptr<osg::TexGen> texgen=new osg::TexGen();
texgen->setMode(osg::TexGen::NORMAL_MAP);
//设置纹理环境,模式为BLEND
osg::ref_ptr<osg::TexEnv> texenv=new osg::TexEnv;
texenv->setMode(osg::TexEnv::Mode::ADD);
texenv->setColor(osg::Vec4(0.6,0.6,0.6,0.0));
//启动单元一自动生成纹理坐标,并使用纹理
osg::ref_ptr<osg::StateSet> state=new osg::StateSet;
state->setTextureAttributeAndModes(1,texture.get(),osg::StateAttribute::ON);
state->setTextureAttributeAndModes(1,texgen.get(),osg::StateAttribute::ON);
// state->setTextureAttribute(1,texenv.get());
model->setStateSet(state.get());
}
viewer.setSceneData(model.get());
}
viewer.run();
return a.exec();
}
本文介绍了一种方法,通过加载'cow.osg'模型并使用OSG库来创建和应用256x256的红色纹理。代码中创建了一个纹理对象,设置了纹理坐标生成模式为法线映射,并设置了纹理环境为颜色混合,最终将纹理应用到模型上,使得模型显示所设定的颜色。
&spm=1001.2101.3001.5002&articleId=77163012&d=1&t=3&u=23063f8aa12e402481df6cff8f9cf3d2)
2910

被折叠的 条评论
为什么被折叠?



