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 では解決されてたりするんだろうか。

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

"LightWaveでアルファ抜きがおかしくなる件。" へのコメントを書く

お名前
メールアドレス
ホームページアドレス
コメント