トップページ > 記事閲覧
板ポリゴンを加算描画した時の不具合
名前:yellow 日時: 2016/01/08 12:44

複数の板ポリゴンを加算描画した時に 黒い線が入る場合があります。 下記の簡易的なサンプルでは「poly.mqo」を メタセコイアでデフォルトの水平の矩形を作り それに何らかの画像を張り付けたものとします(画像はどんなものでも結構です)。 この状態でy軸は同じ、z座標を変えた板ポリゴン を重なるように描画すると黒線が入ります。 エッジ部分が黒くなっているのかもしれません。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ) ; if( DxLib_Init() == -1 ) {return -1; } int model; model=MV1LoadModel("poly.mqo"); MV1SetMaterialDrawBlendMode( model,0,DX_BLENDMODE_ADD ) ; MV1SetMaterialDrawBlendParam( model,0,10 ) ; while( ProcessMessage() == 0 ) { ClearDrawScreen() ; for (int i=0;i<1000;i++){ MV1SetPosition(model,VGet( 320.0f,0.0f, float(i)) ); MV1DrawModel(model ); } ScreenFlip() ; } DxLib_End() ; return 0 ; }
メンテ

Page: 1 |

Re: 板ポリゴンを加算描画した時の不具合 ( No.1 )
名前:管理人 日時:2016/01/10 02:58

すみません、載せていただいたプログラムに自前で用意した poly.mqo を使用して 実行してみましたが、真っ黒の画面が表示されるだけでした お手数で申し訳ありませんが、よろしければ載せていただいたプログラムで現象を 確認できる poly.mqo と画像ファイルを BQE00322(あっとまーく)nifty.com ( (あっとまーく)を@に置き換えてください に送っていただけないでしょうか? m(_ _;m
メンテ
Re: 板ポリゴンを加算描画した時の不具合 ( No.2 )
名前:yellow 日時:2016/01/10 13:36

張り付ける画像はサンブルプロジェクト内に含まれるBlendGraph.bmpでokです。 poly.mqoは下記ドキュメントの内容そのままです こちらの画面では白い矩形に複数の黒線が入ります。 ただ山田さんの環境でBLEND_ADD指定のモデルが 真っ黒になるなら環境以前の可能性もありそうですね。 描画のZBUFFERをfalseに設定するととりあえず 黒線は出なくなりますので症状を確認できない場合は保留で結構です。 Metasequoia Document Format Text Ver 1.0 Scene { pos -0.0000 -0.0001 1499.9998 lookat 0.0006 0.0009 0.0010 head -0.0536 pich 0.9236 bank 0.0000 ortho 0 zoom2 5.0000 amb 0.250 0.250 0.250 dirlights 1 { light { dir 0.408 0.408 0.816 color 1.000 1.000 1.000 } } } Material 1 { "mat1" shader(3) col(0.992 0.949 1.000 1.000) dif(1.000) amb(0.000) emi(0.000) spc(0.000) power(0.00) tex("BlendGraph.bmp") } Object "obj1" { depth 0 folding 0 scale 1.000000 1.000000 1.000000 rotation 0.000000 0.000000 0.000000 translation 0.000000 0.000000 0.000000 visible 15 locking 0 shading 1 facet 59.5 color 0.898 0.498 0.698 color_type 0 vertex 4 { -100.0000 0.0000 -100.0000 100.0000 0.0000 -100.0000 -100.0000 0.0000 100.0000 100.0000 0.0000 100.0000 } face 1 { 4 V(0 1 3 2) M(0) UV(0.00000 0.00000 1.00000 0.00000 1.00000 1.00000 0.00000 1.00000) } } Eof
メンテ
Re: 板ポリゴンを加算描画した時の不具合 ( No.3 )
名前:管理人 日時:2016/01/17 15:51

ご返信が遅くなり申し訳ありません 載せていただいた mqoファイルと、BlendGraph.bmp で手元の環境でも現象を確認することができました ( BlendGraph.bmp のように『画像の端が透明色ではない画像』である必要があったようです  ( 私が使用していたのは Test1.bmp などの『画像の端が透明色の画像』でした ) ) ただ、こちらの動作は仕様で、原因はお気付きの通りZバッファが関係しています 説明を書いたら長くなってしまったので、黒い線を無くすための方法を先にご説明します 半透明の物体の描画にZバッファを使用する場合『カメラから遠い物体から描画する』と正常な描画結果が 得られますので、MV1SetPosition(model,VGet( 320.0f,0.0f, float(i)) ); こちらの部分を MV1SetPosition(model,VGet( 320.0f,0.0f, float(1000-i)) ); として、1ループ目に描画されるものが一番カメラから離れていて、ループを重ねるたびにカメラに 近づくようにすれば黒い線も入らない描画結果が得られますので、よろしければお試しください m(_ _)m 以下は元のプログラムで黒い線が入る仕組みについての説明です、興味がありましたら読んでください Zバッファの基本的な機能としては 『描画の順番に関係なく、カメラから遠い描画物は、カメラにより近い描画物に隠れるようにする』 ためのものです そしてZバッファは加算描画や半透明描画など「透けて向こう側が見える」状況のことは考慮されていませんので、 例えば現実世界では半透明の物体は透けているのでその物体の向こう側にあるものも透けて見えますが、Zバッファを使用して 1.カメラのより手前にある半透明の物体Aを描画 2.物体Aよりカメラから遠い箇所にある、物体Aに隠れる位置にある物体Bを描画 ↑この順番で上記の処理を行った場合、物体Bは描画されることなく、物体Aに隠れて何も描画されない という描画結果になります( 現実世界なら物体Bも物体Aの後ろに透けて見えるのが正しいにも関わらず ) この前提で載せていただいたプログラムを見てみるとfor(int i=0;i<1000;i++)のループの中で、 iを描画するモデルのZ値としているため、 『1ループ目に描画されるモデルが最もカメラに近く、2ループ目、3ループ目とループの回数が後に なるほど描画されるモデルはカメラから遠ざかっていく』 処理となっています Zバッファが理想的に機能した場合、 『2ループ目に描画されるモデルは1ループ目のモデルに最上部の1ピクセル分を除き隠れ殆ど描画されず、 3ループ目に描画されるモデルは1・2ループ目に描画されたモデルに最上部の1ピクセル分を除き隠れ殆ど描画されず、 以降後に描画されるモデルは全てそれ以前に描画されたモデルに最上部の1ピクセル分を除き隠れ殆ど描画されない』 はずで、加算描画特有の『色が何回も加算されるため、加算の回数が増す度に色が明るく(白く)なる』現象は 発生しないはずです ですが、実際に載せていただいたプログラムを実行すると『色が重なって白くなる』現象が発生しています この現象の原因はZバッファの精度と、Zバッファの設定が関係しています まずDXライブラリでは初期状態ではZバッファの精度は16ビットとなっています 16ビットの精度というのは一般的なZバッファの中では最も低い精度となるので、 プログラムでは1ループ毎にZの値が1づつ増えていますが、Zバッファで前後の判定を行われる際は 値は16ビットに丸め込まれ『1〜3ループ前のモデルと同じZ値である』として処理されてしまっています そしてZバッファの動作の設定で、DXライブラリでは初期状態では 『既に描画されている物体と同じZ値か、よりカメラに近いZ値(より値の小さいZ値)であれば描画する』 という設定になっているので『1〜3ループ前のモデルと同じZ値である』として処理された場合、同じZ値として 判定されるモデルの数の分だけ加算で重ねて描画されることになり、結果として明るい(白い)描画結果となっています Zバッファが理想的に機能した場合に近い描画結果は MV1SetMaterialDrawBlendParam( model,0,10 ) ; の後に MV1SetZBufferCmpType( model, DX_CMP_LESS ) ; という記述を増やして実行することで確認することができます これはZバッファの動作の設定を変える処理で、DX_CMP_LESS は 『既に描画されている物体よりカメラに近い(Z値が小さい)場合のみ描画する』 という設定なので、仮にZバッファの精度が足りなくて『1〜3ループ前のモデルと同じZ値』になってしまっても 重ねて描画されることはなくなります この場合の実行結果を見て頂ければわかりますが、重ねて描画されることはなくなるので、描画結果が明るく(白く) なることはありません つまり最初のプログラムの状態で全体的に真っ白の描画結果になり、所々黒い横線が入るのは 『Zバッファの精度と設定が原因』で、異常なのは『所々にある黒い線』ではなく、 寧ろ『白くなってしまっている部分』だった、というわけです
メンテ
Re: 板ポリゴンを加算描画した時の不具合 ( No.4 )
名前:yellow(解決) 日時:2016/01/18 14:34

Zバッファの仕組みと描画が私自身で 誤解していた部分がありまして、 今回詳しくご教示いただきとても勉強になりました 付け加えてありがとうございましたm(_ _)m
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存