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;
}