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描画」と同じような色で描画できる方法があると理想的です。
もしそうするための何らかの手段がございましたら、ご教示いただけますと幸いです。
なお、上記の挙動が正しい仕様であるということでしたら、もちろんその仕様に従うつもりでおります。
ご多忙のところ恐縮ですが、よろしければ一度ご確認いただけますと幸いです。