2013-05-22 29 views
0

我有一个flt模型,它引用了* tga纹理文件。我使用Nvidia纹理使用工具(nvdxt.exe)将这些* .tga文件转换为* .dds文件。如何将纹理应用于openscenegraph中的模型?

我知道如何阅读和纹理文件申请单的.dds到我的模型(terrain.flt): -

osg::ref_ptr<osg::Node> terrainModel (osgDB::readNodeFile("c:/my_folder/terrain.flt")); 
osg::ref_ptr<osg::Texture2D> tex (new osg::Texture2D); 
osg::ref_ptr<osg::Image> image (osgDB::readImageFile("c:/my_folder/road.dds ")); 

tex->setImage(image.get()); 

osg::ref_ptr<osg::StateSet> state=terrainModel->getOrCreateStateSet(); 

state->setTextureAttributeAndModes(0,tex.get(),osg::StateAttribute::ON); 

,但我不知道如何阅读和应用所有这些纹理*的.dds到我的模型(terrain.flt)。

我尝试: -

osg::ref_ptr<osg::Node> terrainModel (osgDB::readNodeFile("c:/my_folder/terrain.flt")); 

osg::ref_ptr<osg::Texture2DArray> texArray (new osg::Texture2DArray); 

for(int i=0;i<my_folder_files.size();i++) 
{ 
    osg::ref_ptr<osg::Image> image (osgDB::readImageFile("c:/my_folder/"+file(i))); 
    texArray->setImage(i,image); 

} 

osg::ref_ptr<osg::StateSet> state=terrainModel->getOrCreateStateSet(); 

state->setTextureAttributeAndModes(0,texArray.get(),osg::StateAttribute::ON); 

,但是,它不工作。帮我。

回答

1
osg::ref_ptr<osg::Node> terrainModel (osgDB::readNodeFile("c:/my_folder/terrain.flt")); 
osg::Texture2D* texture = new osg::Texture2D; 

osg::ref_ptr<osg::Image> image (osgDB::readImageFile("c:/my_folder/road.dds ")); 
texture->setImage(image.get()); 

texture->SetWrap(osg::Texture2D::WrapParameter::wrap_s,osg::Texture2D::Wrapmode::Mirror); 
texture->SetWrap(osg::Texture2D::WrapParameter::wrap_t,osg::Texture2D::Wrapmode::Mirror); 
texture->SetWrap(osg::Texture2D::WrapParameter::wrap_r,osg::Texture2D::Wrapmode::Mirror); 

texture->setFilter(osg::texture2D::FilterParameter::MIN_FILTER,osg::Texture2D::FilterMode::LINEAR); 
texture->setFilter(osg::texture2D::FilterParameter::MAG_FILTER,osg::Texture2D::FilterMode::LINEAR); 

osg::material *material = new osg::material; 
osg::stateset *stateset = new osg::stateset; 

stateset->setTextureAttribute(0,texture,osg::stateattribute::OVERRIDE); 
stateset->setTextureMode(0,GL_TEXTURE_2D,osg::stateattribute::ON|osg::stateattribute::OVERRIDE); 
stateset->setTextureMode(0,GL_TEXTURE_GEN_S,osg::stateattribute::ON|osg::stateattribute::OVERRIDE); 
stateset->setTextureMode(0,GL_TEXTURE_GEN_T,osg::stateattribute::ON|osg::stateattribute::OVERRIDE); 
stateset->setAttribute(material,osg::stateattribute::OVERRIDE); 
相关问题