sample\hgimg4\posteffect.hsp » Plain Format
#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