用Ogre畫三角形

來源:互聯網
上載者:User

用Ogre畫三角形

         成熟映像引擎往往對底層操作做了層層封裝,使用者或許能輕易地將複雜模型加入到遊戲裡,卻在畫一個三角形時摸不著頭腦。本文闡述如何在Ogre裡畫三角形,如果有些許DirectX或者OpenGL的基礎知識,理解起來會更加容易。

         Ogre用樹結構來組織情境,所有希望被遍曆到的實體都需要掛接在樹節點下,此類有掛接能力的實體需要繼承自MovableObject類;而如果實體想被賦予渲染的能力,則要繼承Renderable類。如此一來,我們的三角形類如下:

class Triangle : public Ogre::MovableObject, public Ogre::Renderable

         接下來要做的基本上就是填充兩個父類中的十多個純虛方法,這裡我們僅挑出最主要的幾個進行說明。

         1. 來自MovableObject的_updateRenderQueue()函數。它在情境遍曆到本實體時被調用,你可以選擇此時將待渲染的對象加入到渲染隊列中,由於我們的三角形本身即繼承自Renderable,所以我們將自己加入到隊列裡:

void Triangle::_updateRenderQueue(Ogre::RenderQueue* queue){queue->addRenderable(this);}

         2. 接著是來自Renderable的getRenderOperation()函數。它在渲染隊列稍後遍曆每一個待渲單位時被調用,你需要選擇這個時刻把渲染相關的資料(頂點資料、組織方式、數目、索引等等)以RenderOperation資料結構的形式提交給引擎。可見RenderOperation決定了你將渲染出何種東西,其實本文展示的核心即是對RenderOperation的定製。

         我們在初始化三角形時構建RenderOperation相關資料:

void Triangle::_createBuffers(){// 三角形的三個頂點位置資料float vertices[3][3] = {-1.0f, 1.0f, 0.0f,// 0 position1.0f, 1.0f, 0.0f,// 1 position0.0f, -1.0f, 0.0f,// 2 position};// 頂點顏色Ogre::RenderSystem* rs = Ogre::Root::getSingleton().getRenderSystem();Ogre::RGBA colours[3];rs->convertColourValue(Ogre::ColourValue(1.0f, 0.0f, 0.0f), &colours[0]);// 0 colourrs->convertColourValue(Ogre::ColourValue(0.0f, 1.0f, 0.0f), &colours[1]);// 1 colourrs->convertColourValue(Ogre::ColourValue(0.0f, 0.0f, 1.0f), &colours[2]);// 2 colour// 頂點索引Ogre::ushort faces[3] = {0, 1, 2,// 0 face};// 建立VertexData對象管理頂點資料mVertexData = new Ogre::VertexData();mVertexData->vertexStart = 0;mVertexData->vertexCount = 3;Ogre::VertexDeclaration* decl = mVertexData->vertexDeclaration;Ogre::VertexBufferBinding* binding = mVertexData->vertexBufferBinding;// 設定頂點聲明,我們的頂點聲明僅有一個資料流且只包含位置、顏色size_t offset = 0;decl->addElement(0, offset, Ogre::VET_FLOAT3, Ogre::VES_POSITION);offset += Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT3);decl->addElement(0, offset, Ogre::VET_COLOUR, Ogre::VES_DIFFUSE);offset += Ogre::VertexElement::getTypeSize(Ogre::VET_COLOUR);// 建立頂點緩衝並將頂點資料填充進去Ogre::HardwareVertexBufferSharedPtr vertexBuffer = Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(decl->getVertexSize(0), 3,Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);float* lockPtr = static_cast<float*>(vertexBuffer->lock(0, vertexBuffer->getSizeInBytes(), Ogre::HardwareBuffer::HBL_DISCARD));Ogre::RGBA* pCol;for (int i = 0; i < 3; ++i){*lockPtr++ = vertices[i][0];*lockPtr++ = vertices[i][1];*lockPtr++ = vertices[i][2];pCol = static_cast<Ogre::RGBA*>(static_cast<void*>(lockPtr));*pCol++ = colours[i];lockPtr = static_cast<float*>(static_cast<void*>(pCol));}vertexBuffer->unlock();// 將頂點緩衝綁定到0號資料流binding->setBinding(0, vertexBuffer);// 建立IndexData對象管理頂點索引mIndexData = new Ogre::IndexData();mIndexData->indexStart = 0;mIndexData->indexCount = 3;// 建立頂點索引緩衝並填充資料mIndexData->indexBuffer = Ogre::HardwareBufferManager::getSingleton().createIndexBuffer(Ogre::HardwareIndexBuffer::IT_16BIT,mIndexData->indexCount,Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);mIndexData->indexBuffer->writeData(0, mIndexData->indexBuffer->getSizeInBytes(), faces, true);// 設定包圍盒mAABB.merge(Ogre::Vector3(vertices[0][1], vertices[0][2], vertices[0][3]));mAABB.merge(Ogre::Vector3(vertices[1][1], vertices[1][2], vertices[1][3]));mAABB.merge(Ogre::Vector3(vertices[2][1], vertices[2][2], vertices[2][3]));mBoundingRadius = Ogre::Math::boundingRadiusFromAABB(mAABB);}

         然後在getRenderOperation()函數中將其提交上去:

void Triangle::getRenderOperation(Ogre::RenderOperation& op){op.operationType = Ogre::RenderOperation::OT_TRIANGLE_LIST;op.useIndexes = true;op.vertexData = mVertexData;op.indexData = mIndexData;}

         3. 最後還需要提一下來自Renderable的getMaterial()函數,顧名思義,引擎籍此獲知待渲物體的材質,這裡我們建立一個只使用物體頂點色的材質:

Ogre::MaterialPtr material = Ogre::MaterialManager::getSingleton().create("TriangleMaterial", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);material->getTechnique(0)->getPass(0)->setLightingEnabled(false);material->getTechnique(0)->getPass(0)->setCullingMode(Ogre::CULL_NONE);

         之後這個材質將通過setMaterialName()函數賦給三角形以供其渲染時刻提交。

         完成了以上步驟,在主構建函數裡進行如下調用:

Ogre::SceneNode* node = mSceneMgr->getRootSceneNode()->createChildSceneNode("TriangleNode");mTriangle = new Triangle();mTriangle->setMaterialName("TriangleMaterial");node->attachObject(mTriangle);

         運行程式,你將看到一枚彩色的三角形。

 

         某種程度上,在3D世界裡,學會了畫三角形,你就學會了畫任何東西。

         文章配套工程源碼可移步此處下載:http://download.csdn.net/source/3562886,開發環境為VS2008+ Ogre1.7.3。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.