ページ 1 / 1
珈琲
Posted: 2013年6月14日(金) 10:54
by 3Dの透明描画処理について
半透明テクスチャを使用して、3Dの半透明なオブジェクトを作りたいです。
過去の質問から同様の疑問があるかないか探してみたところ、
http://dixq.net/forum/viewtopic.php?f=3&t=10282
>MV1GetSemiTransState モデルに半透明要素があるかどうかを取得する
>部分的に半透明が含まれる場合は、MV1DrawFrame や MV1DrawMesh で描画する必要ありますので、そのため次のような関数が用意されています。
>MV1GetFrameSemiTransState フレームに半透明要素があるかどうかを取得する
>MV1GetMeshSemiTransState メッシュに半透明要素があるかどうかを取得する
と回答がありました
自分が考えるにはメッシュ(つまりテクスチャ?)の半透明要素を見て、Zソートを判断するというのは分かるんですが
フレームの半透明要素?というのは、一体何なのでしょうか?
また、どのように実装したら軽快でしょうか?
描画時にすべてのモデルをループして判断する必要は無いと思うのでモデルハンドルをクラス化して管理しようと思うのですが
コード:
class TransparencyModel : public ModelBase{
TransparencyModel(int ModelHandle);
vector<int> TransparencyMesh;//透明なMeshの番号、モデルのロード時に探す
};
このような方法を考えていたのですが、Zソートするのは透明なテクスチャだけなのでモデル単位でまとめるというのはハズレな気がします。
テクスチャだけをまとめてどのようにZソートしたらいいのかイマイチわかりません。
Zソート用に、
コード:
class TransparencyMesh{
TransparencyModel(int ModelHandle);
int TransparencyMesh;
};
というクラスを作ってSTL::sortに突っ込むのでしょうか
Re: 珈琲
Posted: 2013年6月14日(金) 16:41
by softya(ソフト屋)
すいません、後で時間が取れたら回答します。
他の方で分かる方はお願いします。
Re: 珈琲
Posted: 2013年6月14日(金) 17:02
by ISLe
メッシュというのは、頂点を共有する(しないこともある)ポリゴンの固まりです。
DXライブラリでいうところのフレームは、モデリングソフトでいうところのオブジェクトで、複数のメッシュを含むグループのことです。
半透明要素というのは、そこに貼り付けるテクスチャが半透明要素を持つかどうかだと思われます。
半透明要素を含むモデルは、Zバッファが有効の場合は奥から描画する必要がありますし、半透明要素を含まないモデルを先に描画する必要があります。
半透明要素を含まないモデルは、手前から描画するとなお良いです。
珈琲 さんが書きました:描画時にすべてのモデルをループして判断する必要は無いと思うのでモデルハンドルをクラス化して管理しようと思うのですが
半透明要素を含むかどうかを毎回判断する必要はないですが、モデルの前後関係は毎回すべてのモデルを通して判断する必要があるかと思います。
珈琲 さんが書きました:このような方法を考えていたのですが、Zソートするのは透明なテクスチャだけなのでモデル単位でまとめるというのはハズレな気がします。
テクスチャだけをまとめてどのようにZソートしたらいいのかイマイチわかりません。
モデル単位でまとめることとZソートは基本的には無関係なので、モデルの前後関係を判定できさえすれば、好きなようにモデルクラスを作れば良いと思います。
描画時に、すべてのモデルに対して、半透明要素を含むモデルと半透明要素を含まないモデルのグループに分け、それぞれのグループにおいて前後関係でソート、半透明要素を含まないモデルを手前から描画、半透明要素を含むモデルを奥から描画、という処理を、モデルクラスを使って処理するのは別のクラスになると思います。
Re: 珈琲
Posted: 2013年6月14日(金) 18:47
by 珈琲
ありがとうございます。
E-R図で表すと
メッシュ←フレーム←モデル
という感じの関係でしょうか?
フレームは、「一本の線」というより「骨組み」みたいな意味ですか
するとやっぱりモデルのロード時に透明かどうか判別するだけで、
ループ中はモデルとメッシュだけで必要な情報を得られる・・?
>描画時に、すべてのモデルに対して、半透明要素を含むモデルと半透明要素を含まないモデルのグループに分け、
>それぞれのグループにおいて前後関係でソート、半透明要素を含まないモデルを手前から描画、半透明要素を含むモデルを奥から描画、という処理を、
>モデルクラスを使って処理するのは別のクラスになると思います。
なるほど、
順序としては
1半透明要素を含まないモデルグループをZバッファに登録&描画
2半透明要素を含むモデルグループのモデルから、不透明メッシュをZバッファに登録&描画
3半透明要素を含むモデルの、透明メッシュをZソート
4半透明要素を含むモデルの、透明メッシュをZソートの結果から、奥からZバッファに登録&描画
で大丈夫でしょうか?
書いてる間に気になったのですが
Zソートで順番を整えたZバッファでも
http://t1.gstatic.com/images?q=tbn:ANd9 ... kC5kdfuA5A
このような十字の草表現などどうなるか気になるのですがこれってどうなっているのでしょうか?
メッシュがどちらも前に来る部分があるので、どうなのかなーと・・・
Re: 珈琲
Posted: 2013年6月14日(金) 18:48
by 珈琲
あ!
名前とタイトルのテキストボックス間違えました
すいません。
Re: 珈琲
Posted: 2013年6月14日(金) 19:05
by ISLe
「Zバッファ」という言葉をどういう意味で使っていますか?
ピクセル単位でZテストが行われるのでたいてい問題ないと思いますが。
半透明要素を含むポリゴンが交差する場合は、どちらかのポリゴンの奥側のピクセルが描画されない可能性があります。
半透明要素を含むポリゴンを交差させる必要性は低いと思うのでモデリングで調整すれば良いのではないでしょうか。
Re: 珈琲
Posted: 2013年6月15日(土) 11:20
by 珈琲
Zバッファというのは、画面に描画するための一時的なバッファと考えています。
Zバッファにモデル情報を突っ込んでいけばカメラとの距離・位置を確認して隠面消去してくれるモノです。
ただし、透明なメッシュは突っ込む順序を考えなければいけないので、Zバッファとは別に奥行きを計算しないといけない。
という認識です。
ただ、実際ゲームでよく見かける、草の透明なメッシュが交差するようなモデルはどうなっているのかなと思いまして・・・
2枚が交差して十字に見えているのは、実は板が4枚だったり?
Re: 珈琲
Posted: 2013年6月15日(土) 17:16
by ISLe
珈琲 さんが書きました:ただ、実際ゲームでよく見かける、草の透明なメッシュが交差するようなモデルはどうなっているのかなと思いまして・・・
よく見かけるとおっしゃいますが、具体的なゲームタイトルを挙げていただけますか?
ちなみに、描画順が問題になるのは『半透明』です。
100%の透過は半透明ではありません。
Re: 珈琲
Posted: 2013年6月15日(土) 17:38
by 珈琲
Minecraftやモンスターハンターなどですね
一部分に不透明テクスチャを含んだ透明メッシュは半透明とは言えないということは、
Zバッファで調べるα値?が0であると、Zソートする必要がないというこですか?
Re: 珈琲
Posted: 2013年6月15日(土) 17:41
by ISLe
わたしが最初に回答した内容を読み直してみてください。
Re: 珈琲
Posted: 2013年6月15日(土) 18:41
by 珈琲
失礼しました。
普段から確認の意味を込めて多角的な質問を意識しているのですが、
質問される側から見たらたまったもんじゃないですね
透明な部分と不透明な部分が存在するメッシュは 半透明ではないので
MV1GetMeshSemiTransStateでは判定できず、
また、描画順序で問題がおきないので、判定する必要も無い。
ということですね
窓ガラスとかZバッファだけでいいということは、当初考えていたより要素が少なくて済みそうです。
ありがとうございました