続・透け透けの呪いじゃよ

*2015/12/11 追記です。
透過ヘア派のかたに朗報です。12/04のGet Togetherの事前パッチで一部、透過部分の描画が改善されました。
透明プラムボムが形状、仕様等々が変更され奥に重なったSimGlassシェーダーオブジェクトを描画してくれるようになりました。禿げません!
また、水面に映ったシムの同シェーダーオブジェクトも描画されるようになりました。禿げません!!
でも水中は相変わらず禿げます・・・
**追記ここまでっ

こちらの記事の続きです。
透け透けの呪いじゃよ

先の記事で”SimGlass”シェーダーがどうも他の半透明の物と相性が悪いことを書きました。
そもそも、ゲーム上で半透明を表示するっていうのが結構ややこしいらしいんです。
まず、お断りしておきますが、ワタクシはプログラマーでもないのでこっから先ポンコツのテキトウな解釈や推量がはさまってますので、話半分にお付き合い下さい。

大抵の場合において画面の描画は、ある点(カメラ)から見てフレーム内に収まっているものの距離を収めておいて(深度バッファとかZバッファってやつです)その値を元に、手前にある物だけ描画して奥に隠れてしまう物は描かない、という事をして描画するピクセルを節約してるんだそうです。
リアルタイムにレンダリングしなければならないゲームなんかの場合、こうして負荷を減らすのが一般的な方法のようです。シムズにおいても恐らく例外ではないでしょう。

毛の前後がメタクソな悲しい思い出・・・

毛の前後がメタクソな悲しい思い出・・・

この負荷軽減の一策なのか、どうも”SimGlass”シェーダーは深度情報とは無関係に描画されているんじゃないかと・・・
前に透過ヘアーをテストしてみたときにカメラから見た前後が無視されているーーとぼやいていたあの件です。
半透明を半透明として描画するには、まず後ろにある物を描画してから半透明の重なりをブレンドして描画しなければなりません。
なにをもって前後かというのを見た目に矛盾無くやってくれてるのが、前述の深度バッファ(Zバッファ)です。
ですが、Zバッファは半透明かどうかに関係なく前後をみていますから、半透明の物が手前として先に描かれてしまうと、奥のブレンドされるはずの物が描画されず、ぽっかり欠けてしまいます。Zバッファだけでなく別の前後関係のルールを用いて描画すれば解決するそうですが、まぁとにかく半透明はややこしい・・・と。特に半透明同士となると、どうやって矛盾無く描画してるのかなんてもう理解不能です。
少なくとも他の不透明オブジェクトと”SimGlass”との前後はきちんと深度情報に基づいてブレンドされているように見えます。
ただ、”SimGlass”内のポリゴンや、同シェーダーを持つオブジェクト同士だと、前後がメタクソになります。まぁメタクソ、というか頂点のソートされた順にひたすら描画しているんだと思います。
余談ですが、透過ヘアーを作る際にこの前後メタクソ問題は避けて通れず、本来ならZバッファにやってもらいたい前後のソートを手動でやらないといけません。ですが、カメラはゲーム内で動き回りますから、前後がひっくり返る事なんてざらにある訳です。この前後ひっくり返りをなるべく見えないような髪型にする事でごまかす事は可能ですが、今度は髪型が制限されそうです。拙宅の髪型が透過ヘアーにしにくいのはハネッ毛が多いのでその前後ひっくり返りが起きまくりだからです。・・・えぇ言い訳ですとも。

奥のシムの髪は奥に、手前は手前に。当たり前の事ですが、実はありがたい事だったり。

奥のシムの髪は奥に、手前は手前に。当たり前の事ですが、実はありがたい事だったり。

ところで、”SimGlass”シェーダー同士だと前後メタクソ、なはずですが透過ヘアーのシム同士を見てみるとちゃんと髪も前後関係の破綻なく表示されています。
どうやら、前後関係に関してはシムの位置でもソートされているようです。

ためしに仲良くハグ中のシムを別角度から眺めてみました。

髪が突き抜けてしまいました。この下で頭蓋がどうかなってるんじゃないかと心配になりますな。

髪が突き抜けてしまいました。この下で頭蓋がどうかなってるんじゃないかと心配になりますな。

ある角度になると、シムの前後が反転したのか、髪が手前のシムにめり込みました。
丸く欠けているのは手前のシムの頭の輪郭でしょう。頭部は”SimSkin”シェーダーなので、ちゃんと深度が破綻無く描かれています。

やはり、前後が上手くいきません。
半透明同士をきちんと描画するには奥の物から順に描いてほしい所ですが、では”SimGlass”以外の半透明同士ならどうなのか?と言うと、

シャワーのガラスは”SimGlass”にも優しい・・・

シャワーのガラスは”SimGlass”にも優しい・・・

シャワーとかに使われている半透明は、”SimGlass”もきちんとブレンドされます。しかもオブジェクトは半透明部分にエフェクトが乗ってもきちんと前後が破綻なく描画されています。
じゃあ、と思って試しにオブジェクトに使われてる”Phong Alpha”(だったけか?すいませんオブ関連疎いです)を髪に使ってみたんですが、案の定表示はされませんでした。やっぱCASパーツ用に用意されたシェーダーじゃないとダメみたいです。

どぼーーん。実は他にも色々な物をプールに沈めて遊んでました。

どぼーーん。実は他にも色々な物をプールに沈めて遊んでました。

ちなみに、透過ヘアーを引っぺがす水面との相性は?と思ってシャワーをプールに沈めてみました。
ガラスが消えてますね。

なんか色々試してみましたが、この半透明の描画に関して、開発側の設計は別に問題ないと思うんです。シムのメガネのレンズが交差するような場面はほとんどないでしょうし、シャワーをプールに沈めて遊んでも意味がないですから。

半透明はその処理のややこしさのせいで負荷が高くなるので、色々負荷軽減のため、はしょられている部分もあるのでしょう。
ちなみに他に負荷の高いものとしては影なんかも重いんだそうです。
頂点数などは今時のスペックのPCで動くゲームなら、よほど間違った事をしなければ、ジオメトリの演算はそれほどの負荷ではないそうです。(なんかポリゴン数盛り盛りな拙宅の髪型の言い訳してるみたいですが・・・)
確かに実際プレイして、あ、フレームレートが落ちた・・・と感じる場面って、シムが大勢いる所よりも、オブジェクトが多く照明を多用している所な気がします。
また、シムズ4ではアンビエントオクルージョンを使用しているんだそうで(とSims Vipの記事にありましたよ)より影も自然にみえるように考慮されてるんだとか。
その他、ノーマルマップ、スペキュラー+キューブマップの効果もより実感できるようになっていると思います。
そんなグラフィック向上と負荷軽減の狭間で切り捨てられた(?)CASパーツの半透明なので、もしイレギュラーにシェーダーを変更した場合、上手く表示されないこともあると思います。そのときにはポンコツのこの記事が何かしら手がかりになれば幸い、と思ったりしてます。

無駄に長い・・・ 最後まで読んで下さった方には、何かしらお礼を差し上げたいくらいです。