GameMaker 日本語掲示板

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

3 コメント
views
16 フォロー
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();