OSG 让模型变成你想要的颜色 (贴纹理)

本文介绍了一种方法,通过加载'cow.osg'模型并使用OSG库来创建和应用256x256的红色纹理。代码中创建了一个纹理对象,设置了纹理坐标生成模式为法线映射,并设置了纹理环境为颜色混合,最终将纹理应用到模型上,使得模型显示所设定的颜色。
#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();
}



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值