さきに使ったスクリプト貼っとく。
学んだこと
①スクリプトからプロパティへのアクセス
id = Shader.PropertyToID("_Color");
...
mat.SetColor(id, Cd);
シェーダーのプロパティへは SetXXX
みたいなメソッドでアクセスができるっぽいのだが、この第一引数はstringでも良いらしい。
つまり、mat.SetColor("_Color", Cd);
でも問題はない。
ただし、内部的にはidを調べて使っているようなので int id
を引数にしたほうが圧倒的に速いとか。
②Remapメソッド
public static class MathExtensiton { public static float Remap(this float value, float from1, float to1, float from2, float to2) { return (value - from1) / (to1 - from1) * (to2 - from2) + from2; } }
タイトルと直接関係ないけど、Remapのような便利関数はてっきり標準のメソッドとしてあるのかと思ったらない。ということでググった結果、上のような関数があったので拾ってきた。ところで、こういった拡張メソッドにはC#的な書き方があるらしく、最初それをわかっていなかったのでちょっと躓いた。このあたりはまた再度勉強する。
そうそう、Inspectorは普通にこんな感じ。
③プロパティブロック
Properties { _Color("Color", Color) = (1, 1, 1, 1) }
ColorはShaderlab側が用意した型の1つでCGPROGRAM内ではfixed4に対応している。 最初、試しにrgbとalphaで別のプロパティとして書こうと思ったのだが、Vectorという型がありはするものの、中身はこちらもfixed4にしか対応していなかった。まあ、不便は特になさそう?
④タグブロック
Tags { "RenderType" = "Transparent" "Queue" = "Transparent" }
Tag構文についてはあんまり書かない(理解してない)が、Queueタグが描画順を管理する役目で、1000~4000くらいの値で使われる。(もっと大小のある数値が使えるのかは未知。) RenderTypeタグはもっとよくわからないが、基本的に最初のうちは
Opaque = 不透明 Transparent = 透明
を使い分ければ良さそう。ちなみにOpaqueはおぱきゅーって読む(読まない)。
⑤Blendブロック
Blend SrcAlpha OneMinusSrcAlpha
重なった色の合成法について決める構文。これもググったら種類が多い。
SrcColor * SrcFactor + DstColor * DstFactor
みたいな公式が出てきた。
SrcColor = Fragment Shaderの算出した色 DstColor = すでにそこに描画されている色
を意味していて、Blend SrcFactor DstFactor
という宣言になっているようだ。今回の Blend SrcAlpha OneMinusSrcAlpha
が一番基本となる合成方法らしい。面白い、この辺の比較はまた今度やってみる。(やってみたいことがどんどん増えるなぁ。)
一番最初のGIF、録ったとき透過のこと忘れてたので、最後に。