トップページ > 記事閲覧
半透明画像をPMAありで読み込みDX_BLENDMODE_MULAで描画するとPMAなしの時より色が暗く表示される
名前:SmokingWOLF 日時: 2025/04/03 15:10

DXライブラリにいつも大変お世話になっております。 「半透明の画像」を「乗算付きアルファ(以下PMA)画像」として読み込み、 ブレンドモード「DX_BLENDMODE_MULA」で描画したところ、 PMAなしの場合と比べて色が暗くなるような挙動が見られました。 PMAの原理を踏まえれば、このような見え方になるのは仕様とも受け取れるのですが、 もしよろしければご報告と併せてご意見を伺えればと思っております。 (前提として、 dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=5329 (DX_BLENDMODE_MULAについて) の記述より、  DX_BLENDMODE_MULAにはPMA専用のモードはなく、PMAあり/なし両方に対応した処理であると理解しております) 詳細は以下の通りです。 【現象を再現した画像】 silversecond.net/tmp/20250403_DxLibTest.png PMAを「なし」の場合と「あり」の場合で画像を読み込み、 それぞれ同じブレンドモード「DX_BLENDMODE_MULA」で描画すると、 ・「半透明なしの画像」(上段2つ)はPMAの有無による見え方の変化はありませんが ・「アルファ50%画像」(下段2つ)では、PMA「あり」で読み込んだものは  PMA「なし」で読み込んだときに比べて半透明部分の色が暗く変化します。 【再現コード】 #include "DxLib.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(TRUE); // ウィンドウモードに if (DxLib_Init() == -1) { return -1; } // DXライブラリ初期化処理 SetDrawScreen(DX_SCREEN_FRONT); // 描画対象を表画面にする DrawFillBox(0, 0, 640, 480, GetColor(230, 230, 230)); // グレーで塗りつぶす int png100Handle, png50Handle; // ●PMA(乗算済みアルファ)画像を使用せずアルファ100%画像と半透明画像で描画するケース png100Handle = LoadGraph("Test_Alpha100per.png"); // 半透明部分を含まないPNG画像を読み込む png50Handle = LoadGraph("Test_Alpha50per.png"); // 50%の半透明部分を含むPNG画像を読み込む SetDrawBlendMode(DX_BLENDMODE_MULA, 255); // アルファチャンネル考慮付き乗算ブレンドにする DrawGraph(0, 30, png100Handle, TRUE); // 半透明なしPNG画像を書き込み DrawGraph(0, 250, png50Handle, TRUE); // 半透明ありPNG画像を書き込み DrawString(10, 10, "PMAなし:半透明なし画像MULA描画", GetColor(155, 155, 255)); DrawString(10, 240, "PMAなし:アルファ50%画像MULA描画", GetColor(155, 155, 255)); DeleteGraph(png100Handle);// PNG画像のグラフィックハンドルの削除 DeleteGraph(png50Handle);// PNG画像のグラフィックハンドルの削除 // ●PMA(乗算済みアルファ)画像を使用してアルファ100%画像と半透明画像で描画するケース SetUsePremulAlphaConvertLoad(TRUE); // 乗算済みアルファ画像に変換する設定を有効にする png100Handle = LoadGraph("Test_Alpha100per.png"); // 半透明部分を含まないPNG画像を読み込む png50Handle = LoadGraph("Test_Alpha50per.png"); // 50%の半透明部分を含むPNG画像を読み込む SetDrawBlendMode(DX_BLENDMODE_MULA, 255); // アルファチャンネル考慮付き乗算ブレンドにする DrawGraph(300, 30, png100Handle, TRUE); // 半透明なしPNG画像を書き込み DrawGraph(300, 250, png50Handle, TRUE); // 半透明ありPNG画像を書き込み DrawString(320, 10, "PMA:半透明なし画像MULA描画", GetColor(155, 155, 255)); DrawString(320, 240, "PMA:アルファ50%画像MULA描画", GetColor(155, 155, 255)); DeleteGraph(png100Handle);// PNG画像のグラフィックハンドルの削除 DeleteGraph(png50Handle);// PNG画像のグラフィックハンドルの削除 WaitKey();// キー入力待ち DxLib_End(); // DXライブラリの後始末 return 0; // ソフトの終了 } 【再現に使った画像ファイル】 [半透明部分なし画像] silversecond.net/tmp/Test_Alpha100per.png [アルファ値50%の半透明画像] silversecond.net/tmp/Test_Alpha50per.png 【続き】 PMAの仕様を考えればこのような挙動になるのは自然なこととも思いますが、 もし可能でしたら、PMAありで読み込んだ画像「PMA:アルファ50%MULA描画」の部分が 「PMAなし:アルファ50%画像MULA描画」と同じような色で描画できる方法があると理想的です。 もしそうするための何らかの手段がございましたら、ご教示いただけますと幸いです。 なお、上記の挙動が正しい仕様であるということでしたら、もちろんその仕様に従うつもりでおります。 ご多忙のところ恐縮ですが、よろしければ一度ご確認いただけますと幸いです。
メンテ

Page: 1 |

Re: 半透明画像をPMAありで読み込みDX_BLENDMODE_MULAで描画するとPMAなしの時より色が暗く表示される ( No.1 )
名前:管理人 日時:2025/04/04 03:06

> DX_BLENDMODE_MULAにはPMA専用のモードはなく、PMAあり/なし両方に対応した処理であると理解しております 件のスレッドが分かりにくい表現で申し訳ありません DX_BLENDMODE_MULA はPMAでは正常に動作しません ( 『PMAなし』の場合のみ正常に動作するブレンドモードです ) 乗算済みアルファの画像のRGB値はA値と乗算した結果の値、という仕様の関係で MUL や MULA の結果を正常な 『乗算済みアルファ』の画像とするには Direct3D で対応している機能では実現不可能なので ( というか Direct3D 以外の OpenGL や Vulkan, Metal など他のAPIでも不可能 ) MUL や MULA の PMA版は存在しない形となっています 『乗算済みアルファ』を使用するメリットは大きいですが、『乗算済みアルファ』を使用すると使用できなくなってしまう ブレンドの表現もあるのが悩ましいところです (- -; ( 『乗算済みアルファ』が全てにおいて『非乗算済みアルファ』の上位互換となっていればデフォルトで 画像処理全般を『乗算済みアルファ』にしてしまうところなのですが、『非乗算済みアルファ』ではないと使用できない 表現があるので『乗算済みアルファ』はオプション扱いとなっています )
メンテ
Re: 半透明画像をPMAありで読み込みDX_BLENDMODE_MULAで描画するとPMAなしの時より色が暗く表示される ( No.2 )
名前:SmokingWOLF(解決済み) 日時:2025/04/04 15:48

詳しい解説ありがとうございます。 MULAのPMA版はそもそも実現できない旨、承知いたしました。 PMAの方が便利で見栄えがいい部分が多いのと、 アルファ値100%の画像であればMULA乗算でも環境別の変化は起きないので、 ひとまずはそういった仕様に合わせてもらうようユーザーの方にも告知しようと思います。 (DXライブラリを使わせていただいたゲーム開発ツールを作っている身でして) このたびは親切なご対応、誠にありがとうございました!
メンテ

Page: 1 |

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

   クッキー保存