トップページ > 記事閲覧
DrawBlendGraphが正常に動作しない
名前:さんさん 日時: 2014/08/09 23:36

初めまして。さんさんと申します。 現在、半透明のオブジェクトをブレンド画像を用いてフェードさせながら表示したいと思っていますが、 フェード中のみ半透明で描画されず困っています。 下のプログラムでは、画面の中央付近に淡黄色の帯(半透明)を表示します。 帯の上には、茶色の文字(半透明ではない)を表示します。 帯と文字を表示する際、ブレンド画像を使用してフェードしながら表示します。 このとき、何故かフェード中は黄色の帯が半透明になりません。 また、帯の上の茶色の文字が、だんだんとくすんだ色になってしまいます。 そして、フェードが完了し描画処理がDrawBlendGraphからDrawGraphに切り替わると、 最終的な望み通りの表示になります。 これは記法が間違っているのでしょうか。 もしくは、MakeScreenで作成した画面に半透明のオブジェクトを表示し、 これをDrawBlendGraphで半透明のままフェード表示させることはできない仕様なのでしょうか。 よろしくお願いします。 #include "DxLib.h" // プログラムは WinMain から始まります int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // ウィンドウモードで起動 SetGraphMode(1024, 768, 16); ChangeWindowMode(TRUE); if (DxLib_Init() == -1) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // BlendGraphの濃さを変えるために使用 int frame = 0; // 画面に表示する帯のスクリーン(半透明の帯を表示するためアルファ有り) int sub_screen = MakeScreen(1024, 200, TRUE); // ブレンド画像 int blend_graph = LoadBlendGraph("blend_graph.png"); // 薄い黄色(sub_screenに表示する帯の色) int sub_screen_color = GetColor(255, 233, 199); // 茶色(sub_screenに表示する文字の色) int string_color = GetColor(53, 24, 4); while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){ // 画面をクリア ClearDrawScreen(); // サブ画面に黄色の帯と茶色の文字を表示 SetDrawScreen(sub_screen); // 黄色の帯は半透明で表示 SetDrawBlendMode(DX_BLENDMODE_ALPHA, 166); // 65%の濃さ DrawBox(0, 0, 1024, 200, sub_screen_color, TRUE); // サブ画面に文字を表示(文字は半透明にしない) SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0); DrawString(10, 10, "あいうえお", string_color); // 描画対象を裏画面へ SetDrawScreen(DX_SCREEN_BACK); // 半透明の黄色の帯を、ブレンド画像を用いてフェードしながら表示する if (frame < 255){ //フェード中 DrawBlendGraph( 0, 300, sub_screen, TRUE, // 描画対象の帯は半透明なのでTRUE blend_graph, 255 - frame, // 少しずつ濃く表示していく 64); frame++; } else{ // フェードが完了したら、ブレンド画像なしで普通に表示する DrawGraph(0, 300, sub_screen, TRUE); } ScreenFlip(); } DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }
メンテ

Page: 1 |

Re: DrawBlendGraphが正常に動作しない ( No.1 )
名前:ろぜ 日時:2014/08/10 02:57

ひょっとしてLoadBlendGraph("blend_graph.png");の画像のサイズが、作成したスクリーンのサイズと違いませんか? サイズを200*200と1024*200で試してみたのですが、後者は正常に描画されました。 あと、作成したスクリーンにはClearDrawScreen()が掛かってないと思うのですが、これは意図的でしょうか。
メンテ
Re: DrawBlendGraphが正常に動作しない ( No.2 )
名前:さんさん 日時:2014/08/10 03:42

blend_graph.pngですが、こちらでは画像のサイズを1024 * 768と1024 * 200で試していますが、どちらも同じ結果になります。 ろぜ様の環境では、フェードが完了後に突然帯が半透明になる、という現象は発生しませんでしたか? 200*200の場合のみ、フェード完了後に帯が半透明になったのでしょうか。 すみません。作成した側のClearDrawScreenは書き忘れていました。 (検証時にClearDrawScreenを消してそのままでした)
メンテ
Re: DrawBlendGraphが正常に動作しない ( No.3 )
名前:ろぜ 日時:2014/08/10 12:03

正常にーと書きましたが、どうもちょっと意味が違ったといいますか・・ 私のほうではそもそもサイズが違うとDrawBlendGraphでなにも描画できなかったため、 >半透明になりません=完全透明でみれない だと勝手に解釈してしまいました・・ blend_graph.pngですが、a値1の完全真っ黒な画像を使用し、DrawBlendGraphのBorderRangeを255にしたところ、DrawBlendGraph時とDrawGraph時に大きな違いは見られませんでした。
メンテ
Re: DrawBlendGraphが正常に動作しない ( No.4 )
名前:管理人 日時:2014/08/10 21:22

すみません、グラフィックスデバイスがシェーダーモデル2.0以降に対応している環境で アルファチャンネルがある画像を DrawBlendGraph で使用すると正常な描画結果が得られないバグがありました 修正版をアップしましたので、よろしければこちらをお使いください m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) あと、MakeScreen でアルファチャンネル付きの画面を作成して使用されていますが、 アルファチャンネル付きの画面に対して描画を行う場合は『乗算済みアルファ』というものを 使用しないと正常な描画結果が得られません 『乗算済みアルファ』についてはこちらに解説がありますので、よろしければご覧ください http://homepage2.nifty.com/natupaji/DxLib/lecture/PremulAlpha/PremulAlpha.html 載せて頂いたプログラムを『乗算済みアルファ』を使用するように一部処理を追加+変更してみましたので、 よろしければ参考にしてください #include "DxLib.h" // プログラムは WinMain から始まります int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // ウィンドウモードで起動 SetGraphMode(1024, 768, 16); ChangeWindowMode(TRUE); if (DxLib_Init() == -1) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // BlendGraphの濃さを変えるために使用 int frame = 0; // 画面に表示する帯のスクリーン(半透明の帯を表示するためアルファ有り) int sub_screen = MakeScreen(1024, 200, TRUE); // ブレンド画像 int blend_graph = LoadBlendGraph("blend_graph.png"); // 薄い黄色(sub_screenに表示する帯の色) int sub_screen_color = GetColor(255, 233, 199); // 茶色(sub_screenに表示する文字の色) int string_color = GetColor(53, 24, 4); // <<追加>>乗算済みαのフォントハンドルを作成 SetFontCacheUsePremulAlphaFlag( TRUE ); int fonthandle = CreateFontToHandle( NULL, 16, 10, DX_FONTTYPE_NORMAL ) ; while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){ // 画面をクリア ClearDrawScreen(); // サブ画面に黄色の帯と茶色の文字を表示 SetDrawScreen(sub_screen); // 画面をクリア ClearDrawScreen(); // <<変更>>黄色の帯は半透明で表示 SetDrawBlendMode(DX_BLENDMODE_PMA_ALPHA, 166); // 65%の濃さ DrawBox(0, 0, 1024, 200, sub_screen_color, TRUE); // <<変更>>サブ画面に文字を表示(文字は半透明にしない) SetDrawBlendMode(DX_BLENDMODE_PMA_ALPHA, 255); DrawStringToHandle(10, 10, "あいうえお", string_color, fonthandle); // 描画対象を裏画面へ SetDrawScreen(DX_SCREEN_BACK); // 半透明の黄色の帯を、ブレンド画像を用いてフェードしながら表示する if (frame < 255){ //フェード中 DrawBlendGraph( 0, 300, sub_screen, TRUE, // 描画対象の帯は半透明なのでTRUE blend_graph, 255 - frame, // 少しずつ濃く表示していく 64); frame++; } else{ // フェードが完了したら、ブレンド画像なしで普通に表示する DrawGraph(0, 300, sub_screen, TRUE); } ScreenFlip(); } DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }
メンテ

Page: 1 |

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

   クッキー保存