トップページ > 記事閲覧
SetDrawAlphaTest()の設定反映について
名前:Yab 日時: 2013/05/20 21:23

お世話になっております。 SetDrawAlphaTest()についてお聞きしいことがございます。 SetDrawAlphaTest(); MV1ModelDraw(); といった流れで、モデルの描画前にアルファテストの設定を行ったのですが、 その設定が、反映されませんでした(少なくともDirect3Dのほうには)。 DxLibのソースでSetDrawAlphaTest()の実装を確認したところ、 SetDrawAlphaTest()では、ワークの更新のみで、 Direct3Dの更新は、別のタイミングで行っているようでした。 ここで確認させていただきたいのですが、 ・SetDrawAlphaTest()の動作は上記認識であっていますか? ・仮にあっていたとすると、設定を即座(モデルの描画前に)に反映させる方法は存在しますか? ご回答いただければ幸いです。 以上、よろしくお願いいたします。
メンテ

Page: 1 |

Re: SetDrawAlphaTest()の設定反映について ( No.1 )
名前:管理人 日時:2013/05/26 14:41

手元で以下のようなテストプログラムを組んで試してみましたが、SetDrawAlphaTest の設定は 問題なく反映されていました #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle ; int ModelAlpha ; int AlphaTestParam ; // ウインドウモードで起動 ChangeWindowMode( TRUE ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; ModelHandle = MV1LoadModel( "DxChara.x" ) ; SetDrawScreen( DX_SCREEN_BACK ) ; SetCameraPositionAndTarget_UpVecY( VGet( -0.000f, 754.656f, -919.505f ), VGet( -0.000f, 376.695f, -7.027f ) ); ModelAlpha = 255 ; AlphaTestParam = 0 ; while( ProcessMessage() == 0 ) { ClearDrawScreen() ; DrawBox( 0, 0, 640, 480, GetColor( 0,128,0 ), TRUE ) ; if( CheckHitKey( KEY_INPUT_LEFT ) == 1 && ModelAlpha > 0 ) ModelAlpha -- ; if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 && ModelAlpha < 255 ) ModelAlpha ++ ; if( CheckHitKey( KEY_INPUT_DOWN ) == 1 && AlphaTestParam > 0 ) AlphaTestParam -- ; if( CheckHitKey( KEY_INPUT_UP ) == 1 && AlphaTestParam < 255 ) AlphaTestParam ++ ; SetDrawAlphaTest( DX_CMP_GREATER, AlphaTestParam ) ; MV1SetOpacityRate( ModelHandle, ModelAlpha / 255.0f ) ; MV1DrawModel( ModelHandle ) ; DrawFormatString( 0, 0, GetColor( 255,255,255 ), "ModelAlpha:%d TestAlpha:%d", ModelAlpha, AlphaTestParam ) ; ScreenFlip() ; } // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; } 上下キーでアルファテストでキャンセルされるアルファの閾値を、 左右キーでモデルの描画のアルファ値を変更できます モデルの描画のアルファ値がアルファテストのアルファ値を下回るとモデルが描画されなくなるはずですので、 よろしければ Yabさんの環境でも正常に動作するかお試しになってみてください m(_ _)m ( 使用しているモデルはDXライブラリのサンプルプログラム実行用フォルダに入っている DxChara.x です ) > ・SetDrawAlphaTest()の動作は上記認識であっていますか?  はい、SetDrawAlphaTest を呼んだ時点では Direct3D には反映されません、MV1DrawModel で モデルを描画する過程で適用しています > ・仮にあっていたとすると、設定を即座(モデルの描画前に)に反映させる方法は存在しますか?  モデルの描画時に反映させています
メンテ
Re: SetDrawAlphaTest()の設定反映について ( No.2 )
名前:Yab 日時:2013/05/31 00:29

回答ありがとうございます。 サンプルまで作っていただいて、申し訳ないです。 サンプル実行して、期待通りに動作すること確認しました。 質問した後もいろいろ調べていたのですが、 MV1DrawModel()の動作を勘違いしていました。 その為、質問内容が適切では有りませんでした。 私の調べた範囲では、設定した値が現在の設定値から変更されるた場合に、 みDirect3Dに命令を発行しているようで、 この為、計測するタイミングによってはコマンド発行を見逃してしまう事がある。 ということが判りました。 おそらく設定できないと勘違いしたのはこの為です。 お騒がせして申し訳ございませんでした。 これはコレで問題ないのですが、私の環境だと問題があります。 現在、エフェクトにEffekseerというToolを使っています。 これにはToolで作成したデータを再生するライブラリが付属しています。 このライブラリを使用してエフェクト表示を行っています。 で、ゲームの作成が進んできたあるとき、エフェクトがまったく表示されなくなりました。 原因を調べてみるとαテストでピクセル描画が弾かれていました。 特定のモデルを描画するとαテストの設定を変更していたようです。 ここで、SetDrawAlphaTest()の登場となります。 しかし、エフェクト描画前に呼び出してみたのですが、設定が反映されませんでした。 ここから迷走が始まりどうすれば設定できるのかわからなくなり質問した次第です。 1番聞きたかった部分は、 > ・仮にあっていたとすると、設定を即座(モデルの描画前に)に反映させる方法は存在しますか? > > モデルの描画時に反映させています になります。 回答を元に考えると、SetDrawAlphaTest()のあとになにか適当なモデルを 描画してやればよい、ということになりますがこのやり方しかないですかね? 一応、他の関数が使えないかと試しに、DrawBillboard3D()を SetDrawAlphaTest()のあとに呼び出してもうまくいきませんでした。
メンテ
Re: SetDrawAlphaTest()の設定反映について ( No.3 )
名前:管理人 日時:2013/06/02 18:36

Direct3D を使用する別のミドルウェアをお使いだったのですね DXライブラリでは無駄な処理を省いて処理負荷を下げる為に同じ引数で SetDrawBlendMode などの設定関数が呼ばれた場合は無視して Direct3D の APIを呼ばないようにしています なので、DXライブラリ外で Direct3D の設定が変更されてもDXライブラリは そのことを認識できないので、設定を元に戻す目的で SetDrawAlphaTest 等の 設定関数を呼んでも前回呼んだときと同じ引数の場合は無視されてしまいます 非公開関数の RefreshDxLibDirect3DSetting という関数を呼ぶと DXライブラリが Direct3D に対して行った設定を再度行いますので、 Effekseer の描画処理の後でDXライブラリの関数を呼ぶ前に RefreshDxLibDirect3DSetting(); という記述を追加してみてください
メンテ
Re: SetDrawAlphaTest()の設定反映について ( No.4 )
名前:Yab 日時:2013/06/05 23:07

回答有難うございます。 上記の関数呼び出しを追加しました 今のところ問題なく動作しています。 これで、先に進めそうです。 再度、ありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存