ページ 11

makescreenの透過

Posted: 2013年12月14日(土) 21:27
by スケルトン
下記のようなプログラムを書いたのですが黒い部分が透明になりません。
どうすればいいでしょうか

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	int handle;
	double i = 1;
	// ウインドウモードで起動
	ChangeWindowMode(TRUE);
	SetBackgroundColor(0,255,0);
	// DXライブラリの初期化
	if (DxLib_Init() < 0) return -1;
	
	//アルファチャンネルなしの描画可能画像を作成する
	handle = MakeScreen(200, 200, true);

	// 作成した画像を描画対象にする
	SetDrawScreen(handle);
	
	DrawCircle(100, 100, 50, GetColor(255,255,0), 0);
	DrawBox(0, 100, 200, 200, GetColor(0,0,0), TRUE);

	// 描画対象を表画面にする
	SetDrawScreen(DX_SCREEN_BACK);
	SetTransColor(0,0,0);
	while (ProcessMessage() == 0)
	{
		i+=0.05;
                ClearDrawScreen();
		DrawCircle(100, 100, 50, GetColor(255, 255, 0), 0);
		DrawRotaGraph(100, 100, 1, i, handle, 1, 0);
		ScreenFlip();

	}
	// DXライブラリの後始末
	DxLib_End();

	// ソフトの終了
	return 0;
}

Re: makescreenの透過

Posted: 2013年12月14日(土) 21:30
by h2so5
コメントとコードの意味が真逆ですが...

コード:

    //アルファチャンネルなしの描画可能画像を作成する
    handle = MakeScreen(200, 200, true);

Re: makescreenの透過

Posted: 2013年12月14日(土) 21:40
by スケルトン
書き間違えました。

Re: makescreenの透過

Posted: 2013年12月14日(土) 23:16
by スケルトン
画像のような状態になってしまいます。
画像

Re: makescreenの透過

Posted: 2013年12月15日(日) 00:33
by ISLe
SetTransColorは、それ以降に作成されるグラフィックハンドルに対して有効です。
そもそも、アルファチャンネルを持つ画像は透過色を無視します。

MakeScreenで作成したアルファチャンネル付きグラフィックに対して、アルファチャンネルのみを対象とした操作はできないようですが、透明にしたい部分に対してSetDrawBlendMode関数のDX_BLENDMODE_SUBを指定しておいて描画することでアルファ値を削ることができます。

Re: makescreenの透過

Posted: 2013年12月15日(日) 12:09
by spaaaark・∀・
オフトピック
ISLe さんが書きました:MakeScreenで作成したアルファチャンネル付きグラフィックに対して、アルファチャンネルのみを対象とした操作はできないようですが、透明にしたい部分に対してSetDrawBlendMode関数のDX_BLENDMODE_SUBを指定しておいて描画することでアルファ値を削ることができます。
僕の意味の取り違いが怖いのですが、とりあえず参考までにこちらのリンクを貼っておきます…。

Re: makescreenの透過

Posted: 2013年12月15日(日) 22:22
by ISLe
MakeScreenで作成したアルファチャンネル付きグラフィックに対して、SetDrawBlendMode関数のDX_BLENDMODE_ALPHAを使って半透明で描画すると、アルファ値だけでなく、RGB各要素も指定した割合で合成されます。
そのため、半透明を含むMakeScreenで作成したアルファチャンネル付きグラフィックを他の画面に描画する際には、乗算済みアルファとして扱う必要があります。

あとから透明にしたい部分にSetDrawBlendMode関数のDX_BLENDMODE_ALPHAを使って100%透明で描いてもアルファ値は変化しません。
RGBも変化しないので何も変わりません。

SetDrawBlendMode関数のDX_BLENDMODE_SUBを指定しておいてR:G:B=0:0:0(黒)で描画すると、RGB要素は変化しませんが、アルファ値だけが指定した分だけ減って透明に近付きます。
逆にDX_BLENDMODE_ADDを指定しておいてR:G:B=0:0:0(黒)で描画すると、元から描いてある画像が浮かび上がってきます。