Akashic Engine 逆引きリファレンス

シェーダを利用する

この文書は不完全です。また現在利用例のサンプルコードのシェーダが動作していません。

Akashic Engine v3 は、限定的にフラグメントシェーダをサポートしています。 シェーダを使うには、g.ShaderProgram を利用します。

凡例

var fragmentShader = scene.assets["shader"].data; // テキストアセットからフラグメントシェーダを取得
var shader = new g.ShaderProgram({
  fragmentShader: fragmentShader
});

var sprite = new g.Sprite({
  ..., // その他のプロパティ
  shaderProgram: shader // シェーダの指定
});
sprite.shaderProgram = shader; // 既存の sprite にシェーダを指定
sprite.modified(); // modified() で表示に反映

利用例

次のコンテンツは、画像をモノクロ化して表示します。

詳細

以下、 WebGL のシェーダについての知識が必要です。

Akashic Engine は現在、フラグメントシェーダを限定的に利用することができます。

バーテックスシェーダは非サポートで、attribute も固定です。uniform は利用できます。 したがって現状の用途は、画像に対する単純なフィルタなどに限られます。

シェーダを利用するには、まず game.jsonrendererswebgl を追加します。

"renderers": ["webgl"],

シェーダは g.ShaderProgram で表されます。g.ShaderProgramg.E やそれを継承したクラス (g.Sprite , g.Pane など) に適用できます。

シェーダプログラムは親エンティティの値を継承します。そのため、シェーダプログラムを適用したエンティティに複数の子エンティティに追加することで、複数のエンティティに同一のシェーダプログラムを適用することができます。

下記のコードでは、テキストアセット monochrome.glsl を読み込み Pane に指定しています。Pane の子エンティティである SpriteFilledRect にもシェーダが適応されます。

#version 100
precision mediump float;
varying vec2 vTexCoord;
uniform sampler2D uSampler;
uniform float uAlpha;

void main(void)
{
  // 対象ピクセルの色情報を取得
  vec4 color = texture2D(uSampler, vTexCoord);
  // 対象ピクセルのRGB値を加算
  float sum = dot(color.rgb, vec3(1.0));
  // モノクロ化
  vec3 outColor = vec3(sum / 3.0);
  // 最終出力色
  gl_FragColor = vec4(outColor, color.a * uAlpha);
}
function main() {
  var scene = new g.Scene({ game: g.game, assetIds: ["player", "monochrome"] });

  scene.onLoad.add(function() {
    var fragmentShader = scene.assets["monochrome"].data;
    var shader = new g.ShaderProgram({
      fragmentShader: fragmentShader
    });
    var pane = new g.Pane({
      scene: scene,
      width: 300,
      height: 300,
      shaderProgram: shader
    });

    var sprite = new g.Sprite({
      scene: scene,
      src: scene.assets["player"],
      x: 100,
      y: 100
    });
    var rect = new g.FilledRect({
      scene: scene,
      width: 100,
      height: 100,
      x: 50,
      cssColor: "red"
    });
    pane.append(sprite);
    pane.append(rect);
    scene.append(pane);
  });
  g.game.pushScene(scene);
}

module.exports = main;

.glsl 内で利用している uAlpha, uSampler, vTexCoord は固定で与えられます。 それぞれ opacity を反映した透明度、元の描画内容 (画像や FilledRect の単色) をテクスチャとして参照するサンプラー、そしてテクスチャ座標です。

設定したシェーダを戻したい場合、 undefined または null を指定します。 undefinednull は以下のように挙動が異なることにご留意ください。

  • undefined: 親エンティティのシェーダプログラムを利用する。(デフォルト)
  • null: 親エンティティのシェーダプログラムを利用せず、常に初期のシェーダプログラム( undefined )を利用する。
sprite.shaderProgram = null;
sprite.modified();

関連情報