ツクロウヤ

Unityによるゲーム開発記

【シェーダー勉強-その他】UTSを読んでいた際の雑記

はじめに

今回はちゃんとまとめた記事というよりかは、勉強でユニティちゃんシェーダー(UTS)とかを見ながら勉強していた際の雑記です。
ちょっとまとまりはないですが、とりあえず記載。

VertexOutput

法線、接線、従法線とは

法線

法線ベクトル - Wikipedia
法線ベクトルは、2次元ではある線に垂直なベクトル、3次元ではある面に垂直なベクトル。法線はある接線に垂直な線のことである。

接線

接ベクトル空間 - Wikipedia
曲線または曲面と一点を共有する直線。

従法線

従法線(じゅうほうせん)とは - コトバンク
陪法線ともいう。一般に,空間曲線上の1点で接触平面に垂直な直線を,その曲線の従法線という。

んー、フワッと分かる気がするけど、意味わからん...

というわけで引き続き探してみると... これだ!!
WebGLスクール第2期 5回目 メモ - Qiita
なるほど、なるほど、意味が分かりました。
法線が面に対してZ軸だとすると、接線がX軸従法線がY軸であると。

もうちょい数学的なものだと以下もありました。
(理解してから読むと分かった気がするけど、たぶん分かっていない...)
接線,主法線,従法線 [物理のかぎしっぽ]

なぜ必要なの?
名前の通り「法線マップ」だったり、ライトの計算などで使用。
法線マップについての詳しい説明は以下を参照。
その5 0から学ぶ法線マップ
wgld.org | WebGL: 平行光源によるライティング |

組み込みマクロ

その名前で定義しているものを、コンパイル時に置き換えるもの。

定義する場合は以下のような感じ。
値や関数なども定義可能。

#define PAI 3.1415926
#define ADD(val1, val2) val1 + val2

上記例だと 「ADD(3,2)」にしているところは「3+2」に置き換わる
【Unity】【シェーダ】シェーダでマクロを使う - LIGHT11

Unityの組み込みマクロはどこに定義されている?

#include UnityCG.cginc

のような表記がシェーダーを作成すると大概あり、ここに定義されている。
ドキュメントがなかったりすることも多いが、ファイル自体は以下にあるので、処理の中身自体は確認可能。

Unityをインストールした場所\Editor\Data\CGIncludes

自前の「.cginc」はどうやって作るの?

デフォルトだと右クリックメニューにはない。
Exproler上でテキストを生成して、拡張子を「.cginc」に変えても可能だが面倒...
なので、以下のスクリプトで右クリックメニューで作れるようにした。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;

#if UNITY_EDITOR

using UnityEditor;

#endif

public class CGIncCreater : EditorWindow
{
    const string    NEW_FILE_NAME   = "_NEW_CGInc.cginc";

    /// <summary>
    /// 右クリックメニューに.cgincの生成を追加
    /// </summary>
    [MenuItem("Assets/Create/Shader/CGInc")]
    private static void CreateCGInc() {
        var path = AssetDatabase.GetAssetPath(Selection.activeObject);

        // ファイル名も含んでしまうので、ディレクトリ名だけに
        if (!AssetDatabase.IsValidFolder(path)){
            path = Path.GetDirectoryName(path);
        }

        path = path + "/" + NEW_FILE_NAME;

        StreamWriter sw = File.CreateText(path);
        AssetDatabase.Refresh();
    }
}

「右クリック」>「Create」>「Shader」>「CGInc」で作成可能。 f:id:ArtAwA:20200823205124p:plain

vert(頂点シェーダー)

mulとは

mul(x,y)で「行列同士の乗算」

normalizeとは

正規化 = 正規化とは「ベクトルの方向を維持しつつ大きさを「1」にすること」
3Dを基礎から勉強する 正規化 - デジタル・デザイン・ラボラトリーな日々

何故必要なの?
・単位ベクトル(長さが1のベクトル)にしておくと定数倍すれば簡単に大きさを変えられる
三角関数は半径1なので、正規化することで式を簡略化できる

なぜ「+1」や「-1」をするのか - Qiita

frag(フラグメントシェーダー)

TRANSFORM_TEXとは

テクスチャのTiling,Offsetなどの設定を反映するもの。

【UnityCG.cginc】
#define TRANSFORM_TEX(tex,name) (tex.xy * name##ST.xy + name##ST.zw)

UNITY_LIGHT_ATTENUATIONとは

ライトの減衰および他のオブジェクトで出来た影を計算している。
ポイントライトやスポットライト、ディレクショナルライトなどで処理が場合分けがされている。
(更に中で呼ばれているUNITY_SHADOW_ATTENUATIONでも場合分けが...解析は保留...)

【AutoLight.cginc】
#ifdef DIRECTIONAL
#define UNITY_LIGHT_ATTENUATION(destName, input, worldPos) fixed destName = UNITY_SHADOW_ATTENUATION(input, worldPos); #endif

Unity で Standard Surface Shader の変換後のコードを追ってみた (Forward) - 凹みTips

saturateとは

0~1の間に下限上限を超えた場合に値を丸める処理。
-0.5なら0に 1.5なら1に。

おわりに

ちょっと取り留めのない感じになっちゃったので、気が向いたらちゃんとまとめるかも?
他にもUnityちゃんシェーダーに機能の追加などを実験していましたが、お仕事に関わるので、ちょっと書けましぇん...
来週辺りからはシェーダー系のまだまとめていない詳細をまとめつつ、ゲーム制作の方に戻っていきたいと思います。

それでは今回はこの辺で
(´・ω・`*)ノシ