ページ 11

透過テクスチャ

Posted: 2012年2月27日(月) 20:57
by kinc-
Dxライブラリ、VC++2010で3Dゲームを作っています

周りの四方を壁で囲み、真中に木を配置したステージモデルを配置しました

この木の葉っぱや枝の部分のテクスチャにはGimp2でアルファチャンネル透過したPNG画像を使っています

いざ、ゲームを起動しカメラを木に向けると葉や枝の部分を通り越して後ろの壁の部分まで透過されており
ステージ外の部分が見えてしまいます


カメラ →  木の葉、枝  →  壁 → ゲーム外
 ↑        ↑         ↑     ↑
木に向ける  透ける      透ける  見える

葉や枝が透過した先の壁の模様と共に映るのではなく、何も描画されていない世界の果て的なものが見えてしまいます

原因を知っている方がいらっしゃいましたら教えて頂けると助かります

Re: 透過テクスチャ

Posted: 2012年2月27日(月) 21:33
by Fimbul
透過する木の葉、枝を描画してから壁を描画していませんか。

透過処理のアルファブレンディングより前に、深度テストと言う処理があります。
深度テストは、これから描画しようとする物が、既に描画されている物より後ろにあるなら描画を行わない様にする処理です。
なので、透過する木の葉、枝を先に描画し、その後に壁を描画すると深度テストによって枝に隠れた部分は描画されません。
よって、透過して見えるはずの壁が書かれていないのでステージの外の部分が見えているのだと思います。

以上の事が原因なら、以下の2つのどちらかの方法で解決すると思います。

・半透明な物より奥にある物は、半透明な物よりも先に描画する。
・半透明な物と奥の物を描画する時だけ深度テストを無効にする。

後者について、深度テストを無効にしても深度バッファ(Zバッファ)による奥行き情報は計算されるので、物の前後関係が滅茶苦茶になったりはしないみたいです。


見当違いでしたら失礼しました。

[追記]
アルファブレンディングではなく、テクスチャブレンディングに思えてきたので本当に見当違いかも知れません。

Re: 透過テクスチャ

Posted: 2012年2月28日(火) 11:12
by softya(ソフト屋)
DXライブラリ自体にはZソートの機能がありませんので、半透明を含む場合には遠くのモデル・フレーム・メッシュから描画する必要があります。

MV1GetSemiTransState  モデルに半透明要素があるかどうかを取得する
部分的に半透明が含まれる場合は、MV1DrawFrame や MV1DrawMesh で描画する必要ありますので、そのため次のような関数が用意されています。
MV1GetFrameSemiTransState  フレームに半透明要素があるかどうかを取得する
MV1GetMeshSemiTransState  メッシュに半透明要素があるかどうかを取得する

Zソートは自分でおこなって下さい。