トップページ > 記事閲覧
DrawPrimitive2DToShaderに関して
名前:御茶碗 日時: 2016/09/18 19:26

いつも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(); //キー入力の待機 }
メンテ

Page: 1 |

Re: DrawPrimitive2DToShaderに関して ( No.1 )
名前:管理人 日時:2016/09/19 12:24

DrawPrimitive2DToShader や DrawPrimitve2D などのポリゴンを直接描画する関数では LoadDivGraph で作成したグラフィックハンドルを使用することはできません ( エラーにはなりませんが、ご覧の通り分割前の画像全体となります ) 似たような関数の DrawPolygon3D のリファレンスにその旨が書かれていますので、よろしければご覧下さい m(_ _)m https://dxlib.xsrv.jp/function/dxfunc_3d.html#R14N7 また、使用する画像の縦・横のサイズは 2 の n乗である必要があります ( 最近の GPU では 2 の n乗の制限はありませんが、古い環境ではまだ 2 の n乗の制限があるので、 どのような環境でも正常に動作させたい場合は 2 の n乗にする必要があります )
メンテ
Re: DrawPrimitive2DToShaderに関して ( No.2 )
名前:御茶碗(解決) 日時:2016/09/19 14:35

返事ありがとうございます。 他の方法を考えてみます。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存