OpenGLによるCOLLADAなはちゅねの描画 (2)

前回に引き続き、はちゅねの描画に挑戦します。

はちゅね用チューニング

理想的には、1つCOLLADAプレビュー用のプログラムを作れば、全部のCOLLADAに対して適用出来ると思うのですが、とりあえず今回ははちゅね用に色々チューニングを施しました。

f:id:s-shin:20130928142319p:plain

テクスチャ画像の向き

まず、ハマった点は、テクスチャ画像の向きです。読み込んだ画像を、そのまま使うと、なぜかテクスチャの表示がおかしくなる現象に見舞われました。

色々試行した結果、上下を反転すると上手く行くことがわかりました。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の部分が変に透けていることが分かります。本来なら、顔の肌色が透けて見えるはずなのですが、何故か髪の裏側の色が透けて見えています。角度変えると背景も見れます。

これは、アルファブレンドとデプスバッファを併用した時に、描画順によって起こりうる典型的な問題で、透けてる物は奥から描画しないとダメというやつです。

とりあえず、ノードを逆順に描画してみると以下のようになります。

f:id:s-shin:20130928151014p:plain

完璧ですね。

しかし、COLLADAファイルを覗いてみた限りは、そういった描画順に関する指定はなさそうなので、どうしたものか考えどころです。nodeの名前を見てみると、"miku_far"と"miku_near"というのがあり、アルファブレンドに関して意識はしてそうなのですが、どうしたものでしょうか…。

*1:ぱっと見、そういった情報は含まれてなさそうですが

*2:チーク的なアレ