2015年12月8日火曜日

軽くて崩れないメッシュの作り方 ーマテリアル編

この記事は、「セカンドライフ技術系 Advent Calendar 2015」の記事です。

セカンドライフ技術系 Advent Calendar 2015


前々回の「ポリゴン数編」、前回の「LOD 編」で、軽くて崩れないメッシュの作り方をご紹介してきました。

今回は、メッシュはもちろん、プリムでも描画を軽くする方法をご紹介します。


ポリゴン数を削減することは、メッシュを軽くする基本的な要素です。

しかし同じポリゴン数でも、マテリアルの設定次第では、描画の負荷が高いプリムやメッシュが生まれてしまいます。


アバターの描画の負荷「描画ウェイト」の計算方法として、下記の資料があります。

Mesh/Rendering weight - Second Life Wiki


ベースのアバター

1000 ポイント
(ただし、ベイクされたテクスチャーを非表示にする毎に -200 ポイント)

ベースコスト

プリム、スカルプテッドプリム、メッシュのポリゴン数に応じたポイント

プリム毎に乗算

グロー1.5 倍
凸凹1.25 倍
フレキシ5.0 倍
輝き1.6 倍
インビジブルプリム1.2 倍
リグ入りメッシュ(Rigged Mesh)1.2 倍
テクスチャマッピング1.0 倍(負荷無し)
アニメーションテクスチャー1.4 倍
アルファ4.0 倍

追加

パーティクルプリム毎に 100 ポイント
ライトでの発光プリム毎に 500 ポイント
メディア面毎に 1500 ポイント
リンク先で別のテクスチャーを使っている場合+ 256 + 16 * (resX/128 + resY/128)


実はこれはアバター特有のものでは無くて、ビュアーで表示されるものすべてに同様に影響する内容です。


3D の世界では、ポリゴンは「シェーダー」と呼ばれる GPU 用の特別なプログラムで一枚一枚描かれていきます。

シェーダー - Wikipedia

シェーダーでは、ポリゴンの形を設定したり、ポリゴンの色などを設定したりします。

シェーダーに、ポリゴンの色やテクスチャーなどのデータを渡したりして、素材の“材質”を設定出来るようにしたものが、マテリアルです。


セカンドライフビュアーでは、編集ウインドウの「材質」の項目がマテリアルにあたります。


ポリゴンを単色に塗ったりテクスチャーを貼るくらいなら、描画の負荷はほぼ無視出来るくらいの負荷なのですが、アルファやグローなどの特別な表示を行なおうとすると、それらを描画するための複雑な処理が必要になりますので、その分負荷がかかります。

ポリゴン一枚での負荷は小さなものですが、それが何万枚、何十万枚と集まると、FPS に影響するほどの重さになってしまいます。

セカンドライフでも同様に、マテリアル(シェーダー)の設定次第では描画が重くなってしまうことがあります。

特に描画の負荷が高いのは、

フレキシ 5 倍

アルファ 4 倍

です。

これは、マテリアルにテクスチャーを貼り付けていない状態の単色のプリム(メッシュ)との描画の負荷の比較の値です。


フレキシは、通常のプリムをアバターの身体のようにグニャグニャ動くようにする仕組みです。
「フレキスブルパス」や「フレキシブルプリム」とも呼ばれています。


フレキシは、マテリアルの機能では無いのですが、描画の負荷という意味では関連する項目ですので、ここでは一緒にご紹介します。

フレキシは、そのグニャグニャ動くようにする変形処理もビュアー側でリアルタイムに計算が行なわれます。
そのため、描画をするための処理が非常に重くなってしまいます。

風になびく髪やスカート、森の木々などは、見た目はすごくいい感じなのですが、実は描画的にはすごく重いものだったのです。

フレキシが設定出来るのは、プリムだけです。
メッシュでは使用することは出来ません。
メッシュにフレキシが導入されなかったのは、描画の負荷が高すぎるためだそうです。

ですので、プリムでも出来るだけ使わない方がいいのですが…、
見た目の効果は非常に高いものですので、どうしても必要な場合には、ここぞというところワンポイントに使うのがいいと思います。


一番よく使っていて、一番意外に思われそうなのが、アルファです。

ここでの“アルファ”は、プリムの透明度はもちろん、テクスチャーの中の透過度(アルファチャンネル)も含まれます。

プリムの透明度

テクスチャーの中の透過度(アルファチャンネル)

アルファは、向こう側が透けるという処理が必要です。
そのため、まず最初に奥側を描いて、その後に手前側を描くといった処理が必要になります。

その処理が、山のようにオブジェクトがある SIM やアバターなどの間で行われますので、通常よりも複雑な処理になってしまいます。

半透明なものの向こうに半透明なものがあって…ということも珍しくありませんしね。

また、そういう複雑な処理を行なっているためオブジェクトの表示位置などによっては、前後関係がおかしくなってしまったり、チラつきが起きてしまうことがあります。

このため 3D の世界では、アルファは

鬼門

と呼ばれて、本当に必要なところ最小限または多少破綻しても大丈夫なところ(パーティクルなどのエフェクト)に使われるのが一般的です。

ところがセカンドライフでは、アルファは日常的にいろんなところに使われているんですよねw

建物などのガラスはもちろん、森の木々やアバターの髪、パーティクルなどなど…

特にプリム製の髪は、透明度のあるテクスチャーを貼ったプリムをたくさん使って作られていますので、描画の負荷が非常に高くなっていることがあります。
プリム製の髪でアバターの描画ウェイトの数値が高いことがあるのは、そういう理由です。

神秘的な景色のところでよく見かける、オブジェクトにアルファとグローを掛けた表現も、


(ベースコスト x (アルファ 4.0 倍+ グロー 1.5 倍)) x プリム数

と、描画的の負荷的には意外と高いものになります。

きれいなアバターや景色だけど表示が重いなーっと感じた時は、ポリゴン数以外に、マテリアルの負荷も確認してみてください^^


「そんなこと言われても、
オブジェクトのマテリアルの負荷って、
どうやって調べるの?」

マテリアルの負荷そのものを見ることは、残念ながらセカンドライフビュアーでは出来ませんが…、
それらを使っているオブジェクトの表示をオン/オフ出来る機能がビュアーにはあります。

それは、アドバンスメニューにある「レンダリング(種類)」です。


「====」の部分をクリックすると、メニューから切り離しが出来て便利です^^


「レンダリング(種類)」では、下記の項目の表示のオン/オフが出来ます。
  • シンプル
  • アルファ
  • アバター(フレキシブルプリムやそれらにリンクされたオブジェクトも含む)
  • 地表
  • 地面
  • ボリューム
  • パーティクル
  • 凸凹(バンプ)
各項目をオン/オフすると、セカンドライフの世界の中でその項目が使用されている部分を、表示したり消したり出来るようになります。

その際、アドバンスメニューの「パフォーマンスツール」にある「統計バー」で、FPS の値を確認してください。

オン/オフした時の FPS の差が大きければ大きいほど、描画の負荷が高いということになります。

通常の表示
アルファを使用しているオブジェクトを非表示にした際の表示
FPS が 6 増加している点に注目!

普段見ている景色のどこが描画の負荷が高いのか、ポリゴン数の負荷も含めた状態を、これで細かくチェックすることが出来ます。

これは、プリムでも、ユーザーがアップロードしたメッシュでも同様です。
この方法で、身の回りの描画の負荷が大きいオブジェクトを見つけてみてください。


“アバターの描画ウェイト”が登場した頃にはまだなかった概念として、
  • ノーマルマップ
  • スペキュラマップ
があります。


Get the New Materials Viewer Today! - Second Life

この二つのことを“マテリアル”と呼ぶことがありますが、実際にはこの二つは“マテリアルに追加された機能”です。


ノーマルマップは、低ポリゴン(ローポリ)でも細かい装飾を表現したい場合に使われる手法です。

ポリゴン数を増やさずに、テクスチャーを使って細かい造形を表現します。
細かい造形にはライティングの効果も反映されますので、従来のバンプマップよりもリアルな造形表現が可能になります。

スペキュラマップは、テクスチャーで指定した部分の輝き度合いを自由に設定出来る手法です。
ライティングの効果も反映されますので、従来の「輝き」よりもリアルな金属などの表現が可能になります。

これらは、オブジェクトの表現力を大幅に向上させてくれます。

そのかわり、

高度なライティングモデル

を有効にしないと見ることが出来ません。

※影は有効になっている必要はありません

高度なライティングモデルでは、従来のプリム含め全てのオブジェクトが、高度なライティング処理によって表示されるようになります。
高度なライティングモデルをオンにすると、画面全体の質感が変わるのは、この影響です。

具体的には、シェーダーが高度なライティング用のものに切り替わります。
そのため、見た目がよりリアルになる一方、全体的に従来の表示よりも描画の負荷がかかってしまうようになります。

ただし、「高度なライティングモデル」がデフォルトで有効になるのは、グラフィック設定が「高」以上の場合です。
また、「高度なライティングモデル」はユーザーが自由にオフにすることも出来ますので、描画の負荷が高いなっと感じる方は、デフォルトで有効になっていたとしても、オフに変更しているかもしれません。

このため、全ての人に影響することが前提の“アバターの描画ウェイト”の方では、考慮されていないのかもしれません。

ただし、描画の負荷は通常よりも掛かるものですので、ノーマルマップやスペキュラマップの表現を使用される場合は、その辺も考慮された方がいいと思います。

また、「高度なライティングモデル」の設定をオフにしていると、ノーマルマップやスペキュラマップの表現は全く表示されませんので、表示されない場合でも雰囲気が壊れないようなテクスチャー作りの方も、考慮された方がいいと思います。




3回にわたって、軽くて崩れないメッシュの作り方を紹介してきました。
いかがだったでしょうか?

今回書いてきました“軽くて崩れないメッシュの作り方”という内容は、セカンドライフだけの方法ではありません。
他の 3D の環境でも同じですので、これを覚えておけば、他のところでも活かすことが出来ます。

来年は、次世代プラットフォーム「サンサール」が登場する予定になっています。
そこでは、セカンドライフよりずっと品質の高い物づくりが要求されるかもしれませんので、今のうちにこういった作り方に慣れておかれるといいと思います^^
このエントリーをはてなブックマークに追加

0 件のコメント:

コメントを投稿