トップページ > 記事閲覧
スクリーンモード切り替え時のMV1SetMaterialDrawAlphaTestの挙動について
名前:t 日時: 2025/08/01 22:30

お世話になっております Ver 3.24dを使用しております 開発環境は Microsoft Visual Studio Community 2022 (64 ビット) - Current Version 17.9.4 Windows 11 Home 24H2 です 木の3Dモデルをロードし、葉の部分のマテリアルにMV1SetMaterialDrawAlphaTestでアルファテストを設定し透過させて表示するプログラムを作成しています。 モデルは複数ロードして森のように配置し、葉の部分が正しく透過できているか確認できるようにしています。 エフェクト処理をする関係でMakeScreenで複数のスクリーンを生成して描画をしています。 プログラム開始時はフルスクリーンモードになっており、SetUseZBuffer3D(TRUE); SetWriteZBuffer3D(TRUE);でZバッファ関連の設定もした上で描画をしたところ、透過処理をして描画ができています。 プログラム途中でウインドウモードを変更できるようにしており、ChangeWindowMode、SetGraphModeで通常ウインドウモードにしても引き続き正しく描画ができています。 しかし、再びフルスクリーンモードにすると、それまで正しく描画ができていた透過マテリアル部分の表示がおかしくなります。 ウインドウモード変更後にモデルをロードし直し、MV1SetMaterialDrawAlphaTestを実行しているにも関わらず、この関数を実行していない場合と同じ表示になってしまいます。 変更後に SetUseZBuffer3D(TRUE); SetWriteZBuffer3D(TRUE); を行ってもふるまいは変わりませんでした。 葉の部分以外の、透過処理をしていない部分などは問題なく描画ができています。 試しにフォグのふるまいも確認してみましたが、フルスクリーンモードにしても設定をし直すことで正常に描画がされました。 プログラムの実行中にフルスクリーンモードに変更をするとZバッファや透過マテリアル描画関連の設定がリセット、あるいは変更されてしまうのでしょうか? 解決策をご教示いただけますと幸いです。 よろしくお願いいたします。
メンテ

Page: 1 |

Re: スクリーンモード切り替え時のMV1SetMaterialDrawAlphaTestの挙動について ( No.1 )
名前:管理人 日時:2025/08/02 21:46

手元の環境で MV1SetMaterialDrawAlphaTest でアルファテストを設定して描画するプログラムを組んでみたのですが、 ウィンドウモード←→フルスクリーンモード を何回切り替えてもアルファテストの設定が無効化することはありませんでした こちらにテストに使用したプログラムをアップしましたので、よろしければ圧縮ファイルを展開して 中にある MV1SetMaterialDrawAlphaTest.exe を実行して、tさんの環境ではこちらのテストプログラムでも アルファテストが無効になってしまうか試してみていただけないでしょうか? m(_ _)m https://dxlib.xsrv.jp/temp/MV1SetMaterialDrawAlphaTest.zip エンターキーで画面モード切り替え、スペースキーでアルファテストのON/OFF切り替えができます ( 3Dモデルは2枚の平面ポリゴンがあるだけの単純な物となっています ) テストプログラム自体は以下の通りです #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int WindowMode = FALSE ; int AlphaTest = TRUE ; int ModelHandle ; // 画面解像度を設定 SetGraphMode( 1280, 720, 32 ) ; // 背景色を設定 SetBackgroundColor( 64,64,64 ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 3Dモデルの読み込みと Alpha Test の設定 ModelHandle = MV1LoadModel( "AlphaTest.mqo" ) ; MV1SetMaterialDrawAlphaTest( ModelHandle, 0, AlphaTest, DX_CMP_GREATER, 128 ) ; // メインループ while( ProcessMessage() == 0 ) { switch( GetInputChar( TRUE ) ) { // エンターキーが押されたら画面モードを変更 case CTRL_CODE_CR: // ウィンドウモードとフルスクリーンモードを切り替え WindowMode = !WindowMode ; ChangeWindowMode( WindowMode ) ; // 3Dモデルの読み込みと Alpha Test の設定 ModelHandle = MV1LoadModel( "AlphaTest.mqo" ) ; MV1SetMaterialDrawAlphaTest( ModelHandle, 0, AlphaTest, DX_CMP_GREATER, 128 ) ; break ; // スペースキーが押されたらアルファテストのON/OFFを切り替え case ' ': AlphaTest = !AlphaTest ; MV1SetMaterialDrawAlphaTest( ModelHandle, 0, AlphaTest, DX_CMP_GREATER, 128 ) ; break; } // 描画先を裏画面に設定 SetDrawScreen( DX_SCREEN_BACK ) ; // 画面をクリア ClearDrawScreen() ; // カメラの設定 SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 110.0f, -280.0f ), VGet( 0.000000f, 100.000000f, 0.000000f ) ) ; SetCameraNearFar( 4.000000f, 1000.000000f ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; // ステータスの表示 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "WindowMode:%s AlphaTest:%s", WindowMode ? "ON" : "OFF", AlphaTest ? "ON" : "OFF" ) ; // 操作説明 DrawString( 0, 16, "Enter Key : Window Mode ON/OFF Space Key : Alpha Test ON/OFF", GetColor( 255,255,255 ) ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }
メンテ
Re: スクリーンモード切り替え時のMV1SetMaterialDrawAlphaTestの挙動について(解決済) ( No.2 )
名前:t 日時:2025/08/03 00:16

対応ありがとうございます。 頂いたプログラムを実行したところ、正常に描画できていることを確認しました。 また、頂いたプログラムでは MV1SetMaterialDrawAlphaTest( ModelHandle, 0, AlphaTest, DX_CMP_GREATER, 128 ) ; と設定をしていますが、自分のプログラムでは MV1SetMaterialDrawAlphaTest( ModelHandle, 0, AlphaTest, DX_CMP_GREATEREQUAL, 128 ) ; と設定をしており、ここを DX_CMP_GREATERに変更して実行したところ、ウインドウモード変更時も透過マテリアルも正常に描画できることを確認しました。 詳しい理由は調査中ですが、この部分が問題の原因だったようです。 ともかく問題は解決しました! お忙しい中ご対応いただきありがとうございました。
メンテ
Re: スクリーンモード切り替え時のMV1SetMaterialDrawAlphaTestの挙動について ( No.3 )
名前:t(解決済) 日時:2025/08/03 00:17

すみません。名前の変更を忘れていました。
メンテ
Re: スクリーンモード切り替え時のMV1SetMaterialDrawAlphaTestの挙動について ( No.4 )
名前:管理人(解決済) 日時:2025/08/04 04:09

> ここを DX_CMP_GREATERに変更して実行したところ、ウインドウモード変更時も透過マテリアルも正常に描画できることを確認しました。 すみません、ウィンドウモード変更時に DX_CMP_GREATER 以外が正常に動作しなくなるのはDXライブラリ側のバグです DX_CMP_GREATER を使用されるとのことで不要かと思いますが、こちらに修正版をアップしましたので、 もしご必要でしたらダウンロードしてください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.2 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ

Page: 1 |

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

   クッキー保存