GameMaker 日本語掲示板

複数の画面全体効果をかけたい

3 コメント
views
16 フォロー

画面全体効果を適用することは単体でならばできたのですがそれが複数重なる場合どうすればいいのかわかりません。

例えば
 画面を"何らかの方法で歪ませ"その次に"グレースケールをかけ"、最後に"それらを写すポーズ画面"

といった感じです。
それぞれを別オブジェクトにして好きなタイミング・効果数にしたいと考えております。
そして例のような描画順は必ず守りたいです。
全てDrawGUIイベントにて行っております。

ご教授の程よろしくお願いいたします。

名前なし
作成: 2023/01/28 (土) 19:56:09
通報 ...
1
生高橋 2023/01/30 (月) 20:08:15

シェーダーを複数回かけるマルチパスのことですかね。
とりあえずサンプルプロジェクトを用意しましたので、参考にどうぞ。
こちらからダウンロード

バージョンは以下で作成してます。バージョンが古いともしかしたら動かないかもしれません。
IDE 2022.11.1.56
Runtime v2022.11.1.75

内容は次の3つのシェーダーを画面全体に重ね掛けするというものです。
・歪みシェーダー
・グレースケールシェーダー
・色収差シェーダー

1,2,3キーでシェーダーの効果をオン、オフできます。

大まかな流れは次のとおりです。

  1. application_surfaceに対してshader1をかけたものを自作surface2に保存
  2. surface2に対してshader2をかけたものを自作surface3に保存
  3. surface3に対してshader3をかけたものを描画
    となっています。

サンプルを見てなにかわからないことがあれば聞いてください。

2
名前なし 2023/01/31 (火) 21:55:34 修正 >> 1

サンプルが一つのオブジェクトで複数の効果だったので求めてたものとはちょっと違いましたがご教授いただきありがとうございました!
考え方を知れたのでうまく実装することができました。
surface_copyとか使わないんですね・・・。

複数オブジェクトでの実装方法を書いておきます。

Createイベント

isSurface = false;

objSurface1(レイヤーが一番下)のStepイベント

isSurface = (instance_exists(objSurface2) || instance_exists(objSurface3)); //レイヤーが下であるほど多くなる

objSurface3(レイヤーが一番上)のDrawGUIイベント

var sfc = application_surface;
if(instance_exists(objSurface1)) sfc = objSurface1._surf; //レイヤーが上であるほど多くなる
if(instance_exists(objSurface2)) sfc = objSurface2._surf; 
	
if (!surface_exists(_surf)){
	var w = surface_get_width(application_surface);
	var h = surface_get_height(application_surface);
	_surf= surface_create(w,h);
}
if(isSurface) surface_set_target(_surf);
	shader_set(shd_grayscale);
		draw_surface(sfc, 0, 0);
	shader_reset();
if(isSurface) surface_reset_target();
3
生高橋 2023/02/01 (水) 12:17:19

よかったです。
surface_copyのほうがシンプルだったかもしれませんね。