osg.TextureCubeMap
类表示一个立方体贴图。立方体贴图是由 6 个纹理面组成的一个纹理对象。每个纹理面包含了一个透视视角下的图像,构成了一个立体图案。
要创建一个 osg.TextureCubeMap
对象,可以通过直接实例化 osg::TextureCubeMap
类来实现:
osg::ref_ptr<osg::TextureCubeMap> texture = new osg::TextureCubeMap();
通常情况下,一种更方便的方法是使用工厂方法 osgDB::readImageFile
加载纹理图像,并将其作为参数传递给 osg::TextureCubeMap
的构造函数:
osg::ref_ptr<osg::Image> posX = osgDB::readImageFile("posX.png");
osg::ref_ptr<osg::Image> negX = osgDB::readImageFile("negX.png");
osg::ref_ptr<osg::Image> posY = osgDB::readImageFile("posY.png");
osg::ref_ptr<osg::Image> negY = osgDB::readImageFile("negY.png");
osg::ref_ptr<osg::Image> posZ = osgDB::readImageFile("posZ.png");
osg::ref_ptr<osg::Image> negZ = osgDB::readImageFile("negZ.png");
// 创建立方体贴图对象
osg::ref_ptr<osg::TextureCubeMap> texture = new osg::TextureCubeMap;
texture->setImage(osg::TextureCubeMap::POSITIVE_X, posX.get());
texture->setImage(osg::TextureCubeMap::NEGATIVE_X, negX.get());
texture->setImage(osg::TextureCubeMap::POSITIVE_Y, posY.get());
texture->setImage(osg::TextureCubeMap::NEGATIVE_Y, negY.get());
texture->setImage(osg::TextureCubeMap::POSITIVE_Z, posZ.get());
texture->setImage(osg::TextureCubeMap::NEGATIVE_Z, negZ.get());
osg.TextureCubeMap
类提供了一些选项来控制立方体贴图的内部行为。可以通过 setWrap
、setFilter
、setBorderColor
等函数来设置这些属性。
纹理包裹模式决定了当纹理坐标超出了 0 到 1 的范围之后,纹理将如何继续贴图。可以通过 setWrap
函数来设置。
texture->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE);
texture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);
texture->setWrap(osg::Texture::WRAP_R, osg::Texture::CLAMP_TO_EDGE);
支持的纹理包裹模式有:
osg::Texture::REPEAT
:重复纹理。osg::Texture::CLAMP_TO_EDGE
:将超出范围的部分限制在边缘处。osg::Texture::CLAMP_TO_BORDER
:将超出范围的部分设为指定的边框颜色。osg::Texture::MIRROR
:镜像重复纹理。osg::Texture::MIRROR_ONCE
:对超出范围的纹理进行一次翻转,然后进行重复。纹理过滤模式定义了当将一个纹理像素映射到多个屏幕像素上时,如何取样。可以通过 setFilter
函数来设置。
texture->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR_MIPMAP_LINEAR);
texture->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
支持的纹理过滤模式有:
osg::Texture::NEAREST
:取最近的像素,不进行插值。osg::Texture::LINEAR
:双线性插值。osg::Texture::NEAREST_MIPMAP_NEAREST
:在最近的 mipmap 中取最近的像素,不进行插值。osg::Texture::LINEAR_MIPMAP_NEAREST
:对最近的两个 mipmap 插值,然后对得到的结果取最近的像素。osg::Texture::NEAREST_MIPMAP_LINEAR
:对最近的两个 mipmap 取最近的像素,然后对得到的结果插值。osg::Texture::LINEAR_MIPMAP_LINEAR
:对最近的两个 mipmap 进行双线性插值,然后对得到的结果插值。当使用 osg::Texture::CLAMP_TO_BORDER
包裹模式时,可以通过 setBorderColor
函数来将超出范围的部分设为指定的颜色。
texture->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_BORDER);
texture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_BORDER);
texture->setWrap(osg::Texture::WRAP_R, osg::Texture::CLAMP_TO_BORDER);
texture->setBorderColor(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f)); // RGBA
创建好立方体贴图后,可以使用正常的方式将其应用到场景中的模型上。
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
osg::ref_ptr<osg::Geometry> geometry = osg::createTexturedQuadGeometry(osg::Vec3(0.0f, 0.0f, 0.0f), osg::Vec3(1.0f, 0.0f, 0.0f), osg::Vec3(0.0f,0.0f,1.0f));
geode->addDrawable(geometry.get());
osg::StateSet* stateSet = geode->getOrCreateStateSet();
stateSet->setTextureAttributeAndModes(0, texture.get());
osgViewer::Viewer viewer;
viewer.setSceneData(geode.get());
viewer.run();