SetWindowSizeExtendRateは環境によって拡縮方法が異なるのを統一したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
NAN-A
記事: 94
登録日時: 13年前

SetWindowSizeExtendRateは環境によって拡縮方法が異なるのを統一したい

#1

投稿記事 by NAN-A » 8年前

DXライブラリでPC用ゲームを制作しています。
プレイヤーの設定でウインドウサイズを変更できるようなシステムを制作しているのですが、
複数人に試してもらった結果、拡縮方法(バイリニア・ニアレストネイバー)が異なりました。
目的はSetWindowSizeExtendRateを使用して全員がバイリニアで拡縮するにはどうすればよいでしょうか?

・SetDrawMode( DX_DRAWMODE_BILINEAR ); を記述しましたが、「ニアレストネイバーで拡縮される」と報告をうけました。

・↓のスレッドは10年前のものですが、現在も同じ状況でしょうか?
http://dxlib.o.oo7.jp/cgi/patiobbs/pati ... ast&no=291

・ニアレストネイバーで拡大されている画像を添付いたします。(倍率1.0は1706x960になります)
x0.5
画像
x0.75
画像
x1.0
画像
x1.25
画像

・相手のスペックは
Intel Core i5-4670 @ 3.40GHz
Installed memory (RAM): 4,00 GB
Windows 7 64-bit
AMD Radeon R9 380 Series (Crippe)
となります。Log.txtも添付いたします。
Log.txt

以上となります。
お手数をおかけいたしますが、ご教授をいただければと思います。

Egg

Re: SetWindowSizeExtendRateは環境によって拡縮方法が異なるのを統一したい

#2

投稿記事 by Egg » 8年前

SetDrawModeはあくまで、Direct3Dのテクスチャフィルタリングの方法を指定するだけで
SetWindowSizeExtendRateの拡縮には影響を与えません。

なので、別のアプローチを示します。

①SetDrawMode( DX_DRAWMODE_BILINEAR );をコールする。
②ゲームの描画先をスワップチェインのバックバッファに直接描画せずに
ゲームオリジナルの解像度で作られたレンダーターゲットテクスチャに描画する。
③レンダーターゲットテクスチャを用いてウィンドウサイズにピッタリのポリゴンを描画する。
④ウィンドウサイズを変えるときはSetGraphMode();を使用してポリゴンのサイズを変更してください。

これで、②の時点ではゲームのオリジナルの解像度ですが、
③でバックバッファにウィンドウサイズいっぱいのQuadにテクスチャを貼り付けることでSetDrawMode()で設定されたテクスチャフィルタリングでバックバッファに描画されます。

ただし、これでもウィンドウのサイズによっては上手くいかない場合があります。
というのもグラフィックカードの特性として描画先が2の倍数でない場合、
何をやっても強制的にニアレストネイバーになってしまう可能性があります。
オフトピック
853などの微妙なウィンドウサイズはやめるべきでしょうね。1706もやめたほうがいいでしょう。

Egg

Re: SetWindowSizeExtendRateは環境によって拡縮方法が異なるのを統一したい

#3

投稿記事 by Egg » 8年前

④の書き方が悪いので訂正します。

④ウィンドウサイズを変えるときはSetGraphMode();を使用してポリゴンのサイズを変更してください。

④ウィンドウサイズを変えるときはSetGraphMode();を使用してバックバッファとウィンドウのサイズを変更した後、
ポリゴンの頂点の位置を変更し、画面いっぱいにテクスチャが描画されるように変更してください。

アバター
NAN-A
記事: 94
登録日時: 13年前

Re: SetWindowSizeExtendRateは環境によって拡縮方法が異なるのを統一したい

#4

投稿記事 by NAN-A » 8年前

Egg様

おかげで解決することができました。
ありがとうございます。

私にはスワップチェイン・バックバッファ・レンダーターゲットテクスチャ・ポリゴンなど
専門用語が多かったので、かなり苦戦をしてしまいました。
ということなので、今後このスレッドを見た人用に私なりの言葉で解決方法を書きたいと思います。

※端的に言うとリファレスンスにある int MakeScreen( int SizeX, int SizeY, int UseAlphaChannel ) ; のサンプルを見て、真似するのがいいってことになります。

1.まずSetWindowSizeExtendRateは使ってはいけない。

2.DXライブラリでゲームを作ってるとおそらくSetDrawScreen( DX_SCREEN_BACK );を使って裏画面に描画し、ScreenFlip()をwhile文にいれて、毎フレーム「裏に描画→表に映す」という感じにしていると思います。
(私の場合、テンプレをマネているので DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); と while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){} というコードがありました。

3.この「裏画面→表に映す」を「第3の画面→表に映す」という風に変えなくてはいけない。

4.第3の画面を作るには MakeScreen を使う。 表に映すには  SetDrawScreen( DX_SCREEN_FRONT ) ; を毎フレーム使う。

5.あとは MakeScreen のサンプルがまさにそれなので、マネればうまくいくはず。 DrawString/SetDrawScreen/DrawExtendGraphのところをwhile文で囲む感じです。

6.注意としてゲーム中で SetGraphMode を使うとロードした画像がすべて消えてしまうので”第3の画面”も含めてロードし直さなくてはいけない。

こんな感じになります。

Egg
記事: 1
登録日時: 8年前

Re: SetWindowSizeExtendRateは環境によって拡縮方法が異なるのを統一したい

#5

投稿記事 by Egg » 8年前

おめでとうございます。
そうですね、単語が難しかったですか。
しかし、その知識はかならず役に立つはずです。
正直、途中で質問が来るかと思いましたが、やり遂げましたね。

閉鎖

“C言語何でも質問掲示板” へ戻る