トップページ > 過去ログ > 記事閲覧
画像への3D描画がウィンドウサイズで途切れる
名前:子梨 日時: 2011/06/09 20:04

DXライブラリを使って、東方プロジェクトのような背景のみが3D、他が2Dのシューティングゲームを作っています。 ウィンドウサイズを様々に変更できるようにしたかったので、以下の記事 (HTTP://)hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1287 を参考に、800*600のMakeGraphした画像に描画し、それをExtendGraphで640*480〜960*720までのウィンドウに描画することを考えました。 しかし、描画のうち3Dオブジェクトのみが、描画時に下の方が途切れてしまうという現象が起こり、困っています。しかも、この現象はウィンドウサイズあるいはフルスクリーンの解像度が800*600より低い640*480の場合のみに起こっています。 正確に測ったわけではないのですが、どうも3Dオブジェクトが、800*600の画像のうちのウィンドウサイズに相当する640*480の部分にしか描画出来ていないように思えます。SetDrawAreaなども試しましたが解決できませんでした。 単に自分のプログラムミスなのかも知れませんが、あるいはDXライブラリがそういう仕様なのでしょうか。それとも何か解決するための関数があるのでしょうか。 サンプルコードは入り組んでいて抜粋しづらいので載せていませんが、必要なら改めて載せさせていただきます。 ご教授よろしくお願いします。

Page: 1 |

Re: 画像への3D描画がウィンドウサイズで途切れる ( No.1 )
名前:いっち 日時:2011/06/09 20:51

文面だけですと分かり難いので、とりあえず事象発生時のスクリーンショットだけでもアップロードして頂けますか?
Re: 画像への3D描画がウィンドウサイズで途切れる ( No.2 )
名前:子梨 日時:2011/06/09 21:20

HTTP://ダブリュー×3に続けて 1.axfc.net/uploader/Img/so/117859.jpg (ダブリューが禁止語句のようなので) 問題発生時のスクリーンショットです。 640*480のウィンドウモード時の画像です。 ゲームのステージ部分(原寸420*560)とその周りの枠に分かれていて、ステージ部分を別画像としてMakeGraphで作成しています(画面を揺らす表現の関係上、430*570でMakeGraphしています)。 3D背景やその他のキャラクターはステージ部分に描画し、描画後のステージ用の画像を、MakeGraph(800, 600)で作成した画像を描画対象として、SetDrawArea(ステージ部分に相当する四角形)でマージンを切り取る様にして等倍で描画し、最終的にステージ部分を描画した後の800*600の画像を640*480のウィンドウにDrawExtendGraphで描画しています。 800*600などでは3D背景の床が描画されます。 途切れている部分が濃い青になっていますが、これは、フォグと同じ色で最初に背景を塗りつぶしているためです。 すいません、説明が分かりにくいですね……。
Re: 画像への3D描画がウィンドウサイズで途切れる ( No.3 )
名前:いっち 日時:2011/06/09 22:07

すみません。画像を拝見しましたがいまいち良く分かりませんでした。 できれば、正常に描画できている画像(800x600?)や、ここがこうなるはず、こうしたいといった注釈を頂けますか? (おそらく、チェックの床が画面下方の枠いっぱいまで描画したいということなのではないかと思いますが・・・) > 途切れている部分が濃い青になっていますが、これは、フォグと同じ色で最初に背景を塗りつぶしているためです。 「途切れている部分が濃い青」ってどこのことでしょう? ゲーム画面を囲っている枠の部分のことでしょうか? もしかして、そこが問題なのでしょうか?
Re: 画像への3D描画がウィンドウサイズで途切れる ( No.4 )
名前:子梨 日時:2011/06/09 22:23

(略)1.axfc.net/uploader/Img/so/117872.jpg 800*600のウィンドウモードで起動した場合の画像です。床が画面下まで伸びていて、これが望ましい描画結果です。 途切れている部分の濃い青は前のと比較して前の床が無い部分で、そのように書いたのは、『フォグはあるけどモデルが描画されていない』のではなく、フォグも含めて何も3Dモデル関連のもの全体がその部分で途切れてしまっているということです。 なお、SetDrawAreaで描画範囲を切り取ってしまっているということはないと思います。そのあたりは何度もチェックしました。
Re: 画像への3D描画がウィンドウサイズで途切れる ( No.5 )
名前:いっち 日時:2011/06/09 22:50

返信ありがとうございます。 ぱっと見の感じでは、カメラの設定が原因っぽいのですが・・・3Dには疎いので詳しくは分からないです。 もうちょっと見てみます。 > 途切れている部分の濃い青は前のと比較して前の床が無い部分 なるほど。真っ黒に見えていましたが、ちょっぴり青いですね。
Re: 画像への3D描画がウィンドウサイズで途切れる ( No.6 )
名前:いっち 日時:2011/06/10 21:24

私なりに検証してみたのですが、今のところ"これだ"といった事象は発生しておりません。 ただ、以下のスレッドの事象の発生条件が本件と良く似ているように思います。 > h t t p://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=2115 もしかすると、Zバッファがらみの事象かもしれません。 事象の見た目はそんな感じではないので、可能性は低そうですが、もし宜しければお試し下さい。 背景の床を描画する前で以下のように設定するとZバッファが無視されるので、 Zバッファが原因だった場合はウィンドウサイズに関わらず見た目が同じになると思います。 > SetUseZBuffer3D( FALSE ); > MV1SetUseZBuffer( /*床のモデルハンドルを指定*/, FALSE );
Re: 画像への3D描画がウィンドウサイズで途切れる ( No.7 )
名前:子梨 日時:2011/06/11 17:27

返信ありがとうございます。 描画直前に入れてみたところ、下部分に描画されなかった部分に描画がされるようになりました。 しかし、本来のZバッファを無効にした時と同じように、Zバッファに関わらず後から描画した部分が常に上書きされるようになってしまいました。 示していただいたスレッドの現象は確かに非常に似ていて(完全に理解できてはいないのですが)、やはりSetDrawScreenとZバッファの相互作用がなにやらうまくいっていないようです。 ClearDrawScreenでZバッファをクリアできるようだったので、3D背景の描画直前にClearDrawScreenを入れたりSetUseZBuffer3Dの位置を変えてみたりしましたが、Zバッファを有効にすると下の部分に書き込めないのは変わりませんでした。 ただ、今回色々試した結果を見るに、ウィンドウのサイズに関係した何かより外の領域のZバッファが、オブジェクトが書き込めないような値になっているように思われます。 ウィンドウを640*480より小さくするとさらに書き込めない領域が増えました。ただ、ウィンドウサイズを少しずつ変えた時に、書き込めない領域が少しずつ増えるのではなく、684*513では通常なのに672*504にした時に、書き込めない領域が一気に増えるという現象が見られました。344*258から340*255にした時も一気に書き込めない領域が増えました。256, 512が何かの境なのでしょうか? 2の階乗単位でクリアしているとか? 何となく正解に近づいている気はするんですが……。
Re: 画像への3D描画がウィンドウサイズで途切れる ( No.8 )
名前:いっち 日時:2011/06/11 19:32

> 描画直前に入れてみたところ、下部分に描画されなかった部分に描画がされるようになりました。 あれ?私の予測では、800x600 の場合も 640x480 のように床が途中で切れるようになるのではないかと思っていたのですが、 逆に 640x480 でも床が表示されるようになったのですね・・・。 件のスレッド(no=2115)で行われた応急処置によると、ウィンドウサイズよりも大きなグラフィックハンドル(430x570)に対しては Zバッファは無効となっているはずなので、640x480 の際の描画結果が変わるのはちょっとおかしい気がします。 (ただ、DXライブラリの更新履歴のVer.3.05の項には特に記述が見当たらないので現状がどうなっているのかはわかりません) 子梨さんがご使用のDXライブラリのバージョンはおいくつでしょうか?
Re: 画像への3D描画がウィンドウサイズで途切れる ( No.9 )
名前:子梨 日時:2011/06/11 21:08

ああ、やっぱりそういう文脈ですよね?(no=2115) バージョンは3.04dを使っています。no=2115よりは後だと思うのですが。 ちょっと前回のコメントが語弊を招きそうだったのでまとめておきます。 MV1SetUseZBufferが falseの時…… 800*600, 640*480共に全体が描画される。 しかし、どちらの場合もZ
Re: 画像への3D描画がウィンドウサイズで途切れる ( No.10 )
名前:子梨 日時:2011/06/11 21:14

失礼しました。全部書く前に投稿してしまいました。 ああ、やっぱりそういう文脈ですよね?(no=2115) バージョンは3.04dを使っています。no=2115よりは後だと思うのですが。 現状では、 MV1SetUseZBufferが falseの時…… 800*600, 640*480共に全体が描画される。 しかし、どちらの場合もZバッファ無効に伴い描画順序がおかしい。 trueの時…… 800*600では正しく描画。640*480では下が切れる。 また、描画用のMakeGraphしたものは縦サイズ570だが、ウィンドウ縦サイズ512超であれば正しく描画される。(512だとダメで、513なら正しく描画されました)
Re: 画像への3D描画がウィンドウサイズで途切れる ( No.11 )
名前:いっち 日時:2011/06/11 21:31

Ver.3.04d は 2011/1/3 リリースですので (no=2115) での処置(2011/01/10)は含まれていないはずです。 差し支えなければ Ver.3.05 での挙動を試して頂けますか? (ライブラリを更新した場合、リビルドしてから実行しなければならないことにお気をつけ下さい。) 意図的にZバッファを無効にしなかった場合、 おそらく、800x600 では、今まで通り正常に描画され、 640x480 では、床は画面下まで描画されるが描画順序がおかしくなるのではないかと思います。
Re: 画像への3D描画がウィンドウサイズで途切れる ( No.12 )
名前:子梨(解決) 日時:2011/06/11 22:18

そんなに新しいスレッドだったんですね。 ちゃんと確かめなくてすいませんでした。 早速3.05にして試してみました。 予想の通り、800*600では正常に描画され、 640*480では自動的にZバッファが無効になった時の描画の様子になりました。 ということは全く同じ問題ということで、現段階では仕様ということになるでしょうか。 とりあえずゲームに関しては800*600を最低解像度として作っていこうと思います。 解決とすべきかどうか迷いますが、原因が分かったということでスレッドとしては解決としておきます。 細かにご指導くださりありがとうございました。
Re: 画像への3D描画がウィンドウサイズで途切れる ( No.13 )
名前:いっち 日時:2011/06/11 23:39

スレッド(no=2115)での対応は応急処置とのことですので、管理人さんの見解をお待ちするのが良いと思います。 管理人さん> 私個人の要望としましては、やはりウィンドウのサイズに関わらずZバッファを利用できるようにして頂きたいです。 たとえば、DXライブラリの初期化時に作成ずるZバッファのサイズを指定する機能などがあると助かります。 ご検討の程よろしくお願いします。
Re: 画像への3D描画がウィンドウサイズで途切れる ( No.14 )
名前:管理人 日時:2011/06/19 03:53

いっちさんご対応ありがとうございます デフォルトで使用するZバッファのサイズを指定できる関数、いいですね 早速追加しましたのでよろしければこちらのバージョンをダウンロードしてください http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCCTest.exe // Gnu C++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 追加した関数は以下の関数です // 画面用のZバッファのサイズを設定する int SetZBufferSize( int ZBufferSizeX, int ZBufferSizeY ) ; この関数を DxLib_Init の前でも後でも SetZBufferSize( 800, 600 ) ; という感じで使っていただければ、画面は 640x480、描画画像は 800x600 としても Zバッファが適用された描画結果が得られるようになります よろしければお試しください m(_ _)m
Re: 画像への3D描画がウィンドウサイズで途切れる ( No.15 )
名前:いっち 日時:2011/06/19 13:09

対応ありがとうございます。 問題なく動作することを確認しました。 ただ、以下のようなテストコードの場合、過去のバージョンと挙動が異なっておりますが、仕様となるのでしょうか? 同期、非同期を問わず、ウィンドウのサイズが変更されるアプリ全体に影響があるように思います。 (過去のバージョンではウィンドウサイズの変更時に自動的にZバッファが作成されなおすようでした) //- 以下、テストコード -// #include "DxLib.h" int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) { ChangeWindowMode( TRUE ); SetWindowText( "DxLib:" DXLIB_VERSION_STR ); if ( DxLib_Init( ) == -1 ) return -1; SetGraphMode( 800, 600, 32 ); int white = GetColor( 255, 255, 255 ); // SetZBufferSize( 800, 600 ); // <- Zバッファを明示的に作り直さない int bgh = MakeScreen( 800, 600 ); SetDrawScreen( bgh ); SetUseZBufferFlag( TRUE ); SetWriteZBufferFlag( TRUE ); DrawBoxToZBuffer( 100, 100, 200, 200, TRUE, DX_ZWRITE_MASK ); DrawBox( 0, 0, 300, 300, white, TRUE ); SetDrawScreen( DX_SCREEN_BACK ); while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { ClearDrawScreen( ); DrawExtendGraph( 0, 0, 640, 480, bgh, TRUE ); DrawFormatString( 0, 0, white, "TEST" ); ScreenFlip( ); } DxLib_End( ); return 0; }
Re: 画像への3D描画がウィンドウサイズで途切れる ( No.16 )
名前:管理人 日時:2011/06/26 16:05

ご報告ありがとうございます すいません、仕様ではありません Zバッファを明示的に指定した場合以外は SetGraphMode で画面サイズの変更が 行われる度にZバッファを画面サイズに作り直すようにしました 修正版をアップしましたので、もしご必要な方はダウンロードしてください m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCCTest.exe // Gnu C++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
Re: 画像への3D描画がウィンドウサイズで途切れる ( No.17 )
名前:いっち 日時:2011/06/26 18:00

修正確認しました。問題なく動作しています。 ありがとうございました。

Page: 1 |