代码之家  ›  专栏  ›  技术社区  ›  Nathan Osman

为什么三角形在这个网格中被裁剪?

  •  5
  • Nathan Osman  · 技术社区  · 14 年前

    我有以下代码:

    #include <irrlicht.h>
    
    using namespace irr;
    
    using namespace core;
    using namespace scene;
    using namespace video;
    using namespace io;
    using namespace gui;
    
    int main(int argc, char** argv)
    {
        IrrlichtDevice *device =
            createDevice(EDT_SOFTWARE, dimension2d<unsigned int>(640, 480), 16,
                false, false, false, 0);
    
        device->setWindowCaption(L"Train Simulator Demo");
    
        IVideoDriver* driver = device->getVideoDriver();
        ISceneManager* smgr = device->getSceneManager();
        IGUIEnvironment* guienv = device->getGUIEnvironment();
    
        IAnimatedMesh* mesh1 = smgr->getMesh("media/simple_engine.b3d");
        IAnimatedMesh* mesh2 = smgr->getMesh("media/simple_track.b3d");
    
        IAnimatedMeshSceneNode* node1 = smgr->addAnimatedMeshSceneNode( mesh1 );
        IAnimatedMeshSceneNode* node2 = smgr->addAnimatedMeshSceneNode( mesh2 );
    
        if (node1)
            node1->setMaterialFlag(EMF_LIGHTING, false);
    
        if (node2)
        {
            node2->setMaterialFlag(EMF_LIGHTING, false);
            node2->setMaterialTexture( 0, driver->getTexture("media/grass.jpg") );
        }
    
        ICameraSceneNode * pCamera = smgr->addCameraSceneNode(0, vector3df(5,0,5), vector3df(0,0,0));
    
        pCamera->setNearValue(0.5f);
        pCamera->setFarValue(40.0f);
    
        while(device->run())
        {
            driver->beginScene(true, true, SColor(0,0,0,0));
    
            u32 cur_time = device->getTimer()->getTime();
            float f_time = (float)cur_time / 1000.0f;
    
            // Change the camera
            pCamera->setPosition(vector3df(sinf(f_time) * 8.0f ,3.0f ,cosf(f_time) * 8.0f));
    
            smgr->drawAll();
            guienv->drawAll();
    
            driver->endScene();
        }
    
        device->drop();
    
        return 0;
    }
    

    …运行时会产生以下结果:

    alt text

    ……这很好,只是草应该是16×16的正方形网格,看起来有些三角形是因为某种原因被修剪的。这似乎还与三角形仅部分显示在屏幕上有关,因为仅显示完全位于窗口视区内的三角形。我该怎么解决?

    附加:

    操作系统: Ubuntu 10.04 64位
    鬼火 版本:1.7 beta

    1 回复  |  直到 10 年前
        1
  •  3
  •   Nathan Osman    14 年前

    结果发现问题是我使用的是软件渲染器而不是OpenGL渲染器。

    所以第13行:

    IrrlichtDevice *device =
        createDevice(EDT_SOFTWARE, dimension2d<unsigned int>(640, 480), 16,
            false, false, false, 0);
    

    变成:

    IrrlichtDevice *device =
        createDevice(EDT_OPENGL, dimension2d<unsigned int>(640, 480), 16,
            false, false, false, 0);
    
    推荐文章