Tuesday, July 26, 2011

Maya Viewport 2.0 - ApiMeshShape 範例

ApiMeshShape 這個範例新增了對 Viewport 2.0 的支援,示範了如何使用MPxGeometryOverride,基本上 MPxGeometryOverride 只是用來定義 geometry 和 render items 的一個介面
真正 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: