トップページ > 過去ログ > 記事閲覧
透過テクスチャの不具合について
名前:white 日時: 2009/12/01 00:47

こんばんは。 透過用テクスチャを使用してビルボードや、ポリゴンの一部を 切り抜きしたいのですが、カメラの角度によって下記のような 問題が発生してしまいました。 私の設定の問題かもしれませんので、下記に問題が発生する 簡単なソースとデータ、およびgif動画をupしてみました。 管理人様の体の調子の良い時や、お時間のある時にでも 確認いただければ幸いです。 ------------<問題の発生している状態>-------------------------- ■注視点を中心に回転させてみた動画です。 ttp://gigabyteserver.com/uploader01/img1234/winplus.jp752.gif ■ビルボード周辺の拡大図です。 ttp://www.death-note.biz/up/g/5920.jpg ------------<ソースとデータ>-------------------------------- ttp://gigabyteserver.com/uploader01/upload.php?down=794 ダウンロードパス : dxlib ------------[問題の内容]------------------------------------------- ・角度によって、透過用テクスチャの貼られたポリゴンの透明部分が  正しく切り抜かれず、背景色になってしまいます。 ・背景色になった部分は、背後にある一部のポリゴンも表示されなくなる。  ※後ろにあるオブジェクトが見えてしまう=上記の動画では 床用のポリゴンが消えて箱の地下部分が見えてしまいます。 ・ポリゴンの背後に、ビルボードや他の板ポリゴンがある場合  テクスチャのピクセルでなくポリゴンのシルエットで隠れてしまいます。 ・MV1GetSemiTransState()で透明度のあるテクスチャを貼ったポリゴンを  指定すると戻り値が 0 になっていました。 --------------------------------------------------------------------

Page: 1 |

Re: 透過テクスチャの不具合について ( No.1 )
名前:IW 日時:2009/12/01 22:23

描画順がおかしいような。 不透明なオブジェクトを先に描いてから、 Zバッファを OFFにして、その透過用テクスチャを貼ったポリゴンを 画面奥から順に描画したらどうなりますか?
Re: 透過テクスチャの不具合について ( No.2 )
名前:white 日時:2009/12/03 06:48

IWさん、レスありがとうございます。 ご指摘頂いたおかげで、Zbufferとαブレンディングの問題の話を読んで 仕組みを理解する事が出来ました。 またDxlibの関数リファレンスと過去ログからZソートをつけなかった 理由について、管理人様の解説も読むことができました。 私の勉強不足でした、すみません。 >Zバッファを OFFにして、その透過用テクスチャを貼ったポリゴンを >画面奥から順に描画したらどうなりますか? とりあえず手動で画面奥から順に配置してみたところでは透過部分は 問題なく表示できた、と思います。 ただこれを、カメラからの距離(奥から手前への表示優先度)を考慮して 描画するとなると下のような流れで合っているのでしょうか…。 -------------<透過オブジェクトの描画>------------------------------- (1) Zbufferは不使用にする。   オブジェクトを扱うクラスを作り、不透明、半透明(透過あり)オブジェクト   を管理する描画用のlistを2つ用意する。   以下は毎フレームごとに処理を行う。 (2) カメラに写っているオブジェクトのみを選別する(※)。   更に不透明なものと半透明なものを選別してlistに追加していく。   ※クリッピング(視錐台カリング?)の方法が分かりませんでした…。 (3) 半透明listlist内の全オブジェクトに対して、カメラからの距離(dist) を算出して表示優先度によってソートする。 //カメラ位置 VECTOR cam として、 //オブジェクトの位置 VECTOR m_obj; として、 //三平方の定理で求めたdistの値でdistの値でsortしました。   dist = sqrt((m_obj.x - cam.x)^2+((m_obj.y - cam.y)^2+((m_obj.z - cam.z)^2); (4) 不透明なものをlistの先頭から描画する。 (5) 半透明なものをlistの先頭から描画する。 ------------------------------------------------------------ この流れでソースを修正した結果、最初より大幅にマシにはなったのですが (2)と(3)の部分に問題があるようで詰まってしまいました。 カメラから見て、板が垂直の角度近づくと不具合が出ている状態です…。
Re: 透過テクスチャの不具合について ( No.3 )
名前:white 日時:2009/12/05 05:28

ビルボード周辺の切り抜きについては、Zbfferと透過テクスチャの 描画順序をきちんと考えていなかった事が原因だったようです。 お騒がせいたしました…。 ただビルボードのように常にカメラ正面に向いていない 透過用テクスチャを貼ったポリゴンに関しては、視線に対して 垂直に近づくとやはり角度によって問題が出てしまいます。 ■修正した結果、下記のような感じになったのですが  zbuffer使用の有無に関わらず起こってしまいます。  ※見えやすいようにテクスチャを変えています ttp://www.death-note.biz/up/h/214.jpg 下記のソースだと、 37行目 : カメラからの距離を求める計算方法(※C_ZObject::Calcrate_dist()関数の処理) 42行目 : ソート方法(※下記のソースだとst_functor_Z_Less)か、 あたりがおかしいのでしょうか? DXLib自体の問題とは直接関係ない話のようなので 恐縮ですがご意見いただければ幸いです。 ------------------------------------------------- ■修正後のソース全体です ttp://gigabyteserver.com/uploader01/upload.php?down=811 ダウンロードパス : dxlib ------------------------------------------------- //--------------<ソース一部抜粋>------------------------------ //--- オブジェクト用のクラス(テスト用)-----------------// class C_ZObject { private: int model_handle; //モデルデータ VECTOR pos ; //オブジェクトの座標 float dist_z; //カメラからの距離 public:  //距離計算  void Calcrate_dist(VECTOR in_pos){ dist_z = sqrt((in_pos.x - pos.x)*(in_pos.x - pos.x)+(in_pos.y - pos.y)*(in_pos.y - pos.y)     +(in_pos.z - pos.z)*(in_pos.z - pos.z));  } //ソート用(昇順) struct st_functor_Z_Less{ public: bool operator()(const C_ZObject* lunit, const C_ZObject* runit){ return lunit->dist_z < runit->dist_z; } }; };
Re: 透過テクスチャの不具合について ( No.4 )
名前:IW 日時:2009/12/06 13:18

透明なものが交差しているとソートしても正しく表示することはできません。 2つのポリゴンの交差を交差点で分割し、 4つのポリゴンに分ければ交差しなくなるので、 正しく表示できるかと思います。
Re: 透過テクスチャの不具合について ( No.5 )
名前:white(解決) 日時:2009/12/08 00:39

IWさん、お答えありがとうございます。 仰るとおり、ポリゴンを交線で分割してからある程度の 距離を離して、交差してるポリゴンも同一オブジェクト 化しないようにすると正常に描画されるようになりました。 半透明オブジェクトを描画する場合は 描画順を考えることと、モデリング時にも複雑に 交差させないように注意することが必要なことが 大切なのですね。 おかげでとても勉強になりました。 ありがとうございました。
Re: 透過テクスチャの不具合について ( No.6 )
名前:いっち 日時:2009/12/08 21:50

解決されたということなのですが、 恥ずかしながら私は(No.3)の問題の解決策がいまいち理解できていません。 図々しいとは思いますが、もう少し具体的に説明して頂けますでしょうか? まず、(No.3)の問題点は以下のように認識しています。 透過部分をもつオブジェクト(ここではツリーオブジェクト)を描画するときに、 カメラからそのオブジェクトの非透過部分の上に透過部分が重なって見えると問題が生じる。 (Z位置をポリゴンごとの中心位置からしか判断できないため?) 次に、私なりに(No.5)を解釈すると以下のようになります。 "交差してるポリゴン"(=ツリーオブジェクト)を中心線で(羽のように)4つの部品にわけて 順番に描画する事で解決した。(このとき部品同士が近すぎると問題がある?) 上記のような解釈であっておりますでしょうか? ご面倒とは思いますが、回答を頂けると助かります。
Re: 透過テクスチャの不具合について ( No.7 )
名前:white 日時:2009/12/10 05:17

おそらく、いっちさんの仰る通りのお話だと思います。 ただNo3については、良いソートの方法が思い浮かばず 手間がかかりそうだったので、箱状に組んで隣のオブジェクト と併せて、簡単なテストだけをしました(箱の中心を基準。 別々の箱オブジェクト4つを近づけると境界が+型になる)。 □□ □□ また交差させる事は目的ではなかったので(真横に近い所から 見てもαできれいに抜くのが目的なので)、交差させなければ 済む事が分かった事から、No3の問題は下のように描画できる ようになったので、解決となりました。 ttp://www.death-note.biz/up/h/859.jpg そういうわけでNo.5 の場合は交差でなくスキマもありますし、 厳密には「分割とソート方法を変えたことで交差しているものも 問題なく表示され解決した」という話ではないので、紛らわしい 書き方だったかもしれませんね。すみません。 まだ勉強してる状態なので、間違えているかもしれませんが きちんとソートできれば交差していても大体はいけそうみたい なので半透明なポリゴンを含む場合の描画順については 一般的にはおそらく下のような感じみたいですね。 ・Zバッファを使わない。 ・不透明なものを先に描画する。 ・半透明なものはZソートして、奥から描画する。 ・半透明なポリゴンは複雑に交差させない。  ※もし交差させる場合は、交差しているものを1体でなく分割して   それぞれのZ値に応じて奥から描画する。 あと私には良く分かりませんが、下記のような方法もあるようです。 ■AlphaToCoverage(ピクセル単位の半透明ソートを行う) ttp://hak.wablog.com/62.html
Re: 透過テクスチャの不具合について ( No.8 )
名前:いっち(解決) 日時:2009/12/10 22:29

丁寧な返答ありがとうございます。 おかげさまで理解できました。 昔プレイしたゲームでは適当そうに見えたツリーオブジェクトも、 色々苦労してたんだなと思うと感慨深いです。 私は立方体のオブジェクトを(DrawLine3Dのような)線オブジェクトで貫通させたときに、 一貫した見た目を得るにはどうすれば良いのかということで悩んでいるのですが、なかなか難しそうです。 本来は自分でテストをすれば済む話なのですが、私は視点の制御どころか、 Metasequoiaの扱いにも四苦八苦している状態なので、失礼ながら横から質問させて頂きました。 この度は良い勉強になりました。 スレ主ではありませんが解決とさせて頂きます。

Page: 1 |