トップページ > 記事閲覧
ウィンドウでニアレストネイバー法がしたいです
名前:ろく 日時: 2024/05/02 20:26

フルスクリーンモードで補間法を変更するSetFullScreenScalingModeのように、 ウィンドウモードでSetWindowSizeExtendRateを使い、 ウィンドウサイズの倍率を上げた時の補間法を変更したいです。 具体的にはニアレストネイバー法に変更したいです。 リファレンスやヘッダファイルをざっと検索かけましたが、 めぼしい関数が見つかりませんでした。 見落としているだけかもしれませんが (;^_^A よろしくお願いします。
メンテ

Page: 1 |

Re: ウィンドウでニアレストネイバー法がしたいです ( No.1 )
名前:管理人 日時:2024/05/04 00:42

関数名が嘘になってしまっていますが、Direct3D 11 を使用している通常状態でしたら ウィンドウモードでも SetFullScreenScalingMode の設定が有効ですので よろしければお試しください m(_ _;m // ウィンドウモードでもニアレストネイバー法による拡大になります SetFullScreenScalingMode( DX_FSSCALINGMODE_NEAREST );
メンテ
Re: ウィンドウでニアレストネイバー法がしたいです ( No.2 )
名前:ろく 日時:2024/05/04 10:33

すいません、試してみたのですが補完法に変化がないようです。 // dxlib_init ChangeWindowMode(true); SetFullScreenScalingMode(DX_FSSCALINGMODE_NEAREST); SetMainWindowText("main"); SetGraphMode(600, 800, 32); SetWindowSizeExtendRate(2.0); if(DxLib_Init()==-1) return -1; SetDrawScreen(DX_SCREEN_BACK); という順番で設定してみたのですが……。 一応環境としては、gccのver13.2.0(x86_64-win32-seh-rev1)を使っています。 DXライブラリはフルセットの物(gcc 12.2.0〜)を使っています。 また、"-Wall"を使っても、2、3個の警告はあれどエラーは一切無いですし、 当たり前ですがDirectX(3D)も11に対応しています。
メンテ
Re: ウィンドウでニアレストネイバー法がしたいです ( No.3 )
名前:管理人 日時:2024/05/05 03:20

効果がありませんでしたか… 手元で再度試した限りでは、やはり SetFullScreenScalingMode( DX_FSSCALINGMODE_NEAREST ); の効果はありました 載せていただいたコードではウィンドウの拡大率を2倍にされていますが、2倍では バイリニアなのか二アレストなのかの判別が少し難しいかもしれませんので、 以下のウィンドウの拡大率を16倍にするテストプログラムでご確認いただけないでしょうか? m(_ _)m ( 正常に動作すればドットがカクカクしているのが確認できる円がウィンドウ一杯に表示されます ) #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウィンドウモードで起動 ChangeWindowMode( TRUE ) ; // ウィンドウの表示サイズを16倍に設定 SetWindowSizeExtendRate( 16.0 ) ; // ゲーム画面の解像度は 32x32 SetGraphMode( 32, 32, 32 ) ; // ニアレストネイバー法で拡大表示 SetFullScreenScalingMode( DX_FSSCALINGMODE_NEAREST ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { return -1 ; } // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // ウインドウが閉じられるか何かキーが押されるまでループ while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ) { // 画面をクリア ClearDrawScreen() ; // 画面の中心に半径14pixelの円を描画 DrawCircle( 16, 16, 14, GetColor( 255, 255, 255 ), TRUE ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }
メンテ
Re: ウィンドウでニアレストネイバー法がしたいです ( No.4 )
名前:ろく 日時:2024/05/06 00:12

imgur.com/Lhpkn56 一度別のクリーンな環境でテストプログラムを試してみましたが、 画像の通りバイリニア法となり、ダメみたいです。 imgur.com/P7hsw72 一応、フルスクリーンモードで試してみると、 しっかりニアレストネイバー法になっていました。
メンテ
Re: ウィンドウでニアレストネイバー法がしたいです ( No.5 )
名前:ろく 日時:2024/05/06 00:56

imgur.com/VaRR5YR どうやらDirectXとDirect3Dはバージョンが必ず一致しているわけではないようですね。 そのあたりには詳しくないので知りませんでした。 dxdiagを使って調べてみると、表記上はDirectX12ですが、 Direct3Dの機能バージョンのところの最終が10.1で、なんと11に対応していませんでした……。 これは詐欺ですよね、だってその上に11.1ってあるじゃないですか() これを受けて友人にサンプルの実行を頼んでみたところ、 きちんとニアレストネイバー法で描画されました。 フルスクリーンでいけるなら、ウィンドウでもいけると思ったのですが……。
メンテ
Re: ウィンドウでニアレストネイバー法がしたいです ( No.6 )
名前:管理人 日時:2024/05/06 03:30

検証していただきありがとうございます > dxdiagを使って調べてみると、表記上はDirectX12ですが、 > Direct3Dの機能バージョンのところの最終が10.1で、なんと11に対応していませんでした……。 > これは詐欺ですよね、だってその上に11.1ってあるじゃないですか() Direct3D の機能はハードウェア( GPU )の機能を使用するので、インストールされている DirectX が 12 でも、 Direct3D 12 の機能に GPU が対応していなければ Direct3D 12 として動作させることができません なので、ろくさんがお使いのPCは Direct3D 10.1 より上のバージョンの機能は使えない、ということになります > フルスクリーンでいけるなら、ウィンドウでもいけると思ったのですが……。 DXライブラリは Direct3D 11 が使用できない場合は Direct3D 9 を使用するのですが、Direct3D 9 では ウィンドウモードで拡大する場合にバイリニアになるのか二アレストになるのかはグラフィックスデバイス( GPU )のドライバ依存になります ( 私のPCに搭載されている GeForce RTX 2080 Ti では二アレストでした ) こちらのサンプルのようにゲーム画面の解像度の仮画面を用意して描画は仮画面に対して行い、 最後に裏画面に表示したいサイズに拡大描画する、という方法を使えば Direct3D 9 でも二アレストネイバー法で 拡大して表示することが出来ますので、よろしければお試しください m(_ _)m #include "DxLib.h" // ゲーム画面解像度 #define GAME_SCREEN_W 32 #define GAME_SCREEN_H 32 // 表示スケール #define SCREEN_SCALE 16 // 仮画面 int SubBackBuffer ; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウィンドウモードで起動 ChangeWindowMode( TRUE ) ; // ウィンドウの表示サイズを1倍に設定 SetWindowSizeExtendRate( 1.0 ) ; // 画面の解像度はゲーム画面解像度の16倍 SetGraphMode( GAME_SCREEN_W * SCREEN_SCALE, GAME_SCREEN_H * SCREEN_SCALE, 32 ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { return -1 ; } // ゲーム画面の解像度の仮画面を作成 SubBackBuffer = MakeScreen( GAME_SCREEN_W, GAME_SCREEN_H, FALSE ) ; // ウインドウが閉じられるか何かキーが押されるまでループ while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ) { // 描画先を仮画面に設定 SetDrawScreen( SubBackBuffer ) ; // 画面をクリア ClearDrawScreen() ; // 画面の中心に半径14pixelの円を描画 DrawCircle( 16, 16, 14, GetColor( 255, 255, 255 ), TRUE ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // 仮画面を画面一杯に拡大描画 DrawExtendGraph( 0, 0, GAME_SCREEN_W * SCREEN_SCALE, GAME_SCREEN_H * SCREEN_SCALE, SubBackBuffer, FALSE ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }
メンテ
Re: ウィンドウでニアレストネイバー法がしたいです ( No.7 )
名前:ろく(解決済み) 日時:2024/05/06 17:30

> DXライブラリは Direct3D 11 が使用できない場合は Direct3D 9 を使用するのですが、Direct3D 9 では > ウィンドウモードで拡大する場合にバイリニアになるのか二アレストになるのかはグラフィックスデバイス( GPU )のドライバ依存になります > ( 私のPCに搭載されている GeForce RTX 2080 Ti では二アレストでした ) そうなんですね、 つまり私のGPUだとバイリニア法がデフォルトだったというわけですね。 > こちらのサンプルのようにゲーム画面の解像度の仮画面を用意して描画は仮画面に対して行い、 > 最後に裏画面に表示したいサイズに拡大描画する、という方法を使えば Direct3D 9 でも二アレストネイバー法で > 拡大して表示することが出来ますので、よろしければお試しください m(_ _)m なるほど裏画面の前に仮画面を経由するという方法があるんですね……! 確かにこの手法を使うとニアレストネイバー法で補間描画されました! 画面が1つ増えて実行時間やメモリに影響があるかと少し心配しましたが、 実行時間は調べてみても誤差程度でしかなく、メモリも許容範囲ということで、 しばらくはこれを使ってみようと思います。 ありがとうございました! <m(_ _)m>
メンテ

Page: 1 |

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

   クッキー保存