いつもDXライブラリを使わせていただいています
今シェーダを使用して画面を暗くする処理を書いているところなのですが、バグと思われる動作をしたので報告します。
SetUseTextureToShader関数の第2引数にLoadDivGraphで作成したグラフィックハンドルを指定した場合に分割する前の画像全体が渡されているようです。
また、DrawPrimitive2D関数でも同じような現象が起きました。
再現コード(DXライブラリのバーションは3.16fです)
#include <DxLib.h>
#include <locale.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
//エラー処理は省略しています
_tsetlocale(LC_ALL, _T("")); //ロケールの設定をしておかないとワイド文字列が文字化けするので
ChangeWindowMode(TRUE); //ウィンドウモードで起動
SetUseDirect3DVersion(DX_DIRECT3D_9); //シェーダモデル3を使用するのでDX9を使用するように変更
DxLib_Init(); //DXライブラリの初期化(ウィンドウ生成)
//シェーダーの読み込み
int ColoringLPShandle = LoadPixelShader(_T("ps_Shadow.pso"));
//マップチップテクスチャファイルの読み込み
int MapChipTexture[10];
int MapLightTextureMask[10];
LoadDivGraph(_T("mapChip1.png"), 10, 4, 3, 64, 64, MapChipTexture);
LoadDivGraph(_T("mapChipLight.png"), 10, 4, 3, 64, 64, MapLightTextureMask);
//頂点データの準備?(初期化)
VERTEX2DSHADER ColoringLVertex[6]; //シェーダー用
tagVERTEX2D ColoringLVertex_[6]; //普通の描画用
for (int i = 0; i < 4; i++) {
ColoringLVertex[i].pos = VGet(0.0f, 0.0f, 0.0f);
ColoringLVertex[i].rhw = 1.0f;
ColoringLVertex_[i].pos = ColoringLVertex[i].pos;
ColoringLVertex_[i].rhw = ColoringLVertex[i].rhw;
}
ColoringLVertex[0].dif = GetColorU8(255, 255, 255, 255);
ColoringLVertex[0].spc = GetColorU8(0, 0, 0, 0);
ColoringLVertex[0].u = 0.0f; ColoringLVertex[0].v = 0.0f;
ColoringLVertex[1].u = 1.0f; ColoringLVertex[1].v = 0.0f;
ColoringLVertex[2].u = 0.0f; ColoringLVertex[2].v = 1.0f;
ColoringLVertex[3].u = 1.0f; ColoringLVertex[3].v = 1.0f;
ColoringLVertex[0].su = 0.0f; ColoringLVertex[0].sv = 0.0f;
ColoringLVertex[1].su = 1.0f; ColoringLVertex[1].sv = 0.0f;
ColoringLVertex[2].su = 0.0f; ColoringLVertex[2].sv = 1.0f;
ColoringLVertex[3].su = 1.0f; ColoringLVertex[3].sv = 1.0f;
ColoringLVertex[4] = ColoringLVertex[2];
ColoringLVertex[5] = ColoringLVertex[1];
ColoringLVertex_[0].dif = GetColorU8(255, 255, 255, 255);
ColoringLVertex_[0].u = 0.0f; ColoringLVertex_[0].v = 0.0f;
ColoringLVertex_[1].u = 1.0f; ColoringLVertex_[1].v = 0.0f;
ColoringLVertex_[2].u = 0.0f; ColoringLVertex_[2].v = 1.0f;
ColoringLVertex_[3].u = 1.0f; ColoringLVertex_[3].v = 1.0f;
ColoringLVertex_[4] = ColoringLVertex_[2];
ColoringLVertex_[5] = ColoringLVertex_[1];
//描画先の左上の座標
float texX1 = 30;
float texY1 = 30;
//シェーダに使用するグラフィックの設定(適当な場所)
int grHandle = MapChipTexture[8];
int Mask = MapLightTextureMask[8];
//マスク処理をしたいグラフィックの幅と高さを取得する
float sizeW, sizeH;
GetGraphSizeF(grHandle, &sizeW, &sizeH);
//頂点データの準備
ColoringLVertex[0].pos = VGet((float)(texX1), (float)(texY1), 0.0f);
ColoringLVertex[1].pos = VGet((float)(texX1 + sizeW), (float)(texY1), 0.0f);
ColoringLVertex[2].pos = VGet((float)(texX1), (float)(texY1 + sizeH), 0.0f);
ColoringLVertex[3].pos = VGet((float)(texX1 + sizeW), (float)(texY1 + sizeH), 0.0f);
ColoringLVertex[4] = ColoringLVertex[2];
ColoringLVertex[5] = ColoringLVertex[1];
ColoringLVertex_[0].pos = VGet((float)(texX1), (float)(texY1), 0.0f);
ColoringLVertex_[1].pos = VGet((float)(texX1 + sizeW), (float)(texY1), 0.0f);
ColoringLVertex_[2].pos = VGet((float)(texX1), (float)(texY1 + sizeH), 0.0f);
ColoringLVertex_[3].pos = VGet((float)(texX1 + sizeW), (float)(texY1 + sizeH), 0.0f);
ColoringLVertex_[4] = ColoringLVertex_[2];
ColoringLVertex_[5] = ColoringLVertex_[1];
SetUsePixelShader(ColoringLPShandle);//使用するピクセルシェーダーをセット
SetUseTextureToShader(0, grHandle); //使用するテクスチャをセット
SetUseTextureToShader(1, Mask); //使用するテクスチャをセット
//シェーダを使用して描画
DrawPrimitive2DToShader(ColoringLVertex, 6, DX_PRIMTYPE_TRIANGLELIST);
//普通に描画
//DrawGraph(texX1, texY1, grHandle, TRUE);
//DrawGraph(texX1, texY1, Mask, TRUE);
//DrawPrimitive2D(ColoringLVertex_, 6, DX_PRIMTYPE_TRIANGLELIST, grHandle, TRUE);
SetUsePixelShader(-1);//使用するピクセルシェーダーをセット
WaitKey(); //キー入力の待機
}