トップページ > 記事閲覧
MakeScreenで作成した画像に関する不具合
名前:てらす 日時: 2013/07/22 23:39

お世話になっております。てらすです。 今作っているゲームが高解像度のイラストと低解像度のドット絵(マップチップ)を混在させる仕様で、 背景イラストの上にドット絵を4倍の大きさで大量に(1000枚くらい?)描画しなければならないのですが、 そのままドット絵を4倍で描画するのではなく、MakeScreenで裏画面の1/4の画像を作ってドット絵を描画し、 作った画像を裏画面に4倍で描画するという方法の方がわかりやすいと思い、そのように実装しようと試みました。 しかし、いざ実行してみると以下の不具合が発生しました。 まず、MakeScreenで作成した透過情報付き画面Sに、透過情報付きの画像Aと 透過情報無しの画像Bを描画すると、画像Bの上に画像Aを重ねると画像Bが画像Aに上書きされたり 2枚の画像ABを重ねて描画した後に画面Sを初期化し、2枚の画像ABが重なって描画されていた場所に もう一度画像Aを描画するとそこの透過具合がおかしくなったり 画像Bに透過情報をつけると結果が変わったりします。 条件によって色々と結果が変化し、文字では伝えづらいので、テストコードを貼り付けておきます。 よろしければ参考にしてください。 Dxlibは3.10eと6月23日のテストバージョンで試し、テストバージョンでのみ症状を確認しました。 テストバージョンでの不具合なので、デバッグがまだなだけかもしれませんが、一応報告させていただきます。 環境: Windows 7 Home Premium 64-bit (6.1, Build 7601) Service Pack 1 (7601.win7sp1_gdr.130318-1533) Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz (8 CPUs), ~3.4GHz NVIDIA GeForce GTX 660 (Driver Version: 9.18.13.1422) Visual Studio 2010 Professional (Version: 10.0.40219.1 SP1Rel) コード: #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ ChangeWindowMode( TRUE ); if( DxLib_Init() == -1 ){ return -1; } int x = 0, y = 0; int screen = MakeScreen( 640, 480, TRUE ); //半透明な画像を作る //LoadGraphで読み込んだアルファ付きの画像でも発生 int graphA = MakeScreen( 64, 64, TRUE ); FillGraph( graphA, 255, 255, 255, 128 ); //不透明な画像を作る //LoadGraphで読み込んだ画像でも発生(透過の有無は関係ない?) int graphB = MakeScreen( 64, 64, FALSE ); FillGraph( graphB, 255, 0, 0 ); while( !ProcessMessage() ){ if( CheckHitKey( KEY_INPUT_ESCAPE ) != 0 ){ break; } //上下左右でscreen上の画像を動かす if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) ++y; if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) --x; if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) ++x; if( CheckHitKey( KEY_INPUT_UP ) == 1 ) --y; //アルファ付きのスクリーンに画像を描画した時のみ発生 //アルファチャンネルなしのスクリーンや裏画面に直接描画した場合は正常 //症状発生時は、初期化方法がFillGraphでもClearDrawScreenでも発生 //FillGraph( screen, 0, 0, 0, 0 ); SetDrawScreen( screen ); ClearDrawScreen(); //graphAとgraphBの描画順を入れ替えると症状が変化(改善はしない) //2つの画像が完全に重ならない状態でgraphA→graphBの順番に描画すると正常? DrawGraph( x, y, graphA, TRUE ); DrawGraph( x, y+48, graphB, TRUE ); SetDrawScreen( DX_SCREEN_BACK ); ClearDrawScreen(); //このDrawBoxをscreenに描画するか裏画面に描画するかで症状が変化 DrawBox( 0, 0, 320, 480, GetColor( 192, 192, 192 ), TRUE ); DrawExtendGraph( 0, 0, 640, 480, screen, TRUE ); ScreenFlip(); } DxLib_End(); return 0; }
メンテ

Page: 1 |

Re: MakeScreenで作成した画像に関する不具合 ( No.1 )
名前:いっち 日時:2013/07/24 20:14

おそらく以下のように変更すると意図通りの結果が得られると思います。 > DrawGraph( x, y, graphA, TRUE ); > DrawGraph( x, y+48, graphB, TRUE ); ↓↓↓↓ 変更 ↓↓↓↓ > SetDrawBlendMode( DX_BLENDMODE_SRCCOLOR, 255 ); > DrawGraph( x, y, graphA, TRUE ); > SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 255 ); > DrawGraph( x, y+48, graphB, TRUE ); 以下のスレッドからアルファブレンドに関連する情報をたどれますので興味があればご覧になってください。 > ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=3079
メンテ
Re: MakeScreenで作成した画像に関する不具合 ( No.2 )
名前:てらす 日時:2013/07/24 22:38

いっちさん、回答有り難うございます。 試しにいっちさんの書き込みのとおりにコードを変更してみましたが 改善は見られませんでした。 提示していただいたスレッドはすでに読んでいました。 おそらく私の余計な一言で元のスレッドから派生したものですので。 もしかしたらそのスレッドと元スレッドに関連して、管理人さんがなんとか対応させようとした結果に発生した 不具合なのでは、とも思っています。だとしたら、管理人さんには申し訳ない限りです・・・ テストバージョンでの不具合なので、ただ対応途中なだけなのかもしれませんが。 上記のコードでは不具合の確認がしづらかったので、以下のように変更をすると確認しやすくなります。 変更前 > DrawGraph( x, y, graphA, TRUE ); > DrawGraph( x, y+48, graphB, TRUE ); 変更後↓ > DrawGraph( x, y, graphA, TRUE ); > DrawGraph( x, y+48, graphB, TRUE ); > DrawExtendGraph( 160, 0, 480, 480, graphA, TRUE ); これで画像を動かしていくと、症状が確認できると思います。
メンテ
Re: MakeScreenで作成した画像に関する不具合 ( No.3 )
名前:いっち 日時:2013/07/24 22:56

すみません。テストに使用するDXライブラリのバージョンの確認を怠ったため勘違いをしてしまいました。 私の環境でも事象の確認が出来ました。管理人さんの回答をお待ちするのが宜しいかと思います。
メンテ
Re: MakeScreenで作成した画像に関する不具合 ( No.4 )
名前:てらす 日時:2013/07/25 08:39

ライブラリのバージョンの確認を怠っていたのは私の方でした・・・ × 6月23日のテストバージョン ↓ ○ 7月21日のテストバージョン テストバージョンをダウンロードしたスレッドが6月のもので、そこを頼りに日付を書いたために 6月の管理人さんが7月のスレッドに対応するという時間の歪みが発生しました。申し訳ありません。
メンテ
Re: MakeScreenで作成した画像に関する不具合 ( No.5 )
名前:管理人 日時:2013/07/27 23:33

私も一時的に描画の順番と一致しない描画結果になる現象が発生したのですが、 コードは変えていないはずなのにリビルドしたらその後現象が発生しなくなってしまったので 原因は不明な状態です・・・ ( なので載せて頂いたテストコードも今の時点では正常な結果が得られています ) あと、「MakeScreenで作った画面の初期化」のスレッドでも話題になりましたが MakeScreen で作成した透明情報付きの画面に対して透明情報付きの画像を描画すると 意図しない結果になってしまいます 今回少し調べたところ、「乗算済みアルファ」というものを使うと透明情報付きの画面に 対する透明情報つきの画像の描画が意図した通りの結果が得られるということが分かりました なので早速「乗算済みアルファ」の機能を実装してみましたので、よろしければ こちらのバージョンをダウンロードしてください 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)」をして下さい) 今回追加した「乗算済みアルファ」の機能については解説用のページを用意しましたので、 よろしければご覧になってみてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/lecture/PremulAlpha/PremulAlpha.html
メンテ
Re: MakeScreenで作成した画像に関する不具合 ( No.6 )
名前:てらす(解決!) 日時:2013/07/28 23:11

新しいバージョンで試したところ、私の方でも描画順と結果が一致しない現象も含めた、 その他このスレッドで上げた不具合はすべてが改善されていました。 対応?ありがとうございます。 そして、件の「乗算済みアルファ機能」は実際にゲームで採用しました。 半透明同士を合成できるようになったのは大きいですね。表現の幅がかなり広がりました。 また、「MakeScreenで作った画面の初期化」のスレッドでも話題に出した、 ゲームのレギュレーションに合わせて複数の画像から1枚の画像を作り SaveDrawScreenToPNGで保存するツールも、GraphFilterの種類にDX_GRAPH_FILTER_INTERP_ALPHAや DX_GRAPH_FILTER_PREMUL_ALPHAが追加されていたお陰で「乗算済みアルファ機能」を採用できました。 今まで半透明画像はフォトショなどで手作業で合成を行なっていただけに、かなり手間が省けるようになると思います。 本当にありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存