見出し画像

Amplify Shader Editorの中級者?向けTips

最初に

初歩的なことに関しては下を眺めてるとわかります。下のリンクを眺めて検索すれば大体終わりです。あとサンプル。aseのサンプルは充実してると思います。depthに意味わからんoffset入っててわけわからん挙動したりするけど(Projectorの話)


ヘッダーの出し方

なんか項目ごとにまとめるための太字のやつです。この記事の太字みたいな

シェーダーオプションのプロパティ化

小さい丸を押すとできます、マニュアルにある以下の画像がわかりやすいです。この丸はいろんなところにあるので気軽に押してみてください。

ただコレenumでぶちこむわけですがめんどくて、floatのauto registerにチェック入れてアトリビュートからenum選んでモードをuse engineにして右下に出てくる三角形押して例えばcullingだったらcullmodeとか書いてあるやつを指定するとようやくインスペクターに表示され操作できるようになります。toggleのやつは普通にtoggleでいけます。

AttributesにあるCustom

Spaceとかのなんでここにねえんだよみたいなアトリビュートをぶち込むところです。Space(100)とか書くとわかりやすいと思う。以下にまとめ記事があります。

ShurikenにおけるGPUインスタンシング

instancing_options procedural:vertInstancingSetup
UnityStandardParticleInstancing.cginc

これでいけるんですが、cvsがtexcoordからinstancedになるわけですが、あれに対応してないっぽくて、cvsから乱数送りたいみたいな願いはかなわないです。

たぶん良い感じにテンプレート書いてTemplate Local Var Dataとかいうノード使えば持ってこれる気がするので、だれか書いてgithubに上げたら英雄になれると思います。チャンスは今しかない!

ちなみに検索するとこの疑問に公式のフォーラムでプロパティをすべてインスタンスドプロパティにすればいいよとかいってる四年前のやりとりが出てくるんですが、これはshurikenではなくスクリプトから制御するGPUインスタンシングの話です。つまり大嘘です。

なぜ上のpragmaとかなのかは以下をみてください。

TEXCOORDが足りなくて白くなる

depthとか色々使ってるとuv使い尽くして?なったりする。shader modelを4.5とかに上げると解決したりする。

Discordのコミュニティを見よう

amplifyのdiscordコミュニティなんですが以下にリンクがあります。ちっさく書かれてますがよく見ればあります。

英語読むのだるいのでchromeでdiscord開いて翻訳して読んでます。まあぶっちゃけ大したこと書いてないです。正直調べにくいんでみんなwebに帰ってきてくれ。頼む

以下どうでもいい感じ

ノードの共有

https://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/Manual#Sharing_Content

公式のマニュアルにこういうのがあるよって書いてあったんですが、使ってる人見たことないんですけど私だけですかね…?

ライト経由での位置と方向取得

ライト関係の機能をvertex offsetに流すことで任意の方向にオブジェクトを曲げたりできる。DPSとかはたぶんこれで動いている。DPSってなに?って人は流していいです。ちなみにaseには未だにShadeSH9ノード無いです。 Indirect Diffuse Lightノードで取れる。

Modulo

fractでなんかカクカクした波作ると思うんですが、moduloでも作れます。aseだとremainderです。こっちのほうが波の間とか調整できていい。abs噛ませてsaturateしてone minusでいける。するとtimeをマイナスにした際に波の向きも変わってくれる。高い方が進んでいる方を向いてくれる。

Posterize Time

TimeにPosterize挟むとコマ落ちっぽい動きが作れる。

Transform Direction/Position

入力はオブジェクト座標なんだけど出力はワールド座標にしたい!みたいなときに便利。viewにもできる。方向を限定したい場合、vector3(XYZ)を乗算する。

miscellaneousとfunctionカテゴリのノード

ノード編集画面の右上の四角を叩くと出てくるとこの画像。twirlみたいなよく使うのから「それいる?」みたいな意味の分からないノードまで色々あります。いじってみるとおもしろいと思います。miscellaneousにはdots patternとかお絵かき系のノードがいろいろあって、算数に弱い人でも軽く楽しむことができる。ちなみにほぼすべてのノードに対してマニュアルがありません。

プロシージャルノイズのフラグメント処理は重い

ノイズジェネレータあると楽だから使いがちなんですが、ノイズをピクセルごとに処理するのは普通に重くてモバイルGPUとかでは全く推奨されないらしい。以下の動画で触れられてます。simplexがどの程度重いのか私は知らない。プロシージャルノイズの中ではかなり軽い方らしいけど。

ピクセルごとだと重いからバーテックスごとぐらいに留めようぜみたいな。ここで言われているカスタムインターポレータはaseだとVertex To Fragmentノードになるっぽいですが実際は知らないです。他にもpowとdivideは重くてaddとmultiplyは軽いとか、そういう話もしている。

No Keyword Toggleの謎

floatのアトリビュートにno keyword toggleという項目があります。これについて私が見つけられた記述は以下だけです

Displays a float as a toggle. The property value will be 0 or 1, depending on the toggle state. Does not generates shader keywords. フロートをトグルとして表示します。プロパティ値は、トグル状態に応じて0または1になります。シェーダーキーワードを生成しません。

https://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/Float

Unityのシェーダーキーワード数には制限があり、なるべくグローバルではなくローカルを使え、multi compileではなくshader featureを使えとマニュアルのstatic switchノードの項目に書いてあるのですが、キーワードを使わないtoggleがなんなのかについては何も書いてありません。で生成されたコードを見ると、

だけで#ifdefとかは無かったです。単に01入れ替えてるだけっぽい。ただのToggleと同じじゃないかこれは。というかfloatでどう書いたらバリアントができるのか分からないので書き方が悪いんだろうけど。わかってそうなやりとりを以下に引用して終わりにします。toggleUIいずなに。

ちなみにVRChatSDKはシェーダーキーワードのローカルとグローバルを区別できてないらしいです(2021年時点)。VRC自体はローカルとグローバルを区別しているらしい。


この記事が気に入ったらサポートをしてみませんか?