はじめに
今回はちゃんとまとめた記事というよりかは、勉強でユニティちゃんシェーダー(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」で作成可能。
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ちゃんシェーダーに機能の追加などを実験していましたが、お仕事に関わるので、ちょっと書けましぇん…
来週辺りからはシェーダー系のまだまとめていない詳細をまとめつつ、ゲーム制作の方に戻っていきたいと思います。
それでは今回はこの辺で
(´・ω・`*)ノシ
コメント