真正 rendering 的動作還是交由指定的 shader 來執行,MPxGeometryOverride 可以讓使用者自訂 geometry buffers, index buffers 或是 render items 等讓 Viewport 2.0 來清楚知道要如何畫出某個特定的 DAG 物件,為了要讓 DAG 物件知道要使用那一個 MPxGeometryOverride,我們在初使化的時候就需要明白告訴 Maya,所以,在 apiMeshShape 的 initializePlugin 函式中可以看到以下這一段 code
stat2 = plugin.registerShape( "apiMesh", apiMesh::id, &apiMesh::creator, &apiMesh::initialize, &apiMeshUI::creator, &apiMesh::drawDbClassification ); MString apiMesh::drawDbClassification("drawdb/geometry/apiMesh");這就告訴了 Maya,apiMesh 這一個 shape 要使用我們所定義的 MPxGeometryOverride 來做 rendering 的動作,接著可以看到註冊 MPxGeometryOverride 的地方
stat4 = MHWRender::MDrawRegistry::registerGeometryOverrideCreator( apiMesh::drawDbClassification, apiMesh::drawRegistrantId, apiMeshGeometryOverride::Creator);apiMeshGeomtryOverride 就是我們自訂的 MPxGeometryOverride,主要負責更新 Viewport 2.0 所需要的 geometry buffers 和 indexing information 資料,來看看 apiMeshGeomtryOverride 需要實作那些函式
virtual void updateDG();需要計算 indexing 或是 geometry 資料的物件都必需在這個函式中先 cached 起來,之後如果想要再跟 Maya 要這些物件的資訊都是無效的而且可能會導至 Maya 的不穩定 (也太危險了吧)
virtual void updateRenderItems( const MDagPath& path, MHWRender::MRenderItemList& list);每一個有指定 shader 的物件都會有一個相對應的 render item,在 updateRenderItems 這個函式中,使用者可以指定物件需不需要 enable/disable,除此之外,最重要的就是可以在 updateRenderItems 新增使用者定義的 render items 來畫一些額外的物件,之後,在 populateGeometry 就會依這些新增或是被 enable/disable render items 來產生出最後需被畫的 index buffers 然後再傳給最底層的 Viewport 2.0 engine。
virtual void populateGeometry( const MHWRender::MGeometryRequirements& requirements, MHWRender::MGeometry& data);populateGeometry這個函式負責將最後要被畫的物件 MGeometry 所需要的 vertex buffer 和 index buffer 產生出來,若是在填資訊的時候發生錯誤就會在繪製的時候產生不對的結果 (嗯... 的確非常合理)
整體看來為了要使用 Viewport 2.0 的 MPxGeometryOverride是要付出一些代價的,但是所帶來的效能和使用上的彈性,還是非常值得投資的。
No comments:
Post a Comment