トップページ > 記事閲覧
フルスクリーン時のグラフィックが横に伸び、ぼやける
名前:Saucer 日時: 2013/12/27 06:04

お世話になっております。 フルスクリーンモードで実験しているのですが、 二つ問題が生じまして、関数リファレンスページを 見ましたが解決法が分かりません。どうかご教導ください。 @フルスクリーン時に画面が横長にのびてしまいます。 多分、プログラム内の画面アスペクト比とモニターの 画面アスペクト比が一致していないことが原因だと思いますが、 画面を伸ばさずに表示することは可能でしょうか。 Aフルスクリーン時にグラフィックがぼやけてしまいます。 ドットが粗く見えるようにしたいのです。 画面が拡大される際に、ネアレストネイバー法以外 の方法が用いられているのではないでしょうか。 一応SetDrawMode( DX_DRAWMODE_NEAREST ) ; を呼んでみましたが、特に効果は無いようです。 ウインドウモードでDrawExtendGraphを呼ぶときは グラフィックがくっきり表示されるのですが… これらを前処理で設定を変えて 解決することは可能でしょうか? 追記:SetWindowSizeExtendRateで描画画面を拡大する 場合も、グラフィックがぼやけます。これも ネアレストネイバー法が用いられるように設定できたら 嬉しいです!
メンテ

Page: 1 |

Re: フルスクリーン時のグラフィックが横に伸び、ぼやける ( No.1 )
名前:すっぴー 日時:2013/12/27 22:05

@に関しては、私も同様な機能を欲したため、自作クラスで対応しました。 基本的にはゲーム内解像度のバッファスクリーンを作成し、そこにゲーム処理を書き込んだ後にDrawExtendGraphで裏画面に書き込む処理を行いました。 AはSetDrawModeでゲーム内解像度を変更することで対応できないでしょうか?
メンテ
Re: フルスクリーン時のグラフィックが横に伸び、ぼやける ( No.2 )
名前:すっぴー 日時:2013/12/27 22:07

3行目はSetGraphModeですねごめんなさい
メンテ
Re: フルスクリーン時のグラフィックが横に伸び、ぼやける ( No.3 )
名前:すっぴー 日時:2013/12/27 22:19

連投ばかりして申し訳ありませんが、完全に私の舌っ足らずでしたので、補足させてください。 フルスクリーン時の画面解像度サイズはGetDisplayModeとGetDisplayNumを組み合わせることで取得できます。 この解像度変数とゲーム内の解像度を別々に保存しておき、裏画面にはSetGraphModeで画面解像度を指定し、MakeScreenでゲーム内解像度を指定してバッファスクリーンを作成します。 ループ始めに描画先のスクリーンをバッファスクリーンに変更し、そこにさまざまな描画を行います。ループ終わりで、裏画面(画面解像度)にDrawExtendGraphでバッファスクリーンの内容を反映させます。 このとき、ゲーム内解像度と画面解像度のアス比が異なるのであれば、画面解像度 - ゲーム解像度 * (画面解像度 / ゲーム解像度)という計算で、縦または横にどのくらい描画にとって余剰な大きさがあるかを計算することができます。その分を考慮してDrawExtendGraphに引数を渡してください。
メンテ
Re: フルスクリーン時のグラフィックが横に伸び、ぼやける ( No.4 )
名前:Saucer 日時:2013/12/28 07:39

すっぴーさん、大変ご丁寧に説明していただき 誠に有り難う御座います。 @はそんな手がありましたか…個人的に、設定一つ 変えれば解決できると嬉しいのですが、やはりこういう 具体的な要素はユーザー側で実装するべきですかね。 (追記:ライブラリにこういった設定を取り入れて頂きたい もう一つの理由は、もしDirectXで直接解決出来れば、 DXライブラリのバッファスクリーンを使う場合に比べて 処理が軽いだろう、と言うことです。) Aに関しては、一応モニターの解像度に合わせてみましたが、 それでもグラフィックがぼやけました。(ただし、これを 試すのに用いた方法が正しかったかどうかは 分かりません…すみません)
メンテ
Re: フルスクリーン時のグラフィックが横に伸び、ぼやける ( No.5 )
名前:管理人 日時:2013/12/30 21:26

> もう一つの理由は、もしDirectXで直接解決出来れば、 > DXライブラリのバッファスクリーンを使う場合に比べて > 処理が軽いだろう、と言うことです。 いえ、MakeScreen で作成できるバッファスクリーンを使う場合と処理の重さは同じです 処理の重さが同じだからこそ、ライブラリ側に自動で対応をする処理を実装することを躊躇しています ( モニター解像度のアスペクト比自動判定も上手く判定できない場合も間違いなくあるでしょうし・・・ ) PCの性能も大分上がってきたので、そろそろ実装しても良いかもとは思っていますが、 今のところまだ実装の予定はありません > 追記:SetWindowSizeExtendRateで描画画面を拡大する > 場合も、グラフィックがぼやけます。これも > ネアレストネイバー法が用いられるように設定できたら > 嬉しいです! ウインドウ拡大時のフィルタリングはグラフィックスデバイスドライバ任せで、プログラム側から指定することができません なので、ドライバによってはネアレストネイバー法の場合もあれば、バイリニア法の場合もあります 必ずネアレストネイバー法で拡大したい場合は、SetGraphMode で画面のサイズをデスクトップと同じにした上で ゲーム画面サイズのオフスクリーンバッファを MakeScreen で作成してゲーム画面自体は そのオフスクリーンバッファに描画し、ScreenFlip の前に SetDrawMode( DX_DRAWMODE_NEAREST ) ; の設定にした後 裏画面に対してウインドウのサイズと同じ大きさにオフスクリーンバッファを DrawExtendGraph で拡大描画するという方法があります サンプルを作成してみましたので、よろしければご覧ください #include "DxLib.h" #define SCREEN_W (640) #define SCREEN_H (480) int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int handle, x, add ; int Screen ; int DesktopW, DesktopH ; int OldWindowW, OldWindowH ; int WindowW, WindowH ; // ウインドウモードで起動 ChangeWindowMode( TRUE ); // 画面サイズをデスクトップのサイズと同じにする GetDefaultState( &DesktopW, &DesktopH, NULL ) ; SetGraphMode( DesktopW, DesktopH, 32 ) ; // サイズ変更を可能にする SetWindowSizeChangeEnableFlag( TRUE, FALSE ) ; // ウインドウサイズはゲーム画面と一致させる SetWindowSize( SCREEN_W, SCREEN_H ) ; // ウインドウの位置は画面中心付近にする SetWindowPosition( ( DesktopW - SCREEN_W ) / 2, ( DesktopH - SCREEN_H ) / 2 ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // オフスクリーンバッファを作成 Screen = MakeScreen( SCREEN_W, SCREEN_H, FALSE ) ; // 画像の読み込み handle = LoadGraph( "Test1.bmp" ) ; // ウインドウサイズ情報の初期化 GetWindowSize( &WindowW, &WindowH ) ; OldWindowW = WindowW ; OldWindowH = WindowH ; // メインループ(何かキーが押されたらループを抜ける) x = 0 ; add = 8 ; while( ProcessMessage() == 0 ) { // 移動 x += add ; if( x < 0 || x > 640 ) add = -add ; // ウインドウのクライアント領域を取得する OldWindowW = WindowW ; OldWindowH = WindowH ; GetWindowSize( &WindowW, &WindowH ) ; // ウインドウサイズが変化していたら調整する if( OldWindowW != WindowW || OldWindowH != WindowH ) { if( OldWindowW != WindowW ) { WindowH = WindowW * SCREEN_H / SCREEN_W ; } if( OldWindowH != WindowH ) { WindowW = WindowH * SCREEN_W / SCREEN_H ; } SetWindowSize( WindowW, WindowH ) ; } // 描画先をオフスクリーンバッファにする SetDrawScreen( Screen ) ; // 画面のクリア ClearDrawScreen() ; // 画像の描画 DrawGraph( x, 0, handle, TRUE ) ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // 裏画面に拡大描画する SetDrawMode( DX_DRAWMODE_NEAREST ) ; DrawExtendGraph( 0, 0, WindowW, WindowH, Screen, FALSE ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }
メンテ
Re: フルスクリーン時のグラフィックが横に伸び、ぼやける ( No.6 )
名前:Saucer 日時:2013/12/31 06:16

ご返答ありがとうございます。 フルスクリーンモードでも必ずネアレストネイバー法で 拡大することは無理なのでしょうか。管理人様の 方法を使い、大きなウィンドウでフルスクリーンモード を再現いたしますと、残念ながら処理がすごく重くなって しまいます。 同じパソコンでも、DirectXで作られていて、DXライブラ では作られていない作品でフルスクリーン時に ネアレストネイバー法で拡大しているものがあるようですが、 フルスクリーンの場合はそういったフィルタリングが あるのではないでしょうか?
メンテ
Re: フルスクリーン時のグラフィックが横に伸び、ぼやける ( No.7 )
名前:管理人 日時:2013/12/31 06:38

ウインドウモードでの拡大方式はグラフィックスデバイスのドライバ次第ですが、 フルスクリーンモードの場合は今度はモニタ次第になり、 やはりプログラム側から制御することはできません > 同じパソコンでも、DirectXで作られていて、DXライブラ > では作られていない作品でフルスクリーン時に > ネアレストネイバー法で拡大しているものがあるようですが、 > フルスクリーンの場合はそういったフィルタリングが > あるのではないでしょうか? 私の知る限りではその機能は無いはずです そのソフトのフルスクリーンモード時のモニタの解像度を確認してみてください ( モニタによってはモニタ側のボタン操作でモニタの現在の解像度を確認することができます ) 恐らく最大解像度か、少なくともゲーム画面の解像度より高くなっていると思います
メンテ
Re: フルスクリーン時のグラフィックが横に伸び、ぼやける ( No.8 )
名前:Saucer(解決) 日時:2013/12/31 18:31

管理人様とすっぴーさんのアドバイスを用いてやっと解決いたしました! 管理人様の仰るとおり、ソフトのフルスクリーンモード時のモニタの 解像度は最大解像度、つまりソフトを起動する前と同じ解像度でした。 フルスクリーンモード時にはSetGraphModeにモニタの解像度を 渡し、ウインドウモードの場合と同様、DrawExtendGraphで バッファスクリーンを描画することで解決いたしました。 要するに、フルスクリーンモード時にはモニタのアスペクト比と描画先の アスペクト比を1:1にすればネアレストネイバー法を使った拡大描画 が正しく反映される、ということですね。 管理人様、すっぴーさん、親切に回答していただき、 まことにありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存