「乗算済みアルファ」というものを使用すると解決することができます
試しに「乗算済みアルファ」を使用しないで MakeScreen で作成した画像に対して半透明の描画を行った場合と、
「乗算済みアルファ」を使用して MakeScreen で作成した画像に対して半透明の描画を行った場合との比較ができる
サンプルプログラムを作成してみましたので、よろしければご覧ください
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int NormalScreen ;
int PMAScreen ;
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;
SetUseDirectInputFlag( FALSE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1 ;
// アルファチャンネルつきの描画先にできるグラフィックハンドルを二つ作成
NormalScreen = MakeScreen( 256, 256, TRUE ) ;
PMAScreen = MakeScreen( 256, 256, TRUE ) ;
// 乗算済みアルファを使用しない画像を描画対象に変更
SetDrawScreen( NormalScreen ) ;
// 画面を初期化
ClearDrawScreen() ;
// 赤い四角形を左上に描画
DrawBox( 0, 0, 160, 160, GetColor( 255,0,0 ), TRUE ) ;
// 通常のアルファブレンド( 50% )で右下に緑の四角形を描画
SetDrawBlendMode( DX_BLENDMODE_ALPHA, 128 ) ;
DrawBox( 100, 100, 256, 256, GetColor( 0, 255, 0 ), TRUE ) ;
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 255 ) ;
// 乗算済みアルファを使用する画像を描画対象に変更
SetDrawScreen( PMAScreen ) ;
// 画面を初期化
ClearDrawScreen() ;
// 赤い四角形を左上に描画
DrawBox( 0, 0, 160, 160, GetColor( 255,0,0 ), TRUE ) ;
// 乗算済みタイプのアルファブレンド( 50% )で右下に緑の四角形を描画
SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 128 ) ;
DrawBox( 100, 100, 256, 256, GetColor( 0, 255, 0 ), TRUE ) ;
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 255 ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// 半透明になってしまっているか分かるように画面全体に横線を描画
for( int i = 0 ; i < 480 / 4 ; i ++ )
{
DrawBox( 0, i * 4, 640, i * 4 + 2, GetColor( 128,128,128 ), TRUE ) ;
}
// 通常のアルファブレンドで四角形を描画した画像を通常のアルファブレンドで描画
SetDrawBlendMode( DX_BLENDMODE_ALPHA, 255 ) ;
DrawGraph( 16, 16, NormalScreen, TRUE ) ;
// 乗算済みタイプのアルファブレンドで四角形を描画した画像を乗算済みタイプのアルファブレンドで描画
SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255 ) ;
DrawGraph( 300, 16, PMAScreen, TRUE ) ;
// ブレンドモードも元に戻す
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 255 ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
実行結果の画像もアップしてみました
https://dxlib.xsrv.jp/temp/PMATestScreen.png
画像中の左側の二つの四角形が「乗算済みアルファ」を使用しなかった場合で、
右側の二つの四角形が「乗算済みアルファ」を使用した場合です
左側はお書き込みの通り半透明の緑の四角形を描画した部分が半透明ではなかった
赤い四角形の部分まで半透明になってしまっていますが( しかも緑色の四角形の
透明度も変です )、右側の「乗算済みアルファ」を使用した場合はそのようなことが
発生していないのが分かると思います
「乗算済みアルファ」についてはこちらのページで詳しく解説していますので、
よろしければご覧になってみてください m(_ _)m
<乗算済みアルファのすすめ>
http://homepage2.nifty.com/natupaji/DxLib/lecture/PremulAlpha/PremulAlpha.html
( 描画先にできる画像に対して半透明描画を行った場合の話は後半にあります )