トップページ > 過去ログ > 記事閲覧
DrawPolygon2DToShaderの不具合
名前:レモン茶 日時: 2013/02/28 04:58

いつもDxライブラリにお世話になっています。 LoadGraph関数で読み込んだグラフィックハンドルをそのままピクセルシェーダーに渡して、DrawPolygon2DToShader関数を実行すると、UV座標がずれたような画像になります。 また、MakeScreen関数で作ったテクスチャに一度書き出してやってから、そのテクスチャをピクセルシェーダーに渡すとUV座標がぴったりになるように描画されました。 バージョンは3.10aです。 以下がサンプルコードです。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int texhandle, pshandle ; VERTEX2DSHADER Vert[ 6 ] ; ChangeWindowMode(TRUE); SetGraphMode(1024,576,32); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // テクスチャを読み込む // LoadGraphを使って読み込んだテクスチャを渡してやるとUV座標がずれる? texhandle = LoadGraph( L"test.jpg" ) ; int drawHandle = texhandle; /* // MakeScreenで作ったテクスチャを描画するようにするとずれない int ms_tex = MakeScreen(1024,576); SetDrawScreen(ms_tex); ClearDrawScreen(); DrawExtendGraph(0,0,1024,576,texhandle,false); drawHandle = ms_tex; */ SetDrawScreen(DX_SCREEN_BACK); // ピクセルシェーダーを読み込む pshandle = LoadPixelShader( L"ps_test.pso" ) ; // 2ポリゴン分の頂点のデータをセットアップ // 画面いっぱいに表示するように Vert[ 0 ].pos = VGet( 0.0f, 0.0f, 0.0f ) ; Vert[ 0 ].rhw = 1.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[ 0 ].su = 0.0f ; Vert[ 0 ].sv = 0.0f ; Vert[ 1 ].pos = VGet( 1024.0f, 0.0f, 0.0f ) ; Vert[ 1 ].rhw = 1.0f ; Vert[ 1 ].dif = GetColorU8( 255,255,255,255 ) ; Vert[ 1 ].spc = GetColorU8( 0, 0, 0, 0 ) ; Vert[ 1 ].u = 1.0f ; Vert[ 1 ].v = 0.0f ; Vert[ 1 ].su = 1.0f ; Vert[ 1 ].sv = 0.0f ; Vert[ 2 ].pos = VGet( 0.0f, 576.0f, 0.0f ) ; Vert[ 2 ].rhw = 1.0f ; Vert[ 2 ].dif = GetColorU8( 255,255,255,255 ) ; Vert[ 2 ].spc = GetColorU8( 0, 0, 0, 0 ) ; Vert[ 2 ].u = 0.0f ; Vert[ 2 ].v = 1.0f ; Vert[ 2 ].su = 0.0f ; Vert[ 2 ].sv = 1.0f ; Vert[ 3 ].pos = VGet( 1024.0f, 576.0f, 0.0f ) ; Vert[ 3 ].rhw = 1.0f ; Vert[ 3 ].dif = GetColorU8( 255,255,255,255 ) ; Vert[ 3 ].spc = GetColorU8( 0, 0, 0, 0 ) ; Vert[ 3 ].u = 1.0f ; Vert[ 3 ].v = 1.0f ; Vert[ 3 ].su = 1.0f ; Vert[ 3 ].sv = 1.0f ; Vert[ 4 ].pos = VGet( 0.0f, 576.0f, 0.0f ) ; Vert[ 4 ].rhw = 1.0f ; Vert[ 4 ].dif = GetColorU8( 255,255,255,255 ) ; Vert[ 4 ].spc = GetColorU8( 0, 0, 0, 0 ) ; Vert[ 4 ].u = 0.0f ; Vert[ 4 ].v = 1.0f ; Vert[ 4 ].su = 0.0f ; Vert[ 4 ].sv = 1.0f ; Vert[ 5 ].pos = VGet( 1024.0f, 0.0f, 0.0f ) ; Vert[ 5 ].rhw = 1.0f ; Vert[ 5 ].dif = GetColorU8( 255,255,255,255 ) ; Vert[ 5 ].spc = GetColorU8( 0, 0, 0, 0 ) ; Vert[ 5 ].u = 1.0f ; Vert[ 5 ].v = 0.0f ; Vert[ 5 ].su = 1.0f ; Vert[ 5 ].sv = 0.0f ; // 使用するテクスチャを0番にセット SetUseTextureToShader( 0, drawHandle ) ; // 使用するピクセルシェーダーをセット SetUsePixelShader( pshandle ) ; // シェーダーを使用した2Dの2ポリゴンの描画 DrawPolygon2DToShader( Vert, 2 ) ; // キー入力待ち WaitKey() ; // 読み込んだピクセルシェーダーの削除 DeleteShader( pshandle ) ; // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; } ピクセルシェーダーはDrawPolygon2DToShaderのサンプルを弄ってテクスチャの色をそのまま出力する単純なものでテストをしていました。 以上です。

Page: 1 |

Re: DrawPolygon2DToShaderの不具合 ( No.1 )
名前:管理人 日時:2013/03/03 21:44

お使いになった test.jpg の幅・高さは2のn乗でしょうか? MakeScreen で作成される画像は例外的に2のn乗ではないサイズでも、 実行環境で使用するグラフィックスデバイスが対応している場合は 2のn乗サイズに補正せずにテクスチャを作成しますが、LoadGraph で 読み込まれる画像は必ず 「2のn乗ではない幅、高さの場合は、それぞれその幅・高さよりも大きく 最も値が近い2のn乗サイズに補正してテクスチャを作成する」 という処理が行われます ( そして余分な部分は真っ黒で塗りつぶされます ) どのようなサイズのテクスチャが作成されたかは GetGraphTextureSize 関数で取得することができます // グラフィックハンドルが持つ一つ目のテクスチャのサイズを得る int GetGraphTextureSize( int GrHandle, int *SizeXBuf, int *SizeYBuf ) ; この関数で取得できる「テクスチャのサイズ」で GetGraphSize 関数で取得できる 「画像のサイズ」を割ることで、サンプルプログラムの右端・下端の頂点のu,v値に 代入されている 1.0f に代わる値を算出することができます float u2, v2 ; int SizeX, SizeY ; int TexSizeX, TexSizeY ; GetGraphSize( texHandle, &SizeX, &SizeY ) ; GetGraphTextureSize( texHandle, &TexSizeX, &TexSizeY ) ; u2 = ( float )SizeX / TexSizeX ; v2 = ( float )SizeY / TexSizeY ; Vert[ 0 ].pos = VGet( 0.0f, 0.0f, 0.0f ) ; Vert[ 0 ].rhw = 1.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[ 0 ].su = 0.0f ; Vert[ 0 ].sv = 0.0f ; Vert[ 1 ].pos = VGet( 1024.0f, 0.0f, 0.0f ) ; Vert[ 1 ].rhw = 1.0f ; Vert[ 1 ].dif = GetColorU8( 255,255,255,255 ) ; Vert[ 1 ].spc = GetColorU8( 0, 0, 0, 0 ) ; Vert[ 1 ].u = u2 ; Vert[ 1 ].v = 0.0f ; Vert[ 1 ].su = u2 ; Vert[ 1 ].sv = 0.0f ; Vert[ 2 ].pos = VGet( 0.0f, 576.0f, 0.0f ) ; Vert[ 2 ].rhw = 1.0f ; Vert[ 2 ].dif = GetColorU8( 255,255,255,255 ) ; Vert[ 2 ].spc = GetColorU8( 0, 0, 0, 0 ) ; Vert[ 2 ].u = 0.0f ; Vert[ 2 ].v = v2 ; Vert[ 2 ].su = 0.0f ; Vert[ 2 ].sv = v2 ; Vert[ 3 ].pos = VGet( 1024.0f, 576.0f, 0.0f ) ; Vert[ 3 ].rhw = 1.0f ; Vert[ 3 ].dif = GetColorU8( 255,255,255,255 ) ; Vert[ 3 ].spc = GetColorU8( 0, 0, 0, 0 ) ; Vert[ 3 ].u = u2 ; Vert[ 3 ].v = v2 ; Vert[ 3 ].su = u2 ; Vert[ 3 ].sv = v2 ; Vert[ 4 ].pos = VGet( 0.0f, 576.0f, 0.0f ) ; Vert[ 4 ].rhw = 1.0f ; Vert[ 4 ].dif = GetColorU8( 255,255,255,255 ) ; Vert[ 4 ].spc = GetColorU8( 0, 0, 0, 0 ) ; Vert[ 4 ].u = 0.0f ; Vert[ 4 ].v = v2 ; Vert[ 4 ].su = 0.0f ; Vert[ 4 ].sv = v2 ; Vert[ 5 ].pos = VGet( 1024.0f, 0.0f, 0.0f ) ; Vert[ 5 ].rhw = 1.0f ; Vert[ 5 ].dif = GetColorU8( 255,255,255,255 ) ; Vert[ 5 ].spc = GetColorU8( 0, 0, 0, 0 ) ; Vert[ 5 ].u = u2 ; Vert[ 5 ].v = 0.0f ; Vert[ 5 ].su = u2 ; Vert[ 5 ].sv = 0.0f ; よろしければお試しになってみてください m(_ _)m ( 因みにグラフィックスデバイスが2のn乗サイズ以外のテクスチャの作成に 対応していない場合は MakeScreen で作成される画像も2のn乗サイズに 補正されますので注意してください )
Re: DrawPolygon2DToShaderの不具合 ( No.2 )
名前:レモン茶(解決) 日時:2013/03/04 13:23

返答ありがとうございます。 なるほど、LoadGraphでは必ず2^nサイズに補正がかかるんですね。 不具合じゃなくて私の勘違いでした。 すいません。 テクスチャサイズの取得方法も教えていただきありがとうございました。

Page: 1 |