チュートリアル / 読んで触ってよくわかる!Mayaを使いこなす為のAtoZ
第37回:ポリゴン数をリストアップしよう!(1/4)

  • Maya
  • ゲーム
  • コラム
  • チュートリアル
  • モデリング
  • 中級者
  • 学生・初心者
  • 教育
  • 映画・TV

「処理が重い。ポリゴンを減らせ!」

ゲーム制作をしていると一年に365回ぐらい聞くセリフです:)

実際はポリゴン数よりもテクスチャの大きさとかシェーダーの方が負荷になっていて、ポリゴン数を減らしたところであまりパフォーマンスは変わらなかったりするのですが…。けれどもポリゴン数が少なければパフォーマンスに良いのも事実です!※1

Mayaでポリゴン数を確認するにはヘッドアップディスプレイを使用します。(Display > Heads Up Display > Poly Count)



「Tris」の項目にポリゴン数(三角形の数)が表示されます。ビューに描画されるすべてのポリゴン数、選択したモデルでのポリゴン数を表示してくれて便利です。

ポリゴンを減らす時は、
・シーン全体を見て
・ポリゴン数が多そうなモデルを選択して
・ヘッドアップディスプレイでポリゴン数を確認して
・ポリゴン数が多ければ減らす
という作業を繰り返します。

まあ、これだと選んだモデルが本当にシーン内で最もポリゴンを使っているかどうか怪しいですし、リダクション作業をする前に「作業方針」を立てられません。

作業方針?

シーン内に沢山モデルがある時、
・数個のモデルのポリゴン数が極端に多い(下図左)
・大体のモデルでポリゴン数が微妙に多い(下図右)
の2パターンが考えられます。この傾向がわかれば作業がしやすくなります。



数個のモデルのポリゴン数が極端に多い場合、該当のものだけリダクションすれば良いので作業量の見積もりがしやすく、リスクが少ないです。

一方どれもポリゴン数が多い場合、数個のモデルをリダクションしてもパフォーマンスの改善が期待出来ません。特定の種類、例えばある種類の建物や木のモデルのポリゴン数が多めなら、その種類のモデルに絞ってリダクションすることで、シーンのポリゴン数を劇的に減らすことが出来ます。

あとはそもそも表示するモデル数を減らすなど思い切った最適化が必要になります。

こういったシーンの傾向を調べるために、モデルとポリゴン数をリストアップするツールがあると便利です。そして実際にリダクション作業を行う時、本当にポリゴン数が多いモデル順にリダクションするためにも、ツールを作ると作業効率がとても改善しそうです。

というわけで今回は「モデルとポリゴン数をリストアップするツール」を作りたいと思います。出来上がりはこんな感じです。



リストにモデルとポリゴン数が表示されていて、リストを選択すると該当のモデルが選択される、というものです。

ポリゴン数を調べる

まずはモデルのポリゴン数をどうすれば取得できるのか考えていきましょう。

ポリゴン数…ヘッドアップディスプレイに表示されているのだから、何かしらの方法で調べられそうです。MELのドキュメントから辿ってみることにします。

「poly」で検索してみると色々と出て来ました。



「poly○○」というMELコマンドは、メッシュに対して編集を行うのに使われるコマンドです。例えば「polyBevel」というは、名前通りベベルを実行します。

ポリゴン数を知りたいので、例えば「polyinfo」で検索してみるとどうでしょうか。運良く「polyInfo」というコマンドが見つかりました。



ドキュメントを読んでみると、うーむ、なにか小難しいことが書いてあります。MEL例を見てみてもそれっぽい感じがしないので、どうやらこれではダメなようです。

「polyInfo」ドキュメントの「関連項目」に「polyEvaluate」コマンドへのリンクがあります。



クリックして移動してみると、やっぱり何やら難しいことが書いてあります…。とりあえずこういう時は「MEL例」を見てみます。細かい説明はさておいて、やりたいことが出来るかどうかわかればいいのです!

すると、あります、フェース数やトライアングル数を取得出来るようです。



ではMayaで試してみましょう。ポリゴンのキューブを作って、次のコマンドを実行します。

polyEvaluate -t;



「12」と返ってきました。ポリゴンフェースは6枚ですが、「-t」は三角ポリゴン数を返すフラグなので12で正しいです。実際ゲームでのポリゴン数は三角ポリゴン数で考えるので、この値が直接取れて便利です。

ちなみにモデルの「三角ポリゴン」を確認するには、
・モデルを選択
・Display > Polygons > Face Triangles
を実行します。するとポリゴンがどのように三角形に分割されるか、点線で表示されるようになります。レンダリングする時、ビューに描画する時など内部的にはこの三角形の集合としてポリゴンは処理されています。



ポリゴン数リストアップ

ではこのコマンドを使ってモデルのポリゴン数をリストアップしてみましょう。まず対象となるモデルをリストアップしなければいけません。

Mayaの通常の動作を考慮すると、
・選択したモデルをリストアップする
もしくは
・選択がなければシーン内すべてのモデルをリストアップする
というのが自然です。

というわけで、こんな感じで対象モデルを取得します。※2

proc getMeshList(){
string $meshes[] = `ls -sl`; // 選択したものをゲット
if ( size($meshes) == 0 ){ // もし選択が空なら
$meshes = `ls -type mesh`; // シーン内のmesh全てゲット
}
print $meshes;
}
getMeshList();



実行すると、スクリプトエディタにモデル名が表示されましたか?



今回は始めからgetMeshListという関数にしておきます。
関数にしておけば、その中で宣言する変数が他のMELの変数と重複することがないので安全ですし、何より配列を空にし直さなくていいので便利です。と、これに関してはツールを作り終わってからご説明します。

ではこのモデルのリストをforループでぐるぐるしながら、ポリゴン数を表示してみましょう。先ほどのスクリプトの「print $meshes;」という行を以下のスクリプトに置き換えてみて下さい。

for ( $mesh in $meshes ){
int $numTris[] = `polyEvaluate -t $mesh`; // とりあえず配列で返ってくる
print ( $mesh + ": " + $numTris[0] + "¥n" );
}



実行すると下の画像のようにスクリプトエディタに「メッシュ名:ポリゴン数」が表示されましたか?



まとめ

今回はまずポリゴンリダクションの問題点を確認し、ツールのデザインを決めました。

次にMayaに付いているツールのように、選択しているモデルのリストを取得したり、選択していない場合はシーン内のモデルをリストにする方法を実装してみました。

さらにそのモデルのリストからポリゴン数をゲット、表示するようにしました。これだけでもとりあえずシーンの傾向を観察できそうですね。

次回はモデルをポリゴンの多い順にソートして、一番ポリゴンを使っているモデルを見つけやすくしたいと思います。それが出来たら、いよいよGUIに表示してみたいと思います。

今回出来たスクリプトは以下のところまでです。


proc getMeshList(){
string $meshes[] = `ls -sl`; // 選択したものをゲット
if ( size($meshes) == 0 ){ // もし選択が空なら
$meshes = `ls -type mesh`; // シーン内のmesh全てゲット
}
for ( $mesh in $meshes ){
int $numTris[] = `polyEvaluate -t $mesh`;
print ( $mesh + ": " + $numTris[0] + "¥n" );
}
}
getMeshList();



補足

※1
処理落ちの原因がポリゴン数だと言われることがよくあります。でもすぐにポリゴンリダクションするのではなく、本当に原因がポリゴン数なのか検証する必要があります。プログラマに「重い」言われると、アーティストはついついすぐにポリゴンを減らしてしまいがちですが、一度立ち止まって「本当にそうなのか」見直すとよいです。

処理落ちを調べる時は作業が簡単で効果の大きいことからチェックしていきます。以下のことを試してみます。

1)モデルの表示を消してみる
(そもそもこのモデルが処理落ちの原因ではないかもしれないので)
2)シェーダーを簡易なものにする
(想定されていない重いシェーダーを使っていることがあるかも。しかも変更しやすい)
3)テクスチャを小さくする
(クオリティは考えず単に4分の1ぐらいにしてみます。大抵ここで解決します)
4)モデルを半分削除
(リダクションはクオリティを気にしてしまうので、モデルを思い切って半分にして、ポリゴン数だけで処理負荷を考えてみます)



モデルを半分削除して処理落ちがなくなれば、ポリゴンリダクションする価値があるかもしれません。でも変わらなければ、慎重に他の原因を見つけないといけません。

検証手順のやり方次第で、ゲームの品質や作業工数に差が出てきますので、Mayaで賢くやって行きましょう!(Maya関係ない?)

※2
今回のスクリプトも実装を簡単にするため、選択にメッシュ以外が含まれていると、エラー表示がでてツールが終了するだけになっています。もし余裕があれば選択がメッシュでない場合「polyEvaluate」を実行しないように改変してみて下さい。ツールはなるべくエラーで止まらず、何が何でもとりあえず最後まで動いて終了するほうが望ましいです。

必要な機能・処理だけざっと用意し、あとはエラーが起きないようにアーティストが注意して実行するのもひとつの方法です。特にツールの使用者が限定される場合は、エラー処理を書かない、Maya任せにすることで開発速度も上がりますのでとても有効な方法です。これは決して手抜きじゃないですよ。

製品購入に関するお問い合わせ
オートデスク メディア&エンターテインメント 製品のご購入に関してご連絡を希望される場合は、こちらからお問い合わせください。