#include "hgimg4.as" title "HGIMG4 Post Effect Test" gpreset ;setreq SYSREQ_LOGWRITE,1 ; 終了時にログを出力 setcls CLSMODE_SOLID, 0 ; 画面クリア設定 setpos GPOBJ_CAMERA, 0,2,5 ; カメラ位置を設定 gpload id_model,"res/tamane2" ; モデル読み込み setscale id_model, 0.02,0.02,0.02 ;gpact id_model postid = 0 postid_max = 11 *start gosub *setup_post *main ; サブ画面 gsel 1 redraw 0 ; 描画開始 color 128,128,128:boxf ; 背景をクリア addang id_model,0,0.02 ; ノード回転 gpdraw ; シーンの描画 redraw 1 ; 描画終了 ; メイン画面 gosub post_prmsub ; ポストエフェクト描画開始 color 255,255,255 pos 8,8:mes "HGIMG4 sample" mes "("+sx+" x "+sy+")" mes "Effect : "+postname redraw 1 ; 描画終了 await 1000/60 ; 待ち時間 ; 入力チェック stick key if key&128 : goto *bye if key&256 { postid++ if postid>=postid_max : postid=0 goto *start } goto *main *bye end *setup_post ; ポストエフェクト初期化 postname="None" post_prmsub = *setup_postsub sx=ginfo_sx:sy=ginfo_sy if postid=0 : gosub *setup_none if postid=1 : gosub *setup_sepia if postid=2 : gosub *setup_gray if postid=3 : gosub *setup_blur if postid=4 : gosub *setup_blur2 if postid=5 : gosub *setup_mosaic if postid=6 : gosub *setup_contrast if postid=7 : gosub *setup_sobel if postid=8 : gosub *setup_crt if postid=9 : gosub *setup_oldfilm if postid=10 : gosub *setup_glow gsel 0 return *setup_postsub return *exec_copybuf ; buffer1 -> メイン画面にシェーダー描画 gsel 0 redraw 0 ; 描画開始 pos 0,0:gmode 0 celput 1 return *setup_none ; フィルターなし buffer 1,sx,sy,screen_offscreen post_prmsub = *exec_copybuf return *setup_sepia ; セピアフィルター postname="Sepia Filter" gpusershader "res/shaders/sprite.vert", "res/shaders/p_sepia.frag", "" buffer 1,sx,sy,screen_offscreen + screen_usergcopy post_prmsub = *exec_copybuf return *setup_gray ; 白黒フィルター postname="Gray Filter" gpusershader "res/shaders/sprite.vert", "res/shaders/p_grayscale.frag", "" buffer 1,sx,sy,screen_offscreen + screen_usergcopy post_prmsub = *exec_copybuf return *setup_blur ; ぼかしフィルター postname="Blur Filter" gpusershader "res/shaders/sprite.vert", "res/shaders/p_blur.frag", "" buffer 1,sx,sy,screen_offscreen + screen_usergcopy post_prmsub = *exec_blur blur_level=4.0 blur_base=1.0/sx gpgetmat blur_mat, 1, GPGETMAT_OPT_SCRMAT return *exec_blur ; パラメーター更新 dd=blur_level*blur_level gpmatprm1 blur_mat, "u_length", blur_base*blur_level gosub *exec_copybuf return *setup_mosaic ; モザイクフィルター postname="Mosaic Filter" gpusershader "res/shaders/sprite.vert", "res/shaders/p_mosaic.frag", "" buffer 1,sx,sy,screen_offscreen + screen_usergcopy post_prmsub = *exec_copybuf return *setup_sobel ; 輪郭抽出フィルター postname="Sobel Filter" gpusershader "res/shaders/sprite.vert", "res/shaders/p_sobel.frag", "" buffer 1,sx,sy,screen_offscreen + screen_usergcopy post_prmsub = *exec_copybuf gpgetmat sobel_mat, 1, GPGETMAT_OPT_SCRMAT gpmatprm1 sobel_mat, "u_width", 1.0/sx/2 gpmatprm1 sobel_mat, "u_height", 1.0/sy/2 return *setup_oldfilm ; 古いフィルムフィルター postname="Old Film Filter" gpusershader "res/shaders/sprite.vert", "res/shaders/p_oldfilm.frag", "" buffer 1,sx,sy,screen_offscreen + screen_usergcopy post_prmsub = *exec_oldfilm gpgetmat oldfilm_mat, 1, GPGETMAT_OPT_SCRMAT gpmatprm1 oldfilm_mat, "u_sepiaValue", 0.8 gpmatprm1 oldfilm_mat, "u_noiseValue", 0.4 gpmatprm1 oldfilm_mat, "u_scratchValue", 0.4 gpmatprm1 oldfilm_mat, "u_innerVignetting", 0.9 gpmatprm1 oldfilm_mat, "u_outerVignetting", 0.9 return *exec_oldfilm ; パラメーター更新 getreq etime,SYSREQ_TIMER gpmatprm1 oldfilm_mat, "u_elapsedTime", etime dd=double(rnd(32768)) gpmatprm1 oldfilm_mat, "u_random", dd / 32768 gosub *exec_copybuf return *setup_glow ; グローフィルター postname="Glow Filter" buffer 1,sx,sy,screen_offscreen gpusershader "res/shaders/sprite.vert", "res/shaders/p_blur.frag", "" buffer 2,sx/2,sy/2,screen_offscreen + screen_usergcopy post_prmsub = *exec_glow gpgetmat glow_mat, 2, GPGETMAT_OPT_SCRMAT glow_base=1.0/sx*2 gpmatprm1 glow_mat, "u_length", glow_base return *exec_glow ; buffer1 -> buffer2に縮小してコピー gsel 2 redraw 0 pos 0,0:gmode 0 gzoom sx/2,sy/2, 1, 0,0, sx,sy redraw 1 ; buffer1と2を合成して描画 gsel 0 redraw 0 ; 描画開始 pos 0,0:gmode 1,,,128 gzoom sx,sy, 2, 0,0, sx/2,sy/2 pos 0,0:gmode 5,,,128 celput 1 return *setup_crt ; ブラウン管フィルター postname="CRT Filter" celload "res/crtmask.png",4 ; オーバーレイ画像 gpusershader "res/shaders/sprite.vert", "res/shaders/p_crtmonitor.frag", "" buffer 1,sx,sy,screen_offscreen + screen_usergcopy post_prmsub = *exec_crt gpgetmat crt_mat, 1, GPGETMAT_OPT_SCRMAT crt_curvex=0.5 ; X方向の湾曲率 crt_curvey=0.4 ; Y方向の湾曲率 gpmatprm1 crt_mat, "u_curvex", crt_curvex gpmatprm1 crt_mat, "u_curvey", crt_curvey return *exec_crt gosub *exec_copybuf ; オーバーレイを描画 pos 0,0:gmode 1 celput 4 return *setup_contrast ; コントラストフィルター postname="Contrast Filter" gpusershader "res/shaders/sprite.vert", "res/shaders/p_contrast.frag", "" buffer 1,sx,sy,screen_offscreen + screen_usergcopy post_prmsub = *exec_copybuf gpgetmat cont_mat, 1, GPGETMAT_OPT_SCRMAT contrast_level=2.0 ; コントラストしきい値 contrast_bright=-0.2 ; コントラスト明るさ gpmatprm1 cont_mat, "u_contrast", contrast_level gpmatprm1 cont_mat, "u_brightness", contrast_bright return *setup_blur2 ; ガウスぼかしフィルター(高品質) ; (強いぼかしを掛けることができますが処理が重くなります) postname="Blur Filter 2" gpusershader "res/shaders/p_blur2.vert", "res/shaders/p_blur2.frag", "" buffer 1,sx,sy,screen_offscreen + screen_usergcopy gpusershader "res/shaders/p_blur2.vert", "res/shaders/p_blur2.frag", "" ;gpusershader "res/shaders/sprite.vert", "res/shaders/p_blur.frag", "" buffer 2,sx,sy,screen_offscreen + screen_usergcopy post_prmsub = *exec_blur2 gpgetmat blur_mat, 1, GPGETMAT_OPT_SCRMAT gpgetmat blur_mat2, 2, GPGETMAT_OPT_SCRMAT blur_level=6.0 ; ぼかし強度(1.0〜10.0程度) blur_stepx=1.0/sx blur_stepy=1.0/sy gpmatprm1 blur_mat2, "u_length", 0.0 gpmatprm1 blur_mat2, "u_length2", blur_level return *exec_blur2 ; パラメーター更新 dd=blur_level *exec_blur_loop ; buffer1 -> buffer2にコピー gpmatprm1 blur_mat, "u_length", blur_stepx*dd gpmatprm1 blur_mat, "u_length2", 0.0 gsel 2:redraw 0:pos 0,0:gmode 0:celput 1:redraw 1 dd-=1.0 if dd<=1.0 : goto *exec_blur_done ; buffer2 -> buffer1にコピー gpmatprm1 blur_mat2, "u_length", 0.0 gpmatprm1 blur_mat2, "u_length2", blur_stepy*dd gsel 1:redraw 0:pos 0,0:gmode 0:celput 2:redraw 1 dd-=1.0 if dd<=1.0 : goto *exec_blur_done2 goto *exec_blur_loop *exec_blur_done2 ; buffer1 -> buffer0にコピー gpmatprm1 blur_mat, "u_length", blur_stepx*dd gpmatprm1 blur_mat, "u_length2", 0.0 gsel 0:redraw 0:pos 0,0:gmode 0:celput 1 return *exec_blur_done ; buffer2 -> buffer0にコピー gpmatprm1 blur_mat2, "u_length", 0.0 gpmatprm1 blur_mat2, "u_length2", blur_stepy*dd gsel 0:redraw 0:pos 0,0:gmode 0:celput 2 return