Autodesk Maya 2014
UI 描画の機能強化
詳細は「3.9 UI 作成マネージャ」のセクションを参照してください。
ジオメトリの機能強化
シェーダのオーバーライドの機能強化
シェーダ インスタンスの機能強化
- 深度パスのカラーをレンダリングするためのシンプルなストック シェーダが新しく追加されました。
- 次の UI 描画用のストック シェーダが追加されました。
- 各種の線分用シェーダ(破線または実線、太線または細線、一定のカラーまたは頂点ごとのカラーを使用)
- 点線フェース シェーダ
- 均一のセマンティック **RelativeViewportDimensions を指定して、相対的なビューポートの寸法を取得できます。このセマンティックは、四角形のレンダリング操作で UV 変換を調整するために使用できます。
次の例では、テクスチャ座標を変更します。
float4 gUVTransform : RelativeViewportDimensions; In.UV * gUVTransform.zw + gUVTransform.xy”
次のシェーダは新しいセマンティックを使用するように修正されました。
- OpenGL: BlendGL.cgfx、BlurGL.cgfx、ThresholdGL.cgfx、AnaglyphGL.cgfx、FreeViewGL.cgfx、CheckerBoardGL.cgfx、InterlaceGL.cgfx
- Direct3D10: Blend10.fx、Blur.fx、Threshold10.fx、Anaglyph10.fx、FreeView10.fx
- フラグメント ベースのシェーダ インスタンスの作成メソッド MShaderManager::getFragmentShader() が新しく追加されました。名前シェーダ フラグメントまたはフラグメント グラフから生成されたシェーダの新しいインスタンスを返します。
- MShaderInstance オブジェクトで clone() インタフェースがサポートされるようになりました。このインタフェースは、多数の同一のシェーダが高パフォーマンスで動作する必要がある状況で使用されます。
テクスチャリングの機能強化
- テクスチャ API に多数の修正が行われ、カラー テクスチャの取得、キャッシュ、および更新方法が強化されました。
- 取得に関しては、MTextureManager の acquireTexture() メソッドが修正され、作成時に NULL データを渡したり、名前なしテクスチャ(空の文字列)を使用したりできるようになりました。名前なしテクスチャは、内部テクスチャ キャッシュ システムによってキャッシュされません。そのため、取得では、メソッド呼び出しのたびに新しいテクスチャが作成されます。名前付きテクスチャの動作はこれまでと同じです。同じ名前のテクスチャがキャッシュに存在する場合は、そのテクスチャが返されます。
- 一般に、テクスチャの連続的な再取得はお勧めできません。そのため、既存のテクスチャを更新する新しいインタフェースが MTexture に追加されました。
- MStatus update(const void* pixelData, bool generateMipMaps, unsigned int rowPitch=0);
- MStatus update(const MImage &image, bool generateMipMaps);
新しいメソッド MTexture::bytesPerPixel() および既存のメソッド MTexture::rawData() とともに、テクスチャを更新する方法は多数あります。
- 既存の MTexture から未処理データを抽出し、更新に使用できます。この場合は、行パディングが存在するときにデータが適切に転送されるように、update() の呼び出し時に MTexture の rowPitch を使用することが重要です。これは DirectX で作成されたテクスチャに影響します。
- 新しい未処理データを渡して既存の MTexture を更新できます。データが正しいサイズであることを確認するのは呼び出し側です。
MImage のデータを使用して既存の MTexture を更新できます。テクスチャの形式が MImage の形式(現在は 4 バイト、チャネル RGBA カラーごとに 8 バイト)に一致することを確認するのは呼び出し側です。bytesPerPixel() メソッドを使用すると、MTexture に一致する形式を照会することができます。
この更新メカニズムは現在、配列以外の 2D テクスチャの更新に限定されます。
各メソッドの呼び出しには固有のコストがあります。状況に応じて異なるメソッドを使用しなければならない場合があります。
- RawData() が GPU から CPU にメモリをコピーします。
- Update() が未処理のピクセル データを使用して CPU のデータを GPU に転送します。
Update() が MImage を使用して GPU メモリを CPU にマップし、コピーを実行して、GPU にマップし直します。
既存のプラグイン hwAPITextureTest と新しいプラグイン viewImageBlitOverride は、カラー テクスチャを更新するさまざまな方法を示します。前者には、表示する前にテクスチャのピクセルを反転する新しいオプションがあります。後者では、レンダー オーバーライド(MRenderOverride)をリフレッシュするたびにテクスチャを更新できます。
- MRenderUtil::eval2dTexture() は、1 つまたは複数の (u,v) 位置でサポートされるテクスチャ ノードの評価を許可します。
- 深度バッファへのレンダリングに適したテクスチャを取得するための便利な方法として、次のインタフェースが新しく追加されました。
- MTexture* acquireDepthTexture(const MString &textureName, const MImage &image, bool generateMipMaps, const MDepthNormalizationDescription *normalizationDesc);
- MTexture* acquireDepthTexture(const MString &textureName, float *pixelData, unsigned int width, unsigned int height, bool generateMipMaps, const MDepthNormalizationDescription *normalizationDesc);
- これらのインタフェースに使用される内部形式は R32F (深度形式ではなく、赤チャネルとして保存されている単一チャネルの 32 ビット浮動小数点)です。
- これらのメソッドは、データを深度バッファに転送するのに適した\[0…1\]の範囲に入力データを正規化できます。新しい構造 MDepthNormalizationDescription は、プラグインの作成者に正規化の入力パラメータを示す方法です。これは入力データが Maya ソフトウェア レンダラによって生成された深度バッファに使用されている、したがって MImage の深度バッファに格納されているデータに使用されている規則に準拠することを前提とします。テクスチャが正規化されずに作成された場合、レンダー時間に正規化するための適切なシェーダ ロジックを提供するのはプラグインの作成者です。
- MImage を入力として受け取る acquireDepthTexture() インタフェースは、格納された有効な深度バッファが存在することを前提とします。
- 正規化されたデータの計算に役立つ新しいメソッドが MImage に追加されました。このメソッドは、MImage の深度バッファの深度値の範囲を返します。
- MStatus getDepthMapRange( float &minValue, float &maxValue ) const;
プラグイン viewImageBlitOverride は、正規化された深度テクスチャを塗り潰すための未処理データを生成するコード例と、ディスク上の IFF ファイルから既存の深度バッファを読み込むためのコード例を提供します。
深度に転送するために、深度ステンシル状態のオーバーライドがカスタム MQuadRender で使用されます。
状態設定の変更の詳細については、MQuadRender の関連する変更を参照してください(「MQuadRender」を参照)。
ライティングの機能強化
- 無制限のライト アクセス:
- ライト情報にアクセスするための既存のインタフェースが修正され、ビューポート 2.0 レンダラのライトの制限数の設定を無視するかどうか指定できるようになりました。アクセス可能なシャドウ マップの数は、現在は引き続きライトの制限数に固定されます。
次のインタフェースが新しい LightFilter パラメータを受け入れるようになりました。
- 「要求による」シャドウの更新
- 特定のライト DAG オブジェクトのシャドウ マップがビューポート 2.0 レンダラのライトの制限数設定を超えている場合でも、それらのシャドウ マップの計算を要求することができます。MRenderer::setLightRequiresShadows() メソッドを使用すると、このような要求をキューに入れたり、キューから除去したりできます。このメソッドは、特定のシャドウ マップの計算を強制することも、リフレッシュまたは新規レンダーの実行を強制することもありません。シャドウ マップ更新の必要性のチェックをトリガします。MRenderer::setLightsAndShadowsDirty() (「変更管理」を参照)を使用すると、必要に応じて強制的に計算することができます。
- このメソッドがフレームのレンダリング内から呼び出された場合、シャドウ マップ計算の更新はすべて、次のシーンの更新時に行われます。たとえば、ハードウェア シェーダ プラグイン(MPxShaderOverride)内から呼び出された場合、更新は次のフレーム(リフレッシュ)で実行されます。レンダー オーバーライド操作から呼び出された場合、次のシーン レンダーによって更新がトリガされます。シーン レンダーは、オーバーライド内から呼び出された次の MSceneRender か、レンダー オーバーライドがない場合にレンダラによって内部的に呼び出された次のシーン レンダーのいずれかです。
このインタフェースを使用したコード例は、dx11Shader (MPxShaderOverride)および viewRenderOverrideShadows (MRenderOverride)プラグインにあります。dx11Shader プラグインには、ライトのバインドが変更されたときの追加リフレッシュの呼び出しを示すコードがあります。
- レンダー オーバーライドのライティング/シャドーイング インタフェースの機能強化
- 通常、ライト情報はシーン レンダー(MSceneRender)中にのみ更新されます。シャドウ要求がカスタム レンダー オーバーライドのユーザ操作(MUserRenderOperation)内から実行された場合は、最後の使用可能なライト情報のみを使用できます。ユーザ操作にライト情報が必要な場合は、新しい仮想メソッド MUserRenderOperation::requiresLightData() をオーバーライドして、true を返すように設定できます。
- レンダー オーバーライドのシーン レンダーが更新後のシャドウ マップなどの情報にアクセスできるようにするために、MSceneRender::preSceneRender() および MSceneRender::postSceneRender() の 2 つのメソッドが新しく追加されました。これらのメソッドは、シャドウ マップの更新またはシーンのレンダリングのいずれかの前後に呼び出されます。この時点で、現在の描画コンテキスト、したがってライティング/シャドーイング情報(MLightParameterInformation)が利用できます。
新しいインタフェースを使用する例としては、新しい viewRenderOverrideShadows レンダー オーバーライド プラグインがあります。このプラグインは、ユーザ操作を実行してシャドウ要求をキューに格納した後、カスタム シーン レンダーでそのシャドウ要求を使用します。プリシーン レンダー メソッドは、要求されたシャドウ マップを抽出するようにオーバーライドされます。これにより、カスタム シェーダがシーンのレンダリング中にこのシャドウ マップを使用できるようになります。ライトの制限数を超えるライトおよびシャドウ情報にアクセスできます。
レンダー項目の機能強化
- MRenderItem のインスタンスは、今後は直接に作成または削除されない可能性があります。プラグインは、MRenderItem でスタティックな Create() および Destroy() メソッドを使用しなければならなくなりました。この変更により、メモリの割り当て/割り当て解除が別々の DLL で行われるときに発生する安定性の問題が解決されます。
- レンダー項目に「バウンディング ボックス」ビューポート モードを指定できるようになりました。
- レンダー項目の変換行列を設定できるようになりました。
- スクリーンスペース アンビエント オクルージョンやモーション ブラーなどのポスト効果にレンダー項目を含める必要があるかどうかを設定できるようになりました。
- レンダー項目の「深度の優先順位」を設定できるようになりました。「深度の優先順位」は、描画時にレンダー項目がアクティブなカメラに向かって移動する距離を設定します。これは、深度が相互にオーバーラップする描画を使用するレンダー項目で発生する可能性がある深度の競合を防ぐのに役立ちます。たとえば、レンダー項目の描画ワイヤフレームと別の塗り潰し描画が同じ深度で描画される場合があります。ワイヤフレーム項目がシェーディング項目によって隠されないようにするために、ワイヤフレーム項目の深度の優先順位を「高く」して隠されるのを回避できます。詳細については、depthPriority() メソッドを参照してください。
- 以前は、プラグインによって作成された MRenderItem はすべて、MPxGeometryOverride::updateRenderItems() が呼び出されるたびに、シャドウの投影および受像のステータスが自動的に設定されました。内部で作成されたレンダー項目については引き続きこの処理が行われますが、プラグインによって作成されたレンダー項目については行われません。関連付けられている DAG オブジェクトのステータスを追跡するか、他のロジックに基づいて値を設定するのはプラグインです。ワイヤフレーム モードで描画としてマークされている項目はすべて、シャドウを投影することも受像することもありません。線分またはポイントを使用して描画するレンダー項目は、ワイヤフレーム モードで描画するようマークされない限り投影することができます。プラグイン apiMeshShape は、さまざまな用途を示す例を提供します。
- 次のメソッドは MRenderItem で公開されていますが、内部で作成されるレンダー項目には影響しません。
- setDrawMode()
- setMatrix()
- setShader()
- setExcludedFromPostEffects()
- castShadows()
- receivesShadows()
- depthPriority()
- setExclucedFromPostEffects() メソッドは、レンダー項目がシェーディング モードまたはテクスチャ モードの描画としてマークされている場合に、スクリーン スペース アンビエント オクルージョンを無効にするだけです。項目がワイヤフレーム モードの描画としてマークされている場合は、すべてのポスト効果が無効になります(スクリーンスペース アンビエント オクルージョン、モーション ブラー、および被写界深度)。
状態の機能強化
パス情報の機能強化
- MUIDrawManager インタフェースを追加する一環として、いくつかの新しいパス コンテキスト セマンティックが公開されました。
- UI ジオメトリ: UI が描画されます。
- プリ UI ジオメトリ: UI がシーンの前に描画されます(地表プレーンなど)。
- ポスト UI ジオメトリ: UI が塗り潰し描画に対して相対的に描画されます(サーフェス上のワイヤフレームやコンポーネントなど)。
- 不透明 UI: 不透明 UI が描画されます。
- 透明 UI: 透明 UI が描画されます。
- X 線 UI: X 線モードの UI が描画されます。
レンダーのオーバーライドの機能強化
- UI のみを描画するシーン レンダー操作に影響を与えないようにポスト効果が修正されました。
- シーン レンダー操作に対するポスト効果を明示的に無効にできるようになりました。
MQuadRender で状態セッタを指定できるようになりました。既定では、クアッド レンダリング操作のためにジオメトリをレンダリングするときに、ブレンディングが無効になり、深度書き込みが無効になり、カリングが無効になります。MQuadRender から派生したクラスによって次のいずれかの方法を実装し、特定の状態に対する既定の動作を置き換えることができます。
- virtual const MDepthStencilState* depthStencilStateOverride(); // Override depth-stencil state
- virtual const MRasterizerState* rastersizerStateOverride(); // Override rasterizer state
virtual const MBlendState* blendStateOverride(); // Override blend state
オーバーライドが特定の状態に対して指定されている場合、既定の状態はオーバーライドされていないその他の状態に使用されます。
開発キットの viewImageBlitOverride プラグインは、深度書き込み状態のオーバーライドの例を提供します。
- MRenderer::theRenderer() がオプションの initializeRenderer パラメータを受け取るようになりました。False が渡された場合は、レンダラの完全な初期化を抑止します。 これによりレンダラの完全初期化のオーバーヘッドを避けることができ、レンダリングのオーバーライドを登録することによって、プラグインのロードを高速化することができます。
変更管理の機能強化
描画オーバーライドの機能強化
- prepareForDraw() インタフェースは、次のように MFrameContext をパラメータとして受け入れるようになりました。
virtual MUserData* prepareForDraw( const MDagPath& objPath, const MDagPath& cameraPath, const MFrameContext& frameContext, MUserData* oldData) = 0
- ジオメトリ情報はビューポート アトリビュート(ビューポートのサイズなど)に基づいて計算される場合があるため、プラグインの開発者は描画データ ステージの準備にこの情報が必要になることがあります。
ジオメトリのオーバーライドの機能強化
- Maya DAG オブジェクトのテンプレート化と非テンプレート化を切り替えると、自動的にシェーディング レンダー項目の表示が切り替わります。これにより、既定のビューポート インタフェースに使用されるロジックとの一貫性が保たれます。プラグインでは、必要に応じてこの動作をオーバーライドして、これらの項目のいずれかまたはすべてを有効/無効にすることができます。
- MPxGeometryOverride を使用する apiMeshShape の例の改善このコードは次のことを示します。
- さまざまな表示モードでのワイヤフレームの描画(表示モードの検出)、オブジェクトがアクティブなときに限らないワイヤフレームの描画(アクティブな表示モード)。
- 「太点」ストック シェーダを使用した非アクティブおよびアクティブな頂点の描画。
- 太線および破線ストック シェーダを取得するためのサンプルコード。
- オブジェクトがテンプレート化されるときのレンダー項目の非表示と、描画テンプレート用の適切なレンダー項目のサポート。
- UI 描画(アクティブおよび非アクティブな頂点の描画など)の間で深度の競合を防ぐための新しい MRenderItem::depthPriority() メソッドの使用法。
Maya コールバックの機能強化
MFrameContext は Maya 2014 の新しいインタフェースです。フレーム レンダーごとに使用可能な情報を提供するように設計されています。これには、レンダー ターゲット、ビューポート サイズ、カメラ情報などが含まれます。
相対スコープに関しては、MFrameContext は、1 つまたは複数の「パス」の期間(MPassContext)と実際の描画の期間(MDrawContext)を含むものとみなすことができます。
MDrawContext は MFrameContext から派生し、すべての仮想メソッドの実装を提供します。これらのメソッドから返される値は、MFrameContext と MDrawContext とで若干異なります。MFrameContext は Maya から値を取得し、MDrawContext は GPU デバイスの状態から値を取得するからです。また、MFrameContext::getMatrix() は、オブジェクトからワールドへの行列を必要とする行列タイプの値を返すことができません。この情報は描画時にしか使用できないからです。
フレーム コンテキスト情報には次の情報が含まれます。
- カメラとビューの情報。
- ビューポートとアクティブなレンダー ターゲットの情報。
- 表示スタイル(ビューポート 2.0 のレンダー グローバルとビューポート オプションの模倣)。
- ライティング モードとライトの制限数(同じ)。
- アクティブなポスト効果の表示。
- 使用されている透明度アルゴリズムの表示。
- ビューポート シェーディング メニューでのグローバルなライン幅の設定。
MPxSubSceneOverride は Maya 2014 の新しいインタフェースです。MPxDrawOverride および MPxGeometryOverride に代わるインタフェースで、多数の独立した描画可能オブジェクトを生成する必要があるビューポート 2.0 のプラグイン DAG オブジェクトを表すために特別に最適化されています。たとえば、サブシーン全体を定義できるプラグイン ノード(gpuCache プラグインなど)はこのインタフェースによく適合します。単一ノードは何万もの描画可能オブジェクトを生成しなければならない場合があるからです。
MPxSubSceneOverride は、実装に与えられるコントロールの量に関して、MPxDrawOverride と MPxGeometryOverride の間に位置します。MPxDrawOverride はオブジェクト全体の描画を完全にコントロールできますが、結果として実装は描画についてのすべての責任を負います。MPxGeometryOverride は、比較的簡単に使用できますが、結果として使用できる描画のコントロールは制限されます。MPxSubSceneOverride はすべてのレンダー項目、ジオメトリ、シェーダを完全に定義し、高度なコントロールを提供できます。ただし、この定義はハードウェアの描画 API から抽象化されます。そのため、DirectX と OpenGL の両方のサポートを得るための実装が 1 つで済みます。さらに、レンダー項目の描画は Maya によって処理されるため、項目は Maya レンダリング パイプラインに完全に参加できます(スクリーンスペース アンビエント オクルージョン、透明度のソート、影付け/影受けなどのスクリーンスペース エフェクトを含む)。
Maya 2014 API は、ゴースト化オブジェクトをレンダリングする際に、レンダー オーバーライドを明示的に呼び出しません。
以前は、オーバーライドがアタッチされている DAG オブジェクトがゴースト化に設定されている場合に、レンダー項目または描画コードをゴーストごとに 1 回ずつ複数回呼び出すことができました。
これはもうできません。そのため、プラグインの独自のゴースト化を実行するコードは、プラグインの作成者が記述する必要があります。
影響を受けるクラスは MPxDrawOverride、MPxGeometryOverride、および MPxSubSceneOverride です。
MetaData C++ API の .NET API へのポートが次のように大幅に修正および改良されました。
- 主要なクラスで IDictionary や IEnumerable などの標準の .NET インタフェースがサポートされるようになりました。
- データ記述とデータ アクセスの概念が簡素化され、ユーザはデータに対して .NET 型を指定すれば済むようになりました。これにより、Structure クラスと Handle クラスを使用する必要が完全になくなりました。これらのクラスは、このクライアント タイプから自動的に作成されるからです。
詳細については、「MetaData」を参照してください。
- MPxEditData により、リファレンス編集と関連付けるための、独自のカスタム データを作成することができます。
一般的なメタデータの新しい API (ブラインド データ)
- MFileIO: 永続的なシーンレベルのメタデータ(つまり、シーン ファイルと共に格納される)の指定を許可するために、setMetadata()、deleteMetadata()、metadata() の各メソッドが追加されました。
- MnObject::fnObject および fOwn はプライベートになりました。これらは使用しないでください。使用する場合は、必要に応じて変更を加える必要があります。
- MRampAttribute を使いやすくするために、数多くのメソッドが追加されました。ランプに新しい値を設定しやすくするために setRamp() が追加され、初期値を使用してランプを作成しやすくするために createRamp() が追加されました。さらに、sort()、pack()、および hasIndex() が追加されました。
- evalNoSelectNotify コマンドは、選択変更通知を無効にした状態でコマンドを実行します。これにより、現在の選択を変更するタイプのコマンド(createNode など)をスクリプトが大量に実行しているケースで、最終的に何が選択されているかのみが重要である場合に、パフォーマンスを著しく向上させることができます。
プラグインの変換
プラグインの作成者は、ビューポート 2.0 でプラグインの変換が認識されるようにするには、変換を登録する際に適切な分類文字列 drawdb/geometry/transform を追加する必要があることにご注意ください。この処理は次の操作のために必要となります。
- ローカルの回転軸とピボットの描画。
オブジェクトの変換による DAG 内のオブジェクトの下でペアレント化されている子の移動。
たとえば、rockingTransform プラグインの場合、コードは次のようになります。
// Classify the node as a transform. This causes Viewport // 2.0 to treat the node the same way it treats a regular // transform node. const MString classification = "drawdb/geometry/transform"; status = plugin.registerTransform("rockingTransform", rockingTransformNode::id, &rockingTransformNode::creator, &rockingTransformNode::initialize, &rockingTransformMatrix::creator, rockingTransformMatrix::id, &classification);
この機能は Maya 2012 から使用できるようになりました。
Maya 2014 では、registerTransform() が更新され、他の drawdb 分類が指定されていない場合に drawdb/geometry/transform 分類が自動的に追加されるようになりました。getClassification コマンドのマニュアルも更新され、ビューポート 2.0 によって認識される分類の一覧が追加されました。
「ビューポート 2.0 API」の章の更新