Dxライブラリ、VC++2010で3Dゲームを作っています
周りの四方を壁で囲み、真中に木を配置したステージモデルを配置しました
この木の葉っぱや枝の部分のテクスチャにはGimp2でアルファチャンネル透過したPNG画像を使っています
いざ、ゲームを起動しカメラを木に向けると葉や枝の部分を通り越して後ろの壁の部分まで透過されており
ステージ外の部分が見えてしまいます
カメラ → 木の葉、枝 → 壁 → ゲーム外
↑ ↑ ↑ ↑
木に向ける 透ける 透ける 見える
葉や枝が透過した先の壁の模様と共に映るのではなく、何も描画されていない世界の果て的なものが見えてしまいます
原因を知っている方がいらっしゃいましたら教えて頂けると助かります
透過テクスチャ
Re: 透過テクスチャ
透過する木の葉、枝を描画してから壁を描画していませんか。
透過処理のアルファブレンディングより前に、深度テストと言う処理があります。
深度テストは、これから描画しようとする物が、既に描画されている物より後ろにあるなら描画を行わない様にする処理です。
なので、透過する木の葉、枝を先に描画し、その後に壁を描画すると深度テストによって枝に隠れた部分は描画されません。
よって、透過して見えるはずの壁が書かれていないのでステージの外の部分が見えているのだと思います。
以上の事が原因なら、以下の2つのどちらかの方法で解決すると思います。
・半透明な物より奥にある物は、半透明な物よりも先に描画する。
・半透明な物と奥の物を描画する時だけ深度テストを無効にする。
後者について、深度テストを無効にしても深度バッファ(Zバッファ)による奥行き情報は計算されるので、物の前後関係が滅茶苦茶になったりはしないみたいです。
見当違いでしたら失礼しました。
[追記]
アルファブレンディングではなく、テクスチャブレンディングに思えてきたので本当に見当違いかも知れません。
透過処理のアルファブレンディングより前に、深度テストと言う処理があります。
深度テストは、これから描画しようとする物が、既に描画されている物より後ろにあるなら描画を行わない様にする処理です。
なので、透過する木の葉、枝を先に描画し、その後に壁を描画すると深度テストによって枝に隠れた部分は描画されません。
よって、透過して見えるはずの壁が書かれていないのでステージの外の部分が見えているのだと思います。
以上の事が原因なら、以下の2つのどちらかの方法で解決すると思います。
・半透明な物より奥にある物は、半透明な物よりも先に描画する。
・半透明な物と奥の物を描画する時だけ深度テストを無効にする。
後者について、深度テストを無効にしても深度バッファ(Zバッファ)による奥行き情報は計算されるので、物の前後関係が滅茶苦茶になったりはしないみたいです。
見当違いでしたら失礼しました。
[追記]
アルファブレンディングではなく、テクスチャブレンディングに思えてきたので本当に見当違いかも知れません。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 透過テクスチャ
DXライブラリ自体にはZソートの機能がありませんので、半透明を含む場合には遠くのモデル・フレーム・メッシュから描画する必要があります。
MV1GetSemiTransState モデルに半透明要素があるかどうかを取得する
部分的に半透明が含まれる場合は、MV1DrawFrame や MV1DrawMesh で描画する必要ありますので、そのため次のような関数が用意されています。
MV1GetFrameSemiTransState フレームに半透明要素があるかどうかを取得する
MV1GetMeshSemiTransState メッシュに半透明要素があるかどうかを取得する
Zソートは自分でおこなって下さい。
MV1GetSemiTransState モデルに半透明要素があるかどうかを取得する
部分的に半透明が含まれる場合は、MV1DrawFrame や MV1DrawMesh で描画する必要ありますので、そのため次のような関数が用意されています。
MV1GetFrameSemiTransState フレームに半透明要素があるかどうかを取得する
MV1GetMeshSemiTransState メッシュに半透明要素があるかどうかを取得する
Zソートは自分でおこなって下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。