LoginSignup
0
0

More than 5 years have passed since last update.

AGAL入門 #7 : 記述のちょっとしたコツ その1

Posted at

いくつかStarling2でAGALコードを書いてみて、オリジナルなテクニックというかコツのようなものが見えてきたので、いったん記事にまとめてみようと思います。なお、トークン数が少ないとか速く動作するとかその方向は現状目指しておらず、わかりやすく間違いのない書き方をしようという目標でやっていますので、パフォーマンス的には無駄がある事に留意してください。

TIPS:なるべくAGALで計算しない

いきなりそこかという感じですが、AGALでなくActionScript側で計算できる事はそちらで行ってから定数でAGALに渡したほうがデバッグがしやすいのでよいです。AGALコード中でレジスタがどのような値になっているかは基本的にわからないので。。例えばエフェクトの強さを渡すとして、計算の最中で必ず2で割ってから1を引くなどしている場合(結果それが何の値なのかはっきり言えなくなっても)AS側でやってしまえばいいのです。

TIPS:定数は余裕を持って使う

(Starling2の場合フィルターでなく、スタイルを作る場合は制限がきついのでそうもいきませんが)定数レジスタは数多く使える(AGAl2なら、vcが250もレジスタでfcが64レジスタ、AGAL1ならvcが128レジスタ、fcが28レジスタ)ので、一つのレジスタのxyzwそれぞれの値をみっちり使う必要はないです。最初のtipsと絡めて言うと、事前計算前の値と事前計算途中の値と事前計算結果の値とすべて定数で渡したって、よいのです。AGAL側で四則演算するのも疲れるので。

TIPS:受け取った定数レジスタを最初にテンポラリレジスタに移動してしまう

AGALでは定数同士の演算は行えません。引数を1つしか持たない命令は内部処理の都合か、定数1つ指定しただけでエラーになるようです。テンポラリレジスタはそこまで数が多くない(AGAL2ならvtもftも26レジスタ、AGAL1なら各8レジスタ)ので場合にもよりますが、最初にmove命令でテンポラリレジスタに値をコピー(移動)してしまえば、複雑な計算途中でエラーになる事がなくなり無駄なコード書き換えをしなくてすみます。この用途では添字の大きいテンポラリレジスタから使っていくとコードの見通しが良くなりそうです。

TIPS:どうしても値が知りたかったらカラーとして出力する

フラグメントシェーダー限定の処理になりますが、何がおかしいのかわからない場合の最終手段としてレジスタの値をカラーとして出力してしまう技が使えます。0~1の範囲限定となるので、出力前に演算が必要になるかもしれませんがここで値が3になっているはず!みたいな場合は1/3の値をカラー出力してしまえば、結果を画面キャプチャーしてRGB値を調べれば255/3=85みたいに値の確認ができます。rgbaの4チャンネルあるので、4つの値を同時に確かめられますね。

TIPS:基本的な数値は使おうが使わまいがまず定数で渡してしまう

AGAL内には数値のリテラル記述ができないので、0とか1とか2とか簡単な値であっても定数として受け渡してやらないと扱う事ができません。必要になってから受け渡すコードを書くのは面倒くさいので、ここはもう毎度のお決まりにして、固定で渡してしまえばいいと思います。気になるなら動作確認後の最後の段階で使わなかったものを消去すればいいのではないかと。

TIPS:AGAL2を使う

前のif分岐についての記事にも書きましたが、特別な状況でない限りAGAl1の制限下でコードを書く必要はないと思います。if分岐が書けるのと書けないのでかなりの差があります。AGAL2のStandard Constrainedプロファイルであれば、メジャーなスマホとデスクトップ環境はほとんどカバーできます。

TIPS:イディオムを作っていく

Math.floorに値する命令はないですが、数値の少数部分をえる命令(frc)はあるのでいったん別レジスタに少数部を得て、それを元の値から引いて間接的に整数部をえる、みたいな感じです。このあたりの具体例は別途記事にまとめてみようと思います。

TIPS:無理にパラメータを増やさず、別クラスを検討する

(これはStarlingのフィルタやスタイルを作る場合の話ですが)1つのフィルターやスタイルがパラメータ変更で表現を変えられるのは便利ですが、あまり対応するとAGALコードもどんどん長くなって、コードの複雑さも増してしまいます。コンスタラクタ時に指定した後はほとんど変更しないようなパラメータであれば、いっその事フィルターやスタイル自体を別のものと分けてしまったり、AGALコード自体パラメータに合わせて一部分をごそっと違うものに入れ替えるなど、動的な変更をあきらめる対応をとったほうが良さそうです。(自らハードルを上げるなという事で、これは自分に対して言っております。)

まとめ

まだありそうですが、とりあえずはこんな感じです。具体的なコードのテクニック(自分の頭でひねり出したレベルで大したものではないですが)は別記事でそのうちまとめようと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0