c++ - 如何将纹理应用于 openscenegraph 中的模型?

标签 c++ opengl openscenegraph

我有一个 flt 模型,它引用了 *tga 纹理文件。我使用 Nvidia 纹理实用工具 (nvdxt.exe) 将这些 *.tga 文件转换为 *.dds 文件。

我知道如何读取单个 .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);

但是,它不起作用。帮助我。

最佳答案

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);

关于c++ - 如何将纹理应用于 openscenegraph 中的模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16692421/

相关文章:

c++ - 为什么 sizeof 表达式不是 2、4、8 等编译时常量?

c++ - 使用 APR 构建 log4cxx

c++ - OGL ESv2 中的同一游戏不适用于 OGL3

c++ - 用 glm::Quat(ernions) 模拟 gluLookAt

c++ - 带有两组 Geodes 的扭曲场景

c++ - 在 Release 中获取 std::bad_alloc 但在 Debug 中不获取

c++ - 重命名(): Access Denied despite full control

c++ - OpenGL 3 : glBindVertexArray invalidates GL_ELEMENT_ARRAY_BUFFER

python - 如何从 Python 使用 C++ OSG 对象?