DistaneFieldスタイルを装飾する

前の投稿の続きです。
前のその1 http://qiita.com/harayoki/items/a8abbf48bac9d246787c
前のその２ http://qiita.com/harayoki/items/f88c439c18bc1881ace1

基本単色で使う事になるDistaneFieldスタイル適用画像ですが、いくつかの方法である程度の装飾が可能です。
![ss.png](https://qiita-image-store.s3.amazonaws.com/0/8302/5031d27e-224b-12e8-cac6-7bd1daaf7079.png)

ここにデモがあります。
https://harayoki.github.io/StarlingDemoDistanceFieldStyle/demo2/index.html

スマホ向けに動画でもあげておきました。
https://www.youtube.com/watch?v=tr8RD4skF0w

ソースはここにあります。
https://github.com/harayoki/StarlingDemoDistanceFieldStyle/tree/qiita161224_2

#詳しい解説

![スクリーンショット 2016-12-25 22.07.25.png](https://qiita-image-store.s3.amazonaws.com/0/8302/b65b5454-08f8-9175-ddbd-6c726df4e770.png)
等倍のこのドット絵をいくら拡大しても綺麗というのがDistaneFieldスタイルのすごいところです。つまりはベクター画像みたいなものですね。ただし単色。

![スクリーンショット 2016-12-25 22.06.01.png](https://qiita-image-store.s3.amazonaws.com/0/8302/b8722cb8-c6e4-0b06-e465-04e3896cfb90.png)
２倍表示(よりも大きくなっちゃったのはRetinaディスプレイでキャプチャーしたから。。）のこいつらは色を指定してあります。単色指定しかできないと思われてますが、頂点(４箇所)ごとの色指定ができました。

```as3:
image.color = 0x0ff00; // 単色指定
image2.setVertexColor(0, 0xff0000); //左上
image2.setVertexColor(1, 0xff0000); //右上
image2.setVertexColor(2, 0xff0000); //左下
image2.setVertexColor(3, 0xff0000); //右下
```

![スクリーンショット 2016-12-25 22.06.18.png](https://qiita-image-store.s3.amazonaws.com/0/8302/e4a36e98-eb35-4aa1-5c9b-909ad1e830eb.png)
この３つが、DistaneFieldスタイルに備わっている装飾３つです。左から、枠線、影、発光です。それぞれ色指定も可能です。

```as3:sample.as
// 枠線
var style1:DistanceFieldStyle = new DistanceFieldStyle();
style1.setupOutline();
image1.style = style;
// 影
var style2:DistanceFieldStyle = new DistanceFieldStyle();
style2.setupDropShadow();
image2.style = style;
// 発光
var style3:DistanceFieldStyle = new DistanceFieldStyle();
style3.setupGlow();
image3.style = style;
```
（デモのようにアニメーションに適用する場合、影エフェクトのみ位置がチラチラずれる挙動を取ってしまうようです。）

これらのエフェクトはフィルターの場合と違い、描画負荷がほとんど増加しないという特徴があります。
これらのエフェクト３つは便利なのですが、重ねがけできないという制限があります。
エフェクトを組み合わせたい場合は、今まで通り重ねてフィルタを適用します。

![スクリーンショット 2016-12-25 22.06.34.png](https://qiita-image-store.s3.amazonaws.com/0/8302/613d411f-e24e-577c-cde7-e1f49ab0e57f.png)
この画像は枠線スタイルに発光フィルターをかけたものです。標準フィルタにドロップシャドウとグロウが存在するのに対して、ズバリ枠線というものはないので、綺麗に描画されるDistaneFieldスタイルの枠線は重宝しそうです。

![スクリーンショット 2016-12-25 22.06.40.png](https://qiita-image-store.s3.amazonaws.com/0/8302/ab170dce-639d-ff7c-60dc-c24168de38c9.png)
こちら２つは自分が作った斜線フィルターと走査線フィルターを適用してみたものです。問題ありません。

![スクリーンショット 2016-12-25 22.07.17.png](https://qiita-image-store.s3.amazonaws.com/0/8302/58bd9904-bf25-a25f-7c22-5767ab493a2a.png)
てんこ盛り６倍表示したものです。（枠線＋４頂点着色＋斜線フィルタ＋発光フィルタ）なんだかわかりませんがとにかくすごい。

ここから下３つはちょっと変わった実験です。

![スクリーンショット 2016-12-25 22.06.57.png](https://qiita-image-store.s3.amazonaws.com/0/8302/85e178a3-c527-3574-5b4f-beb1f4e0c088.png)
イメージに9スケールを適用して等倍表示してみました。内部で頂点が増えますので、それぞれに色指定が可能です。

![スクリーンショット 2016-12-25 22.07.08.png](https://qiita-image-store.s3.amazonaws.com/0/8302/424e2ab5-bd90-baa6-ea8f-f2e481b7ad17.png)
ただし拡大するとこう伸びますので、（正しく9スケールできてるという事)本来の大きく拡大しても綺麗という用途には使えませんね。

![スクリーンショット 2016-12-25 22.07.13.png](https://qiita-image-store.s3.amazonaws.com/0/8302/9f2ea703-4e46-ca29-270e-8836080a8598.png)
なお、そもそもスプライトシートアニメと9スケールは同時使用すると描画が荒れます。

#ドローコール数について

![スクリーンショット 2016-12-25 22.43.54.png](https://qiita-image-store.s3.amazonaws.com/0/8302/0d5ddaeb-9f65-cc6a-1f77-dbd04c93d46c.png)
DistaneFieldスタイルの同じエフェクトをつけた画像を並べていった場合ドローコールが増えません。違うエフェクトに切り替えるとドローコールが増えます。エフェクトなしに切り替えてもドローコールが増えますが、エフェクト色を透明指定する事で、エフェクトなし状態を再現できます。

#締め

DistaneFieldのテクニックはStarlingコンテンツに限った話でなく、そもそもはコンシューマーゲーム界隈からでてきた技術なので、最近のゲームエンジンなどでも活用されてる例があるかと思います。そちらにもこの記事が参考となればと。