ページ 11

東方の背景画像

Posted: 2016年5月31日(火) 21:40
by とんとん
タイトルが合っていない気もしますがこれしか文が考え付きませんでした。

東方風神録の東風谷早苗のスペル背景、朝顔みたいな柄が色が赤や緑や色々に変化するのですが、
どうやったらそのように出来るのでしょうか。
自分は何枚か違う色の画像を用意してそれぞれの透明度をDXライブラリのブレンドモードのALPHAで変化させて
それっぽくしているのですが、完全不透明でなくなる時間が少なからず出来てしまいます。
そうならずに色を変化させる方法はないのでしょうか。

下手な文章ですみません。よろしくおねがいします。

Re: 東方の背景画像

Posted: 2016年6月02日(木) 07:12
by 夢幻ノ月夜
とんとん さんが書きました:タイトルが合っていない気もしますがこれしか文が考え付きませんでした。

東方風神録の東風谷早苗のスペル背景、朝顔みたいな柄が色が赤や緑や色々に変化するのですが、
どうやったらそのように出来るのでしょうか。
自分は何枚か違う色の画像を用意してそれぞれの透明度をDXライブラリのブレンドモードのALPHAで変化させて
それっぽくしているのですが、完全不透明でなくなる時間が少なからず出来てしまいます。
そうならずに色を変化させる方法はないのでしょうか。

下手な文章ですみません。よろしくおねがいします。
SetDrawBright関数を使ったらそれっぽくならないでしょうかね?

Re: 東方の背景画像

Posted: 2016年6月02日(木) 21:09
by Hiragi(GKUTH)
各ピクセルの要素を変えるのであればピクセルシェーダなどを使用することが多いのかなーと思います。
そんなに拘らないのであれば、GraphFilter関数を使用し、最初から用意されているシェーダを利用する手もあります。

http://dxlib.o.oo7.jp/function/dxfunc_graph1.html#R3N26

Re: 東方の背景画像

Posted: 2016年6月02日(木) 21:33
by Hiragi(GKUTH)
動画を見ても良くわからなかったのでこういうのでいいのか分からないのですが

コード:

#include "DxLib.h"


int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);

	int gr;
	int i = 0;
	gr = LoadGraph("test.png");
	while (ProcessMessage() == 0)
	{
		i++;
		if(i == 360) i = 0;

		GraphFilter(gr,DX_GRAPH_FILTER_HSB,1,i,0,0);	//フィルタセット

		SetDrawBlendMode(DX_BLENDMODE_ALPHA,128);		//ブレンドモードセット
		DrawGraph(0,0,gr,true);
		SetDrawBlendMode(DX_BLENDMODE_NOBLEND,0);		//戻す

		ScreenFlip();
		ClearDrawScreen();
	}
	
	DxLib_End();
	return 0;
}

こういう感じを目指しているのでしょうか?
間違っていたらすいません。

Re: 東方の背景画像

Posted: 2016年6月04日(土) 22:50
by Hiragi(GKUTH)
ちゃんと見てきましたので、それっぽく再現してみました。
今回は減算ブレンドを使用していますが、別のブレンドモードをいろいろ試してみるのも良いかもしれません。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	ChangeWindowMode(true);
	if (DxLib_Init() != 0) return -1;
	SetDrawScreen(DX_SCREEN_BACK);

	int back = LoadGraph("back00.png");
	int gr = LoadGraph("test.png");
	int cnt = 0;

	while (ProcessMessage() == 0 && ScreenFlip() == 0 && ClearDrawScreen() == 0)
	{
		cnt++;

		//色相フィルターをかける
		GraphFilter(gr, DX_GRAPH_FILTER_HSB, 0, 2, 0, 0);

		DrawGraph(0,0,back,true);

		//減算ブレンドさせる
		SetDrawBlendMode(DX_BLENDMODE_SUB, 128);
		//繰り返し描画させる
		for (int i = 0; i < 16;i++)
			for (int k = 0; k < 16;k++)
				DrawGraph(i * 256, k * 256 - (cnt % 256), gr, true);
		SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
	}


	DxLib_End();
	return 0;
}

Re: 東方の背景画像

Posted: 2016年6月05日(日) 09:10
by とんとん
夢幻ノ月夜さん、Hiragi(GKUTH)さんから教えていただいた方法、どちらもいい感じに動きました。
今回は単純なコードで済みそうなので夢幻ノ月夜さんから教えていただいた方を使ってみます。

ありがとうございました。