Overview
Effect Layerは、ゲームオブジェクトごとにWebGLの描画先をオフスクリーンのフレームバッファーに設定する方法を提供します。オフスクリーンのフレームバッファーのカラーバッファーにカスタムのポストプロセッシングシェーダーを適用することができ、その場合はEffect Layerをテクスチャーとして使うことができます。dstRenderTexture
プロパティーを使ってEffect Layerからテクスチャーにアクセスすることもできます。
Effect Layerは簡単に使えて、シングルコールでGame Object Factoryを呼び出すことができます。ただし、完全に機能を引き出すにはシェーダーについての理解が必要となるでしょう。Effect Layer上のピクセルに対して操作するレンダリングパスについて、シンプルで応用が効くフラグメントシェーダーの使い方の例はこちらが参考になるでしょう。
Effect Layerは現在以下の機能が使えます。
- renderOffScreen
- renderOnScreen
- add
- remove
- getUniformLocation
- setFloat
- setFloat2
- setFloat3
- setFloat4
- setInt
- setInt2
- setInt3
- setInt4
- setMatrix2x2
- setMatrix3x3
- setMatrix4x4
Examples
Fragment Shaderを使って、Effect Layerに対して見栄えのするマスク効果を作成する例です:
var fragSource = [ 'precision mediump float;', 'uniform float time;', 'const float PI = 3.1415926535897932384626433832795;', 'mat2 rotate2d(float angle){', ' return mat2(cos(angle+time),0.,', ' sin(angle+time),0.);', '}', 'float stripes(vec2 st){', ' st = rotate2d( PI*-0.202 ) * st*5.;', ' return step(.5,1.0-smoothstep(.3,1.,abs(sin(st.x*PI))));', '}', 'void main(){', ' vec2 resolution = vec2(300.0, 100.0);', ' vec2 st = gl_FragCoord.xy/resolution.xy * sin(time/2.)*sin(time/2.);', ' st.x *= resolution.x/resolution.y;', ' vec3 color = vec3(stripes(st));', ' gl_FragColor = vec4(color, 1.0);', '}' ].join('\n'); var effect; var time = 0; function create () { effect = this.add.effectLayer(0, 0, 800, 600, 'maskEFfect', fragSource); } function update () { effect.setFloat('time', time); time += 0.005; }