ゲーム作者の集い[ゲームヘル2000]

2Dでのグレア処理

最終更新:

匿名ユーザー

- view
だれでも歓迎! 編集

2Dでのグレア処理

参考

グレア処理とは?

グレアとは「ぎらぎらする光」で、
リアルタイムに物体の明るい部分を取り出して、それを、ぴかー、と強調する処理のことです。
もともと3Dの技術ですが、それを擬似的に2Dで実装してしまおう、
というのがこのページの狙いです。

グレア処理の手順

手順としてはこんな感じ。
  1. 明るい部分(輝度)を抽出
  2. 抽出した輝度を、ぼかしとか十字型のグレアにそれっぽく変形
  3. 物体にグレアをレンダリング

2Dでのグレア処理の手順

輝度の抽出

3Dだとスペキュラー(強い光)をMAXにして抽出するらしいのですが、
2Dだとそんなことはできないので、白塗り画像を減算合成して取り出します。

例えば、こんな物体があったとして、

この白塗り画像を減算合成してやると、

こんな感じで抽出できます。

グレアに変形

今回は簡単なぼかしで。
先ほど抽出した輝度を、ランダムな座標に加算合成してやります。

レンダリング

もとのボール画像と、グレアを加算合成してやれば、
ほら!ぴかー、という感じに!

左が元の画像、右がグレア処理したもの。
(、、まあ、元画像がいまいちなので、あんまりかっこよくないですが(´Д`;

HSPでのソース

#const BALL_SIZE 64 // ボール画像のサイズ

// ボール画像バッファ
buffer 2
picload "ball.bmp"

// 輝度フィルタ用バッファ(HSPはデフォルトで白塗り)
buffer 3, BALL_SIZE, BALL_SIZE

// 輝度フィルタ書き出し用バッファ
buffer 4, BALL_SIZE, BALL_SIZE
gcopy 2, 0, 0, BALL_SIZE, BALL_SIZE

gmode 6, BALL_SIZE, BALL_SIZE, 238  // 白塗り画像を減算合成して、
gcopy 3, 0, 0, BALL_SIZE, BALL_SIZE // 輝度抽出

gmode 5, BALL_SIZE, BALL_SIZE, 64
// ぼかし
repeat 20
	x = rnd(10)-5
	y = rnd(10)-5
	pos x, y
	gcopy 4, 0, 0, BALL_SIZE, BALL_SIZE
loop

gsel 0
i = 0
repeat
	redraw 0
	color 0, 0, 0
	boxf 0, 0, 640, 480
	// 元画像(比較のために)
	pos 32, 128
	gmode 2
	gcopy 2, 0, 0, BALL_SIZE, BALL_SIZE
	// グレアする画像
	pos 128, 128
	gmode 2
	gcopy 2, 0, 0, BALL_SIZE, BALL_SIZE
	i += 2
	if i > 255 {
		i -= 255
	}
	gmode 5, BALL_SIZE, BALL_SIZE, abs(-128+i) // グレア加算合成
	gcopy 4, 0, 0, BALL_SIZE, BALL_SIZE
	redraw 1
	wait 1
loop


課題

  • 元画像がいまいちだときれいなグレアになってくれない
  • グレア変形で、何度もイメージ転送するのが重い

感想

  • 2Dでも、加算・減算合成ができれば、グレア処理ができるぞ。シュゴー
  • 輝度を抽出するには、「黒塗りの画像←加算合成」しても同じことだということに気がつきました。