Amplify Shader Editor 備忘録

概要

UnityのBuild-in環境でAmplifyShaderを使ってる際に、気付いた事や困った事、聞いたり調べた内容を載せます。情報が正しくない可能性もあるかも

基本系

インストールしたけど何から手を付ければいいかわからない!

以下私的参考

調べたいけどなかなか情報が出てこない!

日本語の資料はほんとない…以下を翻訳して探してくる感じ

操作系

コメントを使いたい

ウィンドウ内で”C”キーを押す

ノードを出すためのショートカットキーが効かない?

キーを押しながらクリックで出す必要がある。
Add なら A を押しながらクリック。

Floatなどで値を操作できるバーを出したい

Min,Maxに値を入れると出てくる

Unity上のInspectorで値を入力できるようにしたい

Parameters の Type を PropertyにすればOK

OutPut内の値をInspectorで操作したい

  1. ノードを作って上記のようにPropertyにする
  2. 該当の項目の右側の●を押す
  3. 作ったノードの名前を指定する

※場合によってはAttributesのAuto-Registerにチェックを入れないと、Insplectorに出てこないことも

Vector2をPropertyにするとInspectorに4つ項目が出てしまう(減らしたい)

仕様みたい。Vector3も同様

InspectorにTextureのTilingとOffsetの入力欄を出したくない

↑からTexuture参照だけ↓にしたい場合

TextureSampleのAttributesから Single Line Texture にチェックを入れるとテクスチャー参照だけになる

InspectorにMinとMax調整用のバーを出したい

Node(Vector2)のAttributesから Remap Slider にチェックを入れる

Inspectorの項目を並び替えたい、整理したい

Out PutのMaterial Propertiesをドラッグすると入れ替えられる。
見出し(Header)の文字が欲しい場合は、各NodeのAttributesのHeaderにチェックを入れて入力欄に文字を入れる。

Unity上のSceneビューでUVスクロールなどを再生して確認したい

SceneのメニューからAnimated Materialsにチェックを入れれば再生される

ShaderEditorで編集した内容を即時Scene上に適用させたい

Shaderではなく適用させているMaterialそのものをShaderEditorで開く。追加済みのパラメーターはすぐ画面に反映される。新規追加のものは一回保存する必要あり。

編集しているShader/MaterialがProjectのどこにあるか分からなくなった!

Editor下部にある SHADER or MATERIAL をクリックするとProjectウィンドウで選択してくれる

他人にノード一式を共有したい

  1. コメント内に共有したいノードを入れる
  2. コメントごと全部選択する
  3. 上のバーにあるカメラをクリックする
  4. リンクがコピーされるので共有したい人にそのリンクを渡す
  5. 渡された人は、Shader Editor 上でペーストする

※どこかの鯖にアップされるので企業内では要注意

Node詳細、内容系

とりあえずエフェクト用に加算合成させたい

OutPutNodeを以下にする

  • CommonProperties を Legacy / Unlit に
    • Flag Color(色)とVertex Offset(頂点変更)だけになって軽くなる
  • SubShader の Blend Mode の Blend RGB をAddtive にする
  • SubShader の Tags を 編集/追加 にする
    • RenderType を Transparent に
    • Queue を Transparent に
      • MaterialのInspectorのRenderQueueの項目が、Transparent/3000とかになるはず
      • 低いと背景などより先に描画されて、加算の後ろが描画されない(透けてしまう)

加算合成にしているのに黒色が出る

RGBの計算結果がマイナスで、それを加算して結果的に黒くなってる可能性がある。
Saturateとかをかけて0~1内にすると治るかも

Photoshopで言うレベル補正をかけたい

私はRemapでやりました。値が0~1よりはみ出ることもあるのでSaturateを忘れずに…

グラデーションマップ(Photoshop) or コロラマ(AfterEffects)をかけたい

デフォルトで用意されているグラデーション(Gradient)はプロパティにできないっぽい。
私は256×4の画像を作ってUVに充てた。色の度合い(どの範囲の色合いを出すか)は前述のRemapで調整。※右が明るくて左が暗いマップの場合、One Minusは必要なし

フチをとりたい(リムライト的な)

↑の青い部分

WorldNormalとViewDirをDotにさせてよしなに

またはFresnelを使う

接地面を取りたい!(Intersection)

↑の赤い部分
  • DepthFade(奥のポリゴンとの距離)を使う。
  • CameraのDepthTextureModeをDepthにして深度をとれるようにする
  • VRChatでは上記プロパティを変えても変化がない
    • Cast ShadowsをOnにしたGameObjectとMaterialと、
      SyadowTypeが”NoShadows”以外になっているLightが必要

VertexPositionが特定の位置/角度で白飛びする

Sceneビューでは問題ないが、Gameビューで起きる問題。マテリアルのInspector下部にある”Enable GPU Instancing”にチェックを入れることで解決するかもしれない…
なぜこうなるか不明。同じ要因でVertexPositionをVertexOffSetにつないでいる場合、見えなくなる(どこか遠くへ吹っ飛んでたり)

球をどの角度から見ても同じUVになるようにしたい

UVだけBillboardみたくしたい場合

World NormalからTransform Direction(World to View)に繋ぐだけ。
※Vertex Normalから繋ぐとTransformのRotationによって角度が変わる様になる。
※ComponentMaskは見た目を分かりやすく為だけに使用。

どの角度から見ても↑の状態になる

ParticleSystemのColorを適用したい

Color over Lifetimeで透過度をいじっても変化がない場合はコレが原因。
ParticleSystemのColorは頂点カラーなのでVertexColorを適用させればOK

Particleから特定の値/パラメーターを受け取ってコネコネしたい

特定のタイミングで透過度やら適用度やらUV位置を変えたい際になどに。
CustomVertexStreamsを使う。
自分がざっくり理解している原理は以下

  • ParticleSystemのInspectorにあるRenderer内のCustomVertexStreamsにて、
    指定した情報 TEXCOORD(0~3).xyzw の枠内の情報をShaderに送ることができる
  • AmplifyShaderEditorでは VertexTexcoord のUV Channel(0~3)のxyzwで受け取る形になる
  • 大抵 TEXCOORD0.xy はUVに使っているので、実際に使えるのは TEXCOORD0.zw~ 以降
    • 受け取る側はVertexTexcoordのUV0のzw以降の値になる
  • 送るパラメーターは、ユーザー定義のCustomDataの他、結構いろんな種類がある
  • 送るパラメーターの順番をズラすと、渡す際のTEXCOORDの形も変わってしまう。困る

ParticleでVertexPositionを使うとヘンになる

Particleでは個々の頂点は取得できない模様。
取りたい場合は、CustomVertexStreamsでCenterをShaderに渡して、相対的な位置をコネコネする必要がある。※具体的なノードはRotationが取れなくて検証中…

ParticleでVertexOffsetの影響が小さい/大きい

Particleでは、個々の”Size”の値をもとに影響値を補正させる必要がある。
Sizeを200とかにした際に頂点が全然うごいてなかったらコレのせい。

  • Particleの CustomVertexStreams で Size.xyz を送るようにする
  • Shader側はVertexTexCoordでその値を受け取る
  • VertexOffsetにその値を掛ける

Tween的なイージング(EaseIn/EaseOut)をかけたい

CustomExpressionを使いました。
結果がShaderEditor上で見た目反映されないし、マイナスが入るとおかしくなるのが難点。
以下のリンクをコピー → お手元のShaderEditor上でペーストすれば使える(はず)
http://paste.amplify.pt/view/raw/4482a0bf

※追記
Multiplyに同じ値を2つ入れるとQuadraticInに、3つ入れるとCubicInになるのでそっちのが便利かも。

ポリゴン内にポリゴンをマスキングしたい!

ステンシル(Stencil)を使う。詳しくは以下など

トラブルシューティング

Property (_MainTex等) already exists. Use SetTexture instead~の警告が出る

ShaderTypeをUI/Defaultに選択した場合、_MainTexはSprite用に引っ張る必要がある。
“Template Paramator”のノードでParamaterでSpriteTextureをを指定して、TextureSampleにつなげばOK。

参考:Unity Products:Amplify Shader Editor/Template Parameter
参考:Amplify Shader Editor Problem with Sprite and UI Shader Types: Property (_MainTex) already exists. Use SetTexture instead – Real Time VFX

Property (_ZWrite等) already exists. Use SetTexture instead~の警告が出る

_ZWriteをfloatで参照させている場合など。AttributesでIntRangeを指定した場合はチェックをオフに

Shader warning in ‘〇〇〇’: pow(f, e) will not work for negative f ~の警告が出る

Fresnelを使っているのであれば、SafePowerにチェックを入れれば解決。

その他リンク集

参考にさせて頂いております!めちゃ助かる