トップページ > 記事閲覧
SetDrawModeが文字列のみ逆になる(バグ?)
名前:メカ様 日時: 2020/07/30 06:26

長らくご愛用させていただいております。 表題の件、 SetDrawMode(DX.DX_DRAWMODE_BILINEAR); としたときの動作にて不具合があると思い書き込ませていただきます。 【環境】 Windows10 VisualStudio 2019 DXLib C#版 Ver3.21f(Ver3.21も確認) 画面構成 ディスプレイ : 3840 x 2160 指定解像度 : 1920 x 1080 フルスクリーンモード 【内容】 SetDrawMode(DX.DX_DRAWMODE_BILINEAR);がバイニリア『ON』、 SetDrawMode(DX.DX_DRAWMODE_NEAREST);がバイニリア『OFF』とします。 DrawString系関数(DrawString,DrawStringToHandleのみ確認)にて描画した文字列を『文字列』とします。 DrawGraph系関数(DrawExtendGraphのみ確認)にて描画したグラフィックハンドルを『画像』とします。 バイニリアが機能する = 『ぼやける』とします。 バイニリアがOFFの時、文字列がぼやけて、画像がぼやけません。 バイニリアがONの時、文字列がぼやけず、画像がぼやけます。 つまり、文字列のSetDrawModeが逆に機能しているのではないかと考えています。 以下画像参照 バイニリアON+OFFの2パターン画像を格納 h_t_t_p_s_:_/_/_w_w_w_.dropbox.com/sh/p5bopcg1i33o0xa/AACFVMuVaW-8HqKbLvuwGFIia?dl=0 なお、ソースコードは1~2万行と膨大かつメディアファイルの公開になる為載せておりませんが、必要であれば上記リンクに格納します。 以上、お手数をおかけしますが、ご確認のほどよろしくお願いいたします。
メンテ

Page: 1 |

Re: SetDrawModeが文字列のみ逆になる(バグ?) ( No.1 )
名前:管理人 日時:2020/07/31 01:50

SetDrawMode( DX_DRAWMODE_BILINEAR ); は、DrawExtendGraph や DrawRotaGraph などの拡大・縮小を伴う描画に影響を与えますが、 DrawGraph や DrawString などの拡大・縮小が行われない描画には影響を与えません また、SetGraphMode( 1920, 1080, 32 ); とゲーム画面を 1920x1080 に設定して、 ディスプレイの解像度が 3840x2160 の場合に行われる 『ゲーム画面の解像度をディスプレイ解像度へ拡大する処理』にも影響を与えません 1920x1080 のゲーム画面の解像度を 3840x2160 のディスプレイ解像度に 拡大するときにバイリニアフィルタリングを行うかどうかについては SetFullScreenScalingMode という関数で設定を行います // フルスクリーンモード時の解像度モードを設定する int SetFullScreenScalingMode( int ResolutionMode ) ; <関数リファレンス> https://dxlib.xsrv.jp/function/dxfunc_graph3.html#R4N11 ともあれ、DrawString や DrawGraph は拡大・縮小を行わない描画なので SetDrawMode( DX_DRAWMODE_BILINEAR ); でも SetDrawMode( DX_DRAWMODE_NEAREST ); でも描画結果に変化は起きない筈です 確認のためにスペースキーを押すと画面に表示されている文字列を描画する際の SetDrawMode の設定を DX_DRAWMODE_BILINEAR と DX_DRAWMODE_NEAREST で 切り替えるプログラムを組んで実行してみましたが、DX_DRAWMODE_BILINEAR でも DX_DRAWMODE_NEAREST でも見た目に変化はありませんでした #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int IsBilinear = TRUE ; // 画面モードを 1920x1080 に設定 SetGraphMode( 1920, 1080, 32 ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // アンチエイリアス付きフォントに変更 ChangeFontType( DX_FONTTYPE_ANTIALIASING_8X8 ) ; // フォントを設定 ChangeFont( "メイリオ" ) ; SetFontThickness( 0 ) ; SetFontSize( 30 ) ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // メインループ while( ProcessMessage() == 0 ) { // 画面のクリア ClearDrawScreen() ; // スペースキーでバイリニアモードをON/OFF if( GetInputChar( TRUE ) == ' ' ) { IsBilinear = IsBilinear ? FALSE : TRUE ; } // 描画モードを設定 SetDrawMode( IsBilinear ? DX_DRAWMODE_BILINEAR : DX_DRAWMODE_NEAREST ) ; // 描画モードを表示 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "バイリニアモード:%s", IsBilinear ? "ON" : "OFF" ) ; // 文字列を描画 DrawString( 100, 100 + 48 * 0, "コントローラ設定", GetColor( 255,255,255 ) ) ; DrawString( 100, 100 + 48 * 1, "解像度", GetColor( 255,255,255 ) ) ; DrawString( 100, 100 + 48 * 2, "ウィンドウモード", GetColor( 255,255,255 ) ) ; DrawString( 100, 100 + 48 * 3, "画質", GetColor( 255,255,255 ) ) ; DrawString( 100, 100 + 48 * 4, "バイリニア", GetColor( 255,255,255 ) ) ; DrawString( 100, 100 + 48 * 5, "音量", GetColor( 255,255,255 ) ) ; DrawString( 100, 100 + 48 * 6, "セーブデータ初期化", GetColor( 255,255,255 ) ) ; DrawString( 100, 100 + 48 * 7, "設定保存", GetColor( 0,255,0 ) ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } よろしければメカ様さんの環境でも見た目の変化が起きないか確認してみてください m(_ _)m
メンテ
Re: SetDrawModeが文字列のみ逆になる(バグ?) ( No.2 )
名前:メカ様 日時:2020/07/31 04:58

お世話になっております 只今確認いたしました。 >拡大するときにバイリニアフィルタリングを行うかどうかについては SetFullScreenScalingMode という関数で設定を行います 申し訳ございませんでした。よく確認してみたところ以下のようなコードを記載していたため、 SetFullScreenScalingMode および SetDrawMode の両方が切り替わっておりました。 以下コピペです // バイリニア法にして画質を向上させる if (SysInfo.Bilinear) { DX.SetFullScreenScalingMode(DX.DX_DRAWMODE_BILINEAR); DX.SetDrawMode(DX.DX_DRAWMODE_BILINEAR); } else { DX.SetFullScreenScalingMode(DX.DX_DRAWMODE_NEAREST); DX.SetDrawMode(DX.DX_DRAWMODE_NEAREST); } >ともあれ、DrawString や DrawGraph は拡大・縮小を行わない描画なので DrawGraph"系"と書いていましたが、 私のプログラム上は様々な解像度に対応させるために全てDrawExtendGraphで変形描画しているため、私にとっての拡大縮小の概念が特殊なのかもしれません。 例) // 設定した解像度(描画領域)を取得する DX.GetWindowSize(out int Screen_X, out int Screen_Y); // 画面比率を計算する(ベースとなる解像度は1080p) float Ratio_X = Screen_X / 1920f; float Ratio_Y = Screen_Y / 1080f; // グラフィックハンドル int Handle = DX.LoadGraph("Pass"); // 画面いっぱいに画像を描画する DX.DrawExtendGraph((int)(0 * Ratio_X), (int)(0 * Ratio_Y), (int)(1920 * Ratio_X), (int)(1080 * Ratio_Y), Handle,DX.TRUE); // 描画領域の真ん中らへんに画像を描画する DX.DrawExtendGraph((int)(910 * Ratio_X), (int)(490 * Ratio_Y), (int)(1010 * Ratio_X), (int)(590 * Ratio_Y), Handle, DX.TRUE); なお、SetFullScreenScalingModeに修正した以下プログラムにて提示した画像と同じようにバイニリアモードが逆(?)に動作していることを確認しました。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int IsBilinear = TRUE ; // 画面モードを 1920x1080 に設定 SetGraphMode( 1920, 1080, 32 ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // アンチエイリアス付きフォントに変更 ChangeFontType( DX_FONTTYPE_ANTIALIASING_8X8 ) ; // フォントを設定 ChangeFont( "メイリオ" ) ; SetFontThickness( 0 ) ; SetFontSize( 30 ) ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // メインループ while( ProcessMessage() == 0 ) { // 画面のクリア ClearDrawScreen() ; // スペースキーでバイリニアモードをON/OFF if( GetInputChar( TRUE ) == ' ' ) { IsBilinear = IsBilinear ? FALSE : TRUE ; } // フルスクリーンモード時の解像度モードを設定する SetFullScreenScalingMode( IsBilinear ? DX_DRAWMODE_BILINEAR : DX_DRAWMODE_NEAREST ) ; // 描画モードを表示 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "バイリニアモード:%s", IsBilinear ? "ON" : "OFF" ) ; // 文字列を描画 DrawString( 100, 100 + 48 * 0, "コントローラ設定", GetColor( 255,255,255 ) ) ; DrawString( 100, 100 + 48 * 1, "解像度", GetColor( 255,255,255 ) ) ; DrawString( 100, 100 + 48 * 2, "ウィンドウモード", GetColor( 255,255,255 ) ) ; DrawString( 100, 100 + 48 * 3, "画質", GetColor( 255,255,255 ) ) ; DrawString( 100, 100 + 48 * 4, "バイリニア", GetColor( 255,255,255 ) ) ; DrawString( 100, 100 + 48 * 5, "音量", GetColor( 255,255,255 ) ) ; DrawString( 100, 100 + 48 * 6, "セーブデータ初期化", GetColor( 255,255,255 ) ) ; DrawString( 100, 100 + 48 * 7, "設定保存", GetColor( 0,255,0 ) ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } お手数をおかけしますが再度ご確認をよろしくお願いします。
メンテ
Re: SetDrawModeが文字列のみ逆になる(バグ?) ( No.3 )
名前:管理人 日時:2020/07/31 23:22

> // バイリニア法にして画質を向上させる > if (SysInfo.Bilinear) > { >  DX.SetFullScreenScalingMode(DX.DX_DRAWMODE_BILINEAR); >  DX.SetDrawMode(DX.DX_DRAWMODE_BILINEAR); > } > else > { >  DX.SetFullScreenScalingMode(DX.DX_DRAWMODE_NEAREST); >  DX.SetDrawMode(DX.DX_DRAWMODE_NEAREST); > } すみません、SetFullScreenScalingMode に渡す値は紛らわしいのですが DX_DRAWMODE_BILINEAR や DX_DRAWMODE_NEAREST ではなく DX_FSSCALINGMODE_BILINEAR または DX_FSSCALINGMODE_NEAREST となります > なお、SetFullScreenScalingModeに修正した以下プログラムにて提示した画像と同じようにバイニリアモードが逆(?)に動作していることを確認しました。 載せていただいたプログラムの SetFullScreenScalingMode( IsBilinear ? DX_DRAWMODE_BILINEAR : DX_DRAWMODE_NEAREST ) ; こちらの部分を SetFullScreenScalingMode( IsBilinear ? DX_FSSCALINGMODE_BILINEAR : DX_FSSCALINGMODE_NEAREST ) ; に変更したところ、正常に動作しましたので、よろしければお試しください m(_ _)m
メンテ

Page: 1 |

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

   クッキー保存