GameMaker:Studio Shader グレースケール
配布されていたシェーダのサンプルを整理したもの。
画像をグレースケール化する効果。
イベントを一つのオブジェクトへまとめるようにし、
- Create
- Draw
- DrawGUI
上記の三つのイベントへ収まるように作った。そして無駄な変数定義を全て排除。
あとはなるべくユーザ定義関数化して、使い回しが良くなるように
参考動作:http://prester.org/html5/gms_shader_greyscale/
参考(YoYoGames MarketPlace):xygthop3’s Shader Resources
キーボードの Q と A キーでグレースケール値を変更可能。
値は 0 〜 1 までの範囲で制限してあります。要 WebGL、FireFox で動作を確認。
画面左側がシェーダ効果がかかったもので、右はオリジナルのスプライト。
値は 0 〜 1 までの範囲で制限してあります。要 WebGL、FireFox で動作を確認。
画面左側がシェーダ効果がかかったもので、右はオリジナルのスプライト。
シェーダー名:SH_greyscale
Vertex Shader
attribute vec3 in_Position;
attribute vec2 in_TextureCoord;
varying vec2 v_texcoord;
void main()
{
gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * vec4(in_Position, 1.0);
v_texcoord = in_TextureCoord;
}
Fragment Shader
varying vec2 v_texcoord;
uniform float fade;
void main()
{
float gray = dot(texture2D(gm_BaseTexture,v_texcoord).rgb, vec3(0.21, 0.71, 0.07));
gl_FragColor = vec4(mix(texture2D(gm_BaseTexture,v_texcoord).rgb,vec3(gray),fade), texture2D(gm_BaseTexture,v_texcoord).a);
}
ユーザ定義関数 Init_GreyscaleShader
///Init_GreyscaleShader();
if (!shader_is_compiled(SH_greyscale)) {
show_message("Your hardware doesn't support shader - SH_greyscale");
}
else{
uni_greyscale_fade = shader_get_uniform(SH_greyscale,"fade");
var_greyscale_fade = 0.8;
};
ユーザ定義関数 DrawEv_SetSprites
///DrawEv_SetSprites();
var a = sprite_get_height(banners);
for (var i=0;i<3;i++){
draw_sprite(banners,i,-100,a*i);
};
ユーザ定義関数 DrawDebug_Function
///DrawDebug_Function();
var w,z;
z = 0.01;
w = var_greyscale_fade;
if keyboard_check(ord('Q')) and w<1 var_greyscale_fade += z;
if keyboard_check(ord('A')) and w>0 var_greyscale_fade -= z;
var c,d,e;
c = c_red;
d = display_get_gui_width()>>1;
e = display_get_gui_height();
draw_line_colour(d,0,d,e,c,c);
var a,b
a = sprite_get_height(banners);
b = ((a<<1) + a);
draw_circle_colour(d,b,40,c,c,0);
ユーザ定義関数 DrawGUIEv_Greyscale
///DrawGUIEv_Greyscale(width_scale);
var a = argument0;
shader_set(SH_greyscale);
shader_set_uniform_f(uni_greyscale_fade, var_greyscale_fade);
draw_surface_ext(application_surface, 0,0, a,1, 0, -1,1);
shader_reset();
実際のイベント処理
シェーダと4つのユーザ定義関数を使って簡潔なイベントを作成。
Create Event
///Init
Init_GreyscaleShader();
draw_set_font(font0);
/* Variables For Debug */
Debug_Scale = 0.5;
Draw Event
DrawEv_SetSprites();
Draw GUI Event
///Draw gui
DrawDebug_Function();
DrawGUIEv_Greyscale(Debug_Scale);
var a;
a = room_height-100;
draw_text(100,a,"Shader Effect::Greyscale");
draw_text((room_width>>1)+100,a,"var_greyscale_fade = "+string(var_greyscale_fade));
application_surface を対象としてシェーダでエフェクトをかけます。
Draw イベントで描画した画面を DrawGUI へ描画するという手順。
ユーザ定義関数である DrawGUIEv_Greyscale でシェーダ処理を行っているので、アクションの実行されるタイミングなどを色々変えて描画結果の違いを試すと良い。
シェーダで Application_surface 全体を対象にする場合は DrawGUI のタイミングで描画するのが無難。
次へ
前へ