LightWaveでアルファ抜きがおかしくなる件。

画像
今「ロストエンジェル(オレ小説)」のもう一人のヒロイン、のぞみたんを作ってて、ぼく好みのちょいむっちりしたスタイルなんで(デブ専ではない。あくまでむっちり)、とてもとても楽しくて寝る間も削ってウハウハしてるんだけど、アンダーヘアを作ってて「これバグじゃね?」という奇妙な現象に出くわしたので調査してみました。
(たぶん同じ現象は既に報告されてると思うけど、自分ネットでの調べ方が悪いのかいつも出ないんだよね…)

画像
問題のレンダリング画像。のぞみたんの大事な所だ(ちょっとアダルトだが極力エロくないようにしてるので大丈夫)。アンダーヘアは数枚の板(…といっても1枚の板は複数に割ったサブパッチポリゴンでできてる)を重ねて、アルファをテクスチャで抜いて実現してます。
数枚重ねながら、それをだんだん中央部に起こす感じにしてる。
そうすると、図のよーに背景色が抜けて出て来てしまった。
OpenGLの透明ソートをPerPolygonとかにしても変わらない。(レンダリングDirect3Dかも知らんけど。)
いろいろ設定変えても変わらない。

画像
テクスチャをやめて透明度50%にしたもの。
これだと抜けてない。…けど、赤褐色の濃い部分(ポリゴンが重なってる部分)の形状が、1つ前のショットに似てる。ムム。Zパスで弾かれたか…?

画像
上のを板1枚ずつ別のサーフェスにしてみたもの。
やっぱり抜けてない。
形状からすると、右側の赤いサーフェスが裏面になってて、その裏に位置する左側のが2つ前ので抜けてる部分に相当する。

画像
ほんでテクスチャで抜いた。
やっぱり背景抜けを起こした。


以上から推測すると、Zテストで弾かれたか、ディスティネーションアルファテスト(があるかどうか知らん)で弾かれたか。もしくは合わせ技でディスティネーションのアルファ値が濃くなるとZが書きこまれてカラー乗せる段階でZテストで弾かれたとかなんとか。
いずれにしてもポリゴンの描画順序とピクセルテストに起因してるものと考えられます。

この推測が当たっているなら、
「半透明で両面ポリゴンが同じオブジェクト内でオーバラップしている」
ものなら同様の状況になると予測できます。

ほんで試しにやってみた。

画像
2コの球体を並べ、手前の赤いものは半透明、奥のグレーのものは不透明にしてます。重なってはいない。

画像
テクスチャで抜いたもの。
おお、やっぱり中心部が背景色に抜けた。

画像
テクスチャでなく、透明度を70%にしたもの。
状況がよく分からないけど、中央の丸い部分は透明度 70%+70% = 透明度40% ということになる。
(100%-70%)*2 = 60% → (100%-40%)
…ディスティネーションアルファ?
テクスチャだとがっつり抜けるのは、Z値かディスティネーションアルファががっつり書かれているからではないか。

いずれにせよこれを解決するにはPerPolygonソートが必要だろうけど、数十万ポリゴンのシーンをポリゴン単位でソートするのは現実的でない。頭が痛いよ…。
オブジェクトの描画順序が固定されるのなら、板毎にオブジェクト分けるとかがせいぜいの対処策かな。

これ、LightWave3D v9.6 の話なんだけど、LW v10 では解決されてたりするんだろうか。

ちなみにヘアがないのぞみの大事な所。
画像
つるつるだ。
これはこれでいいんだけど…別の意味でエロくてやばい。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

tama
2012年02月17日 12:10
ツイッターから来ました。
多分レンダーオプションにあるレイプレシジョン(光線の精密度?)の値が低くなってるからだと思います。デフォルトは6です。
間違ってたらスミマセン。
Kamo.o
2012年02月17日 12:46
仕様にからむトラブル、厄介ですね。
先に現象回答してくれてるようなので、それで無事解決すること祈ってます。
のぞみちゃんのぽっちゃり体型、好みです(//∇//)
ヘア含め完成楽しみです☆

2012年02月17日 13:43
デフォで作ったシーンだと問題ないのでしつこく検証してみた所、「レンダーオプション」の反射回数の上限(Rey Recursion)をデフォルトよりも小さくしていたことで発生した問題だと判明。

デフォルルトでは16なんだけど、のぞみのシーンではレンダリングを速くするために6にしてました(一部とてもフクザツな所があって超絶レンダリング時間かかってたんで…)。

数値を変えてみたところ、今回のケースでは7以上だとOKで6以下だとだめ。なんてこったい。
Ray Recursion はアルファの再描画にも関連するものと考えられます。

これ似たようなアルゴリズムがあったな…。なんつったっけ。半透明ポリゴンをZテストで失敗するとステンシルにフラグ書きこんでソートして再描画するって処理。
2012年02月17日 13:47
tamaさん、コメントありがとうございます! まさにご指摘の通りでした。
2012年02月17日 13:49
kamo.oさん、レスどうもです。
ばっちり描画されたのでこれで安心して先に進めます!