こんばんは、はじめまして。
DxLibいつも利用させていただいてます。
恐らく不具合かと思うのですが
3.24fのバージョンでMV1SetUseOrigShaderとMV1DrawModelを行った後にMakeScreenやCreateGraphFromSoftImageを行うと失敗する事があるようです。
手元環境の症状かもしれませんがサンプルコードとログを添付しますのでご確認ください。
所管など
・MV1SetUseOrigShaderとMV1DrawModel>MakeScreenの順で実行すると生成に失敗する
・何かスレッド処理があるのか、待ちを加えず直後に実行するとたまに通過する事もある?
・MakeScreenを行った後にMV1SetUseOrigShaderとMV1DrawModel>MakeScreenの順だと成功している(気がする)
・MV1SetUseOrigShaderを(TRUE)にしなければどちらも成功する、恐らく何かシェーダーの切り替えフラグが残ったまま、画面以外に描画する類の処理でコケてる?
・MV1SetUseOrigShaderを(FALSE)に戻してから生成しても失敗する
サンプルプロジェクトのコードとログです(ダブルスラッシュは禁則判定みたいなので全角スペースを挿入しています)
https:/ /drive.google.com/file/d/1FGb8c0QRc1Nxeghr1zYXlo5uv9gynfcs/view?usp=drive_link
#include "DxLib.h"
#if true
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// ウィンドウモードで起動
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが起きたら直ちに終了
return -1 ;
}
//(※)MV1SetUseOrigShaderをTRUEの状態で何度かMV1DrawModelを実行するとその後グラフィックハンドラの生成系関数が失敗する
MV1SetUseOrigShader( TRUE ) ;
// 描画を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
int ModelHandle = MV1LoadModel( "NormalBox.mqo" ) ;
MV1SetPosition( ModelHandle, VGet( 160, 240.0f, 0.0f ) ) ;
//何回か描画、または時間を置く
for(int i=0; ProcessMessage() == 0 && i < 4; ++i){
// 画面をクリア
ClearDrawScreen() ;
MV1DrawModel( ModelHandle ) ;
ScreenFlip() ;
}
// (※)チェック、グラフィックハンドルを作成する類の処理で失敗する、恐らくシェーダーの設定が何か残って悪さしている?
MV1SetUseOrigShader( FALSE ) ;
// レンダーターゲットの作成
int screenHandle = 0;
screenHandle = MakeScreen(1024, 1024, true);
if (screenHandle == -1) {
DxLib_End();
return -1;
}
DeleteGraph(screenHandle);
// ソフトイメージからグラフィック作成
int imageHandle = LoadSoftImage("test.png");
if(imageHandle == -1){
// ロード失敗
return -1;
}
for(int i=0; i < 256; ++i){
int a, r, g, b;
GetPaletteSoftImage(imageHandle, i, &r, &g, &b, &a);
SetPaletteSoftImage(imageHandle, i, i, i, i, a);
}
int texhandle = CreateGraphFromSoftImage(imageHandle);
DeleteSoftImage(imageHandle);
if (texhandle == -1) {
DxLib_End();
return -1;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
#endif