MakeScreen で『フレームバッファ』と同じサイズの画像を2つ作成して、
その内の一つに『ステンシルバッファ』の画像を描画して、
その後 GraphBlendBlt の DX_GRAPH_BLEND_RGBA_SELECT_MIX の機能を使用して
『ブレームバッファ』の画像と『ステンシルバッファ』の画像を描画した画像を合成した後
裏画面に合成した画像を DrawGraph で描画すると『描画結果』の描画結果が得られます
と、文章で説明されてもよく意味が分からないと思いますので、
『Temp1.bmp の中の 48x48サイズの四角形部分だけを抜き出して描画する』
というサンプルを組んでみましたので、よろしければご覧ください m(_ _)m
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int TempScreen ;
int GrHandle ;
int MixScreen ;
int SizeX, SizeY ;
int Y, YAdd ;
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1 ;
// 画像を読み込み
GrHandle = LoadGraph( "Test1.bmp" ) ;
// 画像のサイズを取得
GetGraphSize( GrHandle, &SizeX, &SizeY ) ;
// 画像のサイズと同じサイズの一時画像と合成結果格納用画像を作成
TempScreen = MakeScreen( SizeX, SizeY, FALSE ) ;
MixScreen = MakeScreen( SizeX, SizeY, TRUE ) ;
// 四角形のY座標を初期化
Y = 0 ;
YAdd = 2 ;
// メインループ
while( ProcessMessage() == 0 )
{
// Y座標を更新
Y += YAdd ;
if( Y <= 0 || Y >= SizeY ) YAdd = -YAdd ;
// 一時画像を描画対象に設定してクリア
SetDrawScreen( TempScreen ) ;
ClearDrawScreen() ;
// Yの座標を中心に 48x48 サイズの四角形を描画する
DrawBox( SizeX / 2 - 24, Y - 24, SizeX / 2 + 24, Y + 24, GetColor( 255,255,255 ), TRUE ) ;
// GrHandle のRGB成分 と一時画像の赤成分をアルファ成分にしたものを合成して MixScreen に格納する
GraphBlendBlt( GrHandle, TempScreen, MixScreen, 255,
DX_GRAPH_BLEND_RGBA_SELECT_MIX,
DX_RGBA_SELECT_SRC_R, // 合成後の R は GrHandle の R
DX_RGBA_SELECT_SRC_G, // 合成後の G は GrHandle の G
DX_RGBA_SELECT_SRC_B, // 合成後の B は GrHandle の B
DX_RGBA_SELECT_BLEND_R // 合成後の A は TempScreen の R
) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 画面のクリア
ClearDrawScreen() ;
// 画面に合成した画像を描画する
DrawGraph( 0, 0, MixScreen, TRUE ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// 画像を削除する
DeleteGraph( TempScreen ) ;
DeleteGraph( MixScreen ) ;
DeleteGraph( GrHandle ) ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
GraphBlendBlt の DX_GRAPH_BLEND_RGBA_SELECT_MIX の効果についての詳細はこちらをご覧ください m(_ _)m
<DX_GRAPH_BLEND_RGBA_SELECT_MIX>
https://dxlib.xsrv.jp/function/dxfunc_graph1.html#R3N29S0