いつもDXライブラリに大変お世話になっております。
MakeScreenで作った描画可能画像に半透明部分を含むPNG画像を書き込んだ後、
そのMakeScreen画像を表画面に描画すると、半透明部分の色が
期待より暗く表示されてしまう現象が発生しましたのでご報告いたします。
【再現ソースコード】
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(TRUE); // ウィンドウモードに
if (DxLib_Init() == -1) { return -1; } // DXライブラリ初期化処理
int pngHandle = LoadGraph("Test_TransPNG.png"); // 半透明部分を含むPNG画像を読み込む
// ●普通に描画対象を表画面にしてPNG画像を描画する場合(正常なケース)
SetDrawScreen(DX_SCREEN_FRONT);
DrawGraph(0, 50, pngHandle, TRUE); // PNG画像をそのまま書き込み
DrawString(10, 10, "PNG画像をそのまま表画面に描画した場合\n(右側の半透明部分が期待通りに描画されている)", GetColor(155, 155, 255));
WaitKey();// キー入力待ち
ClsDrawScreen();//画面を消去
// ●次にMakeScreenに同じ画像を書き込んだものを表画面に描画する場合(期待通りでないケース)
int handle = MakeScreen(640, 480, TRUE); // 640x480サイズのアルファチャンネルありの描画可能画像を作成
SetDrawScreen(handle); // 作成したMakeScreen画像を描画対象にする
DrawGraph(0, 0, pngHandle, TRUE); // 画像の透明度を有効にしてMakeScreenにPNG画像を書き込み
SetDrawScreen(DX_SCREEN_FRONT); // 描画対象を表画面にする
DrawGraph(0, 50, handle, TRUE); // MakeScreenの内容を表画面に書き込み
DrawString(10, 10, "PNG画像を書き込んだMakeScreen内容を表画面に描画した場合\n(右側の半透明部分の色が変わる)", GetColor(155, 155, 255));
WaitKey();// キー入力待ち
DeleteGraph(handle);// MakeScreen で作成したグラフィックハンドルの削除
DeleteGraph(pngHandle);// PNG画像のグラフィックハンドルの削除
DxLib_End(); // DXライブラリの後始末
return 0; // ソフトの終了
}
【テストに使用した画像】
silversecond.net/tmp/Test_TransPNG.png
【実行したときのスクリーンショット】
・1枚目(PNGを直接画面描画して期待通りに表示されるケース)
silversecond.net/tmp/20250328_DxLibTest1.png
・2枚目(PNGをMakeScreenに書き込んだものを表示して半透明部分が期待通り表示されないケース)
silversecond.net/tmp/20250328_DxLibTest2.png
【状況】
上記ソースコードを実行すると、
最初の「PNG画像をそのまま表画面に描画した場合」では期待通りの表示になりますが、
次の「PNG画像をMakeScreen画像に書き込み、そのMakeScreen画像を表画面に描画」すると、
半透明部分が期待と違って元より暗く表示されます。
(なお半透明でない部分に関しては、どちらも期待通り表示されているように見えます)
使用したDXライブラリはVer3.25(3/28の12:00にダウンロードさせていただいたDxLibVCTest.zip)、
コンパイル環境はVisual Studio Community 2022の「x86」です。
お手数をおかけしますが、よければ一度ご確認いただけますと幸いです。