1. 点
用一个球代替
osg::ShapeDrawable* sd = new osg::ShapeDrawable(new osg::Sphere( root->getBound().center(), 2));
osg::Geode* lightNode = new osg::Geode;
lightNode->addDrawable(sd);
lightNode->getOrCreateStateSet()->setTextureAttributeAndModes(0, new osg::Texture2D(osgDB::readImageFile("Images/land_shallow_topo_2048.jpg")));
root->addChild(lightNode);
纹理的使用如下:
我们使用StateSet类来控制几何基元的渲染状态。下面的代码演示了从文件中读取纹理,创建StateSet类并设置纹理,以及关联StateSet到场景节点的方法。代码的前一部分与上一章教程相同。首先我们初始化视窗并创建只有单一金字塔的场景。
int main()
{
// 声明场景的根节点
osg::Group* root = new osg::Group();
osg::Geode* pyramidGeode = createPyramid();
root->addChild(pyramidGeode);
现在我们添加纹理。我们定义一个纹理实例并设置其数据变更类型为“DYNAMIC”(否则的话,OSG的优化过程中可能会自动去除这个纹理)。纹理类封装了OpenGL纹理模式(GL_TEXTURE_WRAP,GL_TEXTURE_FILTER等),以及一个osg::Image对象。下面的代码将演示如何从文件读入osg::Image实例并将其关联到纹理。
osg::Texture2D* KLN89FaceTexture = new osg::Texture2D;
//避免在优化过程中出错
KLN89FaceTexture->setDataVariance(osg::Object::DYNAMIC);
// 从文件读取图片
osg::Image* klnFace = osgDB::readImageFile("KLN89FaceB.tga");
if (!klnFace)
{
std::cout << " couldn't find texture, quiting." << std::endl;
return -1;
}
// 将图片关联到纹理
KLN89FaceTexture->setImage(klnFace);
Texture类可以关联到渲染状态StateSet类。下一步我们将创建一个StateSet,将纹理关联到这个渲染状态实例并允许使用纹理,最后将StateSet关联到几何体节点上。
// 创建StateSet
osg::StateSet* stateOne = new osg::StateSet();
// 将纹理关联给StateSet的纹理单元0
stateOne->setTextureAttributeAndModes
(0,KLN89FaceTexture,osg::StateAttribute::ON);
// 将渲染状态关联给金字塔节点
pyramidGeode->setStateSet(stateOne);
osgViewer::Viewer viewer;
//最后我们