OpenGLによるCOLLADAなはちゅねの描画 (2)
前回に引き続き、はちゅねの描画に挑戦します。
はちゅね用チューニング
理想的には、1つCOLLADAプレビュー用のプログラムを作れば、全部のCOLLADAに対して適用出来ると思うのですが、とりあえず今回ははちゅね用に色々チューニングを施しました。
テクスチャ画像の向き
まず、ハマった点は、テクスチャ画像の向きです。読み込んだ画像を、そのまま使うと、なぜかテクスチャの表示がおかしくなる現象に見舞われました。
色々試行した結果、上下を反転すると上手く行くことがわかりました。COLLADAでは常に上下反転するのがよいのか、COLLADA内にそこら辺の情報が入っているのか*1は謎です。メタセコでエクスポートしたCOLLADAは反転する必要があるとか言う噂もありましたが真偽はいかに。
テクスチャを持つ他のモデルを試してみるまで、この問題は保留とします。
ライティングと色
いろいろ試した結果、はちゅねっぽく描画したければ、影を付けないのが良さそうということが分かりました。ただ、これについては、少しCOLLADA側にヒントがありそうです。
COLLADAのeffect要素を見てみると…
<effect id="miku_png_001-fx" name="miku_png_001-fx"> <profile_COMMON> <newparam sid="miku_png_001-surface"> <surface type="2D"> <init_from>miku_png_001-img</init_from> <format>A8R8G8B8</format> </surface> </newparam> <newparam sid="miku_png_001-sampler"> <sampler2D> <source>miku_png_001-surface</source> <minfilter>LINEAR_MIPMAP_LINEAR</minfilter> <maxfilter>LINEAR</maxfilter> </sampler2D> </newparam> <technique sid="blender"> <lambert> <emission> <color>0.00000 0.00000 0.00000 1</color> </emission> <ambient> <color>1.00000 1.00000 1.00000 1</color> </ambient> <diffuse> <texture texcoord="CHANNEL1" texture="miku_png_001-sampler"/> </diffuse> <reflective> <color>1.00000 1.00000 1.00000 1</color> </reflective> <reflectivity> <float>0.0</float> </reflectivity> <transparent> <color>1 1 1 1</color> </transparent> <transparency> <float>0.0</float> </transparency> </lambert> </technique> </profile_COMMON> </effect>
このことから、以下のように推測できます。
- diffuse要素内でテクスチャが指定されている。diffuseは無視(RGBA=(0, 0, 0, 1))して、テクスチャ色を適用すれば良さそう?
- specular要素がない。specularは無視すれば良さそう?
- ambient要素はRGBA全部1.0。
これらをPhongシェーディングで描画すると、結局、最終的に反映されるのはテクスチャ色とアンビエントだけなので、ランバート反射による影は付かない事になります。代わりに、はちゅねの場合、テクスチャ自体に既に影が入っているようです。
ただ、ambient光を(1, 1, 1, 1)にしないと明るく表示されないので、そこら辺どうなのか追調査が必要です。
アルファブレンド
まず、さっきの画像をよく見ると分かりますが、頬のアレ*2の部分が変に透けていることが分かります。本来なら、顔の肌色が透けて見えるはずなのですが、何故か髪の裏側の色が透けて見えています。角度変えると背景も見れます。
これは、アルファブレンドとデプスバッファを併用した時に、描画順によって起こりうる典型的な問題で、透けてる物は奥から描画しないとダメというやつです。
とりあえず、ノードを逆順に描画してみると以下のようになります。
完璧ですね。
しかし、COLLADAファイルを覗いてみた限りは、そういった描画順に関する指定はなさそうなので、どうしたものか考えどころです。nodeの名前を見てみると、"miku_far"と"miku_near"というのがあり、アルファブレンドに関して意識はしてそうなのですが、どうしたものでしょうか…。