いつも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のサンプルを弄ってテクスチャの色をそのまま出力する単純なものでテストをしていました。
以上です。