Sunday, July 17, 2011

Maya Viewport 2.0 API

Maya 2012 的重點項目之一就是強化過 viewport 2.0 和 Hardware Renderer 2.0  (http://area.autodesk.com/gdc2011/viewport?KeepThis=true&TB_iframe=true&height=520&width=840),viewport 2.0 是 Maya 開發團隊重新打造,架構在 programmable shader system 之上,想要用來取代舊有 rendering system 的新武器,理由其實不難理解...
舊有的架構雖然也提供了讓開發者直接使用到 DirectX 或是 OpenGL 的 API 或是實作出客製化的 viewport renderer ((用 Maya 當做 shader 開發的工具)),但實際使用過後就知道效能會是一個很大的問題,每個 frame 的 render 都會做一次場景物件的 traverval,設定 geometry data,render state或是 textures 等,怎麼看都覺得快不起來,可是在重新設計的 viewport 2.0 中就不一樣了,從 viewport 2.0 API 的文件裡可以看到 Maya 使用 cache 來對每一個 render item 做管理,儘量重覆使用即有的資料來減少計算,一些 demo 的影片也可以很明顯的看到效能上的差異,但架構上的大變動也意味著開發者也需要做相對應的改變,開發團隊也很貼心的為廣大的開發者們留了一條路,讓新舊 API 可以共存,如果要使用到 viewport 2.0 的功能,那當然是使用新提供的 API 才是比較安全的作法。

先來看 Devkit 中的 footPrintNode 範例,footPrintNode 本來是一個介紹使用 MPxLocator 的範例,在 Maya 2012 中被更新當作  viewport 2.0 MPxDrawOverride 的一個範例,在 initializePlugin 可以注意到在 registerNode 的最後一個參數 classification 設定了 footPrint 這一個 node 需要使用那一種方式來 render,

     status = plugin.registerNode(
                "footPrint",
                footPrint::id,
                &footPrint::creator,
                &footPrint::initialize,
                MPxNode::kLocatorNode,
                &footPrint::drawDbClassification);

在 getClassification command 的文件裡可以看到有那些基本的分類,當然 viewport 2.0 也提供了讓開發者註冊新的類別,像在 footPrintNode 的這個範例中就註冊了 FootPrintDrawOverride 來讓 footPrintNode 使用,所以當切換到 viewport 2.0 時就會使用這個新的 FootPrintDrawOverride 來做 render 的動作

status = MHWRender::MDrawRegistry::registerDrawOverrideCreator(
        footPrint::drawDbClassification,
        footPrint::drawRegistrantId,
        FootPrintDrawOverride::Creator);


void FootPrintDrawOverride::draw(const MHWRender::MDrawContext& context, const MUserData* data)

我們還可以看到一個很重要的 class "MDrawContext",這個 class 可以讓我們拿到一些底層的資訊,例如各種 transformation matrices 或是 render target 的 output buffer size 等,MDrawContext 只有在有需要的時候才會被計算或是 cache,也就是使用者不需要直接access 硬體,使用 MDrawContext 才是最安全而且有效率的作法。

No comments: