2013-02-18 72 views
0

我正在尝试使用从图像加载的纹理来创建由createTexturedQuadGeometry生成的四边形几何对象。然后,我将这个drawable添加到一个节点,将该节点添加到根并呈现层次结构。OpenScenegraph:Texture Mapping Quad

下面的代码是我如何做到的。代码编译并运行,但我只获得一个空白的黑屏而不是指定的图像。有人能指出什么是错的吗?

int main(int argc, char** argv) 
{ 
    osg::ref_ptr<osg::Group> root = new osg::Group; 

    osg::ref_ptr<osg::Texture2D> testTexture = new osg::Texture2D; 
    osg::ref_ptr<osg::Image> testImage = osgDB::readImageFile("testImage.png"); 
    assert(testImage.valid()); 
    int viewWidth = testImage->s(); 
    int viewHeight = testImage->t(); 
    testTexture->setImage(testImage); 

    osg::ref_ptr<osg::Geometry> pictureQuad = osg::createTexturedQuadGeometry(osg::Vec3(0.0f,0.0f,0.0f), 
                       osg::Vec3(viewWidth,0.0f,0.0f), 
                       osg::Vec3(0.0f,0.0f,viewHeight), 
                       0.0f, 
                       viewWidth, 
                       viewHeight, 
                       1.0f); 

    pictureQuad->getOrCreateStateSet()->setTextureAttributeAndModes(0, testTexture.get()); 
    pictureQuad->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON); 
    osg::ref_ptr<osg::Geode> textureHolder = new osg::Geode(); 
    textureHolder->addDrawable(pictureQuad); 
    root->addChild(textureHolder); 

    osgViewer::Viewer viewer; 
    viewer.setSceneData(root.get()); 
    viewer.run(); 
} 

回答

4

所以,我碰巧找出错误。

createTexturedQuadGeometry需要标准化的纹理坐标。

所以,

osg::ref_ptr<osg::Geometry> pictureQuad = osg::createTexturedQuadGeometry(osg::Vec3(0.0f,0.0f,0.0f), 
                       osg::Vec3(viewWidth,0.0f,0.0f), 
                       osg::Vec3(0.0f,0.0f,viewHeight), 
                       0.0f, 
                       0.0f, 
                       1.0f, 
                       1.0f); 

解决了这个问题。