Continue(s)

Twitter:@dn0t_ GitHub:@ogrew

【Unity】スクリプトからマテリアルの色(Properties)を変更する

f:id:taiga006:20200122220633g:plain

さきに使ったスクリプト貼っとく。

gist.github.com

学んだこと

スクリプトからプロパティへのアクセス

    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は普通にこんな感じ。 f:id:taiga006:20200122225121p:plain

③プロパティブロック

 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、録ったとき透過のこと忘れてたので、最後に。

f:id:taiga006:20200122224139g:plain

参考記事

www.shibuya24.info

ja.stackoverflow.com

tsubakit1.hateblo.jp

docs.unity3d.com

q7z.hatenablog.com