トップページ > 過去ログ > 記事閲覧
ウィンドウサイズを変えると表示画像の大きさが変動する
名前:はたおり 日時: 2011/07/08 01:58

MakeGraphした書き込み可能画像に対して、DrawPrimitive2DToShaderを使って書き込みを行い、 その書き込んだ画像を表示させているのですが、 ウィンドウの大きさを1ピクセル分変えると画像の大きさが倍になったりする現象を解決する方法がわかりません。 再現コードと再現exeを同梱したものをアップロードしますので、どなたか原因が分かりましたらお願いします。 使用しているDXライブラリのバージョンはVer 3.05です。 http://bit.ly/nPzMx1 (www1などが弾かれるので短縮URLにしました) 一応コードも貼っておきます。 ---------------------------------- #include "DxLib.h" //const int SIZE_X = 801; // だと期待通りに動く const int SIZE_X = 800; // にすると、画像が拡大されて表示される const int SIZE_Y = 600; class GraphicLayer{ private: int back_handle; int front_handle; VERTEX2DSHADER Vert[ 6 ] ; int trans_shader; float left; float top; FLOAT4 t; int layer_graph; public: GraphicLayer( float left, float top, float width, float height ) : left(left), top(top), back_handle( LoadGraph("B.png") ), front_handle( LoadGraph("A.png") ) { SetDrawValidGraphCreateFlag( TRUE ) ; // 描画可能画像を作成する指定 layer_graph = MakeGraph( width, height ); // 描画可能画像の作成 SetDrawValidGraphCreateFlag( FALSE ) ; // 描画可能画像は制約が多いので普通に LoadGraph した画像まで描画可能画像になってしまわないように直ぐ戻すようにしてください // 頂点データの準備 Vert[ 0 ].pos = VGet( 0, 0, 0.0f ) ; Vert[ 1 ].pos = VGet( width, 0, 0.0f ) ; Vert[ 2 ].pos = VGet( 0, height, 0.0f ) ; Vert[ 3 ].pos = VGet( width, height, 0.0f ) ; Vert[ 0 ].dif = GetColorU8( 255,255,255,255 ) ; Vert[ 0 ].spc = GetColorU8( 0,0,0,0 ) ; Vert[ 0 ].u = 0.0f ; Vert[ 0 ].v = 0.0f ; Vert[ 1 ].u = 1.0f ; Vert[ 1 ].v = 0.0f ; Vert[ 2 ].u = 0.0f ; Vert[ 2 ].v = 1.0f ; Vert[ 3 ].u = 1.0f ; Vert[ 3 ].v = 1.0f ; Vert[ 0 ].su = 0.0f ; Vert[ 0 ].sv = 0.0f ; Vert[ 1 ].su = 1.0f ; Vert[ 1 ].sv = 0.0f ; Vert[ 2 ].su = 0.0f ; Vert[ 2 ].sv = 1.0f ; Vert[ 3 ].su = 1.0f ; Vert[ 3 ].sv = 1.0f ; Vert[ 0 ].rhw = 1.0f ; Vert[ 1 ].rhw = 1.0f ; Vert[ 2 ].rhw = 1.0f ; Vert[ 3 ].rhw = 1.0f ; Vert[ 4 ] = Vert[ 2 ] ; Vert[ 5 ] = Vert[ 1 ] ; t.x = 0.0; trans_shader = LoadPixelShader( "SamplePS.pso" ) ; // 使用するピクセルシェーダーをセット SetUsePixelShader( trans_shader ) ; } void update(){ draw(); } void draw(){ // 書き込み先をこのレイヤにする SetDrawScreen( layer_graph ) ; // 前の書き込みデータを消す ClearDrawScreen() ; // 使用するテクスチャをセット SetUseTextureToShader( 0, front_handle ) ; SetUseTextureToShader( 1, back_handle ) ; SetPSConstF( 0, t ) ; // 描画 DrawPrimitive2DToShader( Vert, 6, DX_PRIMTYPE_TRIANGLELIST ) ; // 描画先を裏画面に戻す SetDrawScreen( DX_SCREEN_BACK ) ; // レイヤを描画する DrawGraph( left, top, layer_graph, false ) ; } void trans(){ if(1.0 >= t.x){ t.x += 0.02; } else{ int temp = front_handle; front_handle = back_handle; back_handle = temp; t.x = 0.0; } } }; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウインドウモードで起動 ChangeWindowMode( TRUE ); SetGraphMode( SIZE_X , SIZE_Y , 16 ) ; SetWindowText("const int SIZE_X = 801;"); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; GraphicLayer gl(0,0,256,1024); while(ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0) { ClearDrawScreen() ; gl.trans(); gl.update(); ScreenFlip() ; } // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }

Page: 1 |

Re: ウィンドウサイズを変えると表示画像の大きさが変動する ( No.1 )
名前:コーラ 日時:2011/07/08 04:06

大したことは全然分からないのですが DXライブラリのテクスチャ処理は2の乗数が推奨されていることがあるので 画像ファイルのピクセル数を2の乗数にしたところ、私の環境では解消されたように見えました。
Re: ウィンドウサイズを変えると表示画像の大きさが変動する ( No.2 )
名前:はたおり 日時:2011/07/08 17:20

想定している画像サイズが様々なので、画像ファイルの方で対応するというのはちょっと。 2の乗数で作った書き込み可能画像ハンドルに一回書き込んでからそれを更に、とやれなくもないのですが、 その処理分だけ重くなってしまいそうで……。
Re: ウィンドウサイズを変えると表示画像の大きさが変動する ( No.3 )
名前:いっち 日時:2011/07/08 19:38

おそらくテクスチャが分割されて読み込まれている(分割される条件などは分かりません)ために発生する事象だと思うので、 GraphicLayer のオブジェクトを生成する前で SetUseDivGraphFlag を FALSE に設定してみてください。 詳しくは以下のリファレンスをご覧下さい。 > h t t p ://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_other.html#R15N24 また、GetGraphTextureSize を使用するとグラフィックハンドルのテクスチャのサイズが得られますので、そこからuv座標を求められると思います。 (GetGraphTextureSize は最新のテストバージョンにしか入っていないと思うので、適当なスレッドから拾ってください)
Re: ウィンドウサイズを変えると表示画像の大きさが変動する ( No.4 )
名前:はたおり(解決) 日時:2011/07/08 20:44

>いっち氏 SetUseDivGraphFlagを用いる事で正常に描画されるようになりました。 ありがとうございます!

Page: 1 |