読書ノート UnityShaderProgrammingVol.03 XJINE 著

良く進む。かなり軌道にのっている感触。よい教科書だ

第1章 法線

反射などを考えるには有用そう。


"任意の値を Fragment シェーダに渡すとき、ほとんどの場合に、汎用的な TEXCOO RD を利用します。"大事な気がするのでメモ。シンタックスのない変数は定義できない。(さらにこれができるのもフラグメントシェーダーに渡す変数v2fだけであり、appdataにはあらかじめ用意された変数以外定義できない)


正規化
fixed4(fixed3型変数*0.5+0.5, 1)
など

閑話休題
RendererType
Tag
がわからない。確か描画の順序だったと思う。
そもそもTagのなかでRenderTypeを設定するのだった。構造の理解を誤っていた。

第2章 反射

"Unity におけるシェーダプログラミングでは _WorldSpaceLightPos0.xyz によっ て光源の情報を取得できます。"引用
メモとして少し気になった。

閑話休題
TEXCOORD0とは何だったか?uv座標のようだ。

反射光のベクトルというよりは反射面から見た光源の位置を利用するようだ。すこしややこしい。

重要そうな単語が出てきた。clamp、saturate。単語がわからないと手が出せなくなるのでしっかりメモメモ。

第3章 Flat,Phong,Gouraud

ラスタライズ時の補完の話らしい。ラスタライズは色塗る場所を決めること、ラスタライズの補完は頂点の色塗りを自然にすることでいいかな?
Blenderで見たスムーズシェード、フラットシェードの話のようだ。

第4章 光源の色を考慮したシェーディング

影が真っ黒になるのを防ぐ話のように見えた。

第5章 環境光

2つ方法があるらしい。でもよくわからん。

混乱してきたというか手触りがなく抽象的でふわふわしたイメージになってきた。実践を交えないと曖昧に終わってしまいそうだ。でも1からコーディングするのは疲れるなぁ。

環境光を参照する方法に2種類ある。ひとつはunity_AmbientSky(←これ自体float4型の変数である)。もうひとつはShadeSH9関数である(ShadeSH9(haalf4またはfloatt)←これ自体はfloat3型を返す)。

第6章 複数の光源を用いたライティング

まったくわからん。そもそもライブラリの構文はこれでよいのか?

ここで時間をかけたほうが良いとのこと。あいまいなところを復習しようと思う。いや1から読み直そうか。
キーワード
ifdef
Tag
ライブラリ
shadeSH9

帰ってきた。ForwardBaseは環境光を考えるときの最も基本的なタグである。つまりとりあえず深い意味はなく一番シンプルなものを使っている。環境光を考えますよぐらいの意味だと思う。
ForwardAddはForwardBaseへ追加するもの。←環境光を何度も計算しないという意図もあるようだ。

ブレンドも学びなおしたい。

複数のパスでやるとどうなるんだ?上書きするわけじゃないだろうから一回目の処理がどこかに保存されていそうだが

そうか!”UnityCG.cginc”と"Library.cginc"も多重定義を回避してるんだ!

第7章 点光源

3項演算子って自分は使わないけど何なんだ?
←参考になりそうな記事
・三項演算子の適切な使い方(条件演算子)


オブジェクトのローカル座標をワールド座標に変換する
o.vertexW = mul(unity_ObjectToWorld, v.vertex);
(参考:ほかの関数https://docs.unity3d.com/ja/2018.4/Manual/SL-UnityShaderVariables.html



_WorldSpaceLightPos0.wの値について
←復習時忘れていた

_WorldSpaceLightPos0

ディレクショナルライトとその他のライトで取得できるものが異なります。

ライト値ディレクショナルライトfloat4(ワールド空間の向き, 0)その他のライトfloat4(ワールド空間の位置, 1)

その他のライトの場合は、位置が取得できるので向きベクトルへと変換しています。

(引用元:https://soramamenatan.hatenablog.com/entry/2022/03/24/210618

第8章 スポットライト

そういえばなぜPassが2回に分かれているんだ?

そもそもブレンドとは?
https://docs.unity3d.com/ja/2018.4/Manual/SL-Blend.html  とりまunityのマニュアル。
vol1に説明があった。計算式はSrcColor * SrcFactor + DstColor * DstFactor。(今書き込もうとしている色 × 係数 + 既に書き込まれている色 × 係数)係数のみを記述すればよい例えばBlend One OneであればSrcColor * 1 + DstColor * 1。

appdata_baseをUnityCG.cgincでみると


struct appdata_base {
 float4 vertex : POSITION;
 float3 normal : NORMAL;
 float4 texcoord : TEXCOORD0;
 UNITY_VERTEX_INPUT_INSTANCE_ID
};

unityはどうやってspotlightとpointlightを見分けているんだ?扱いは同じで変数が違うだけか? ← ちょうど9章でそれを解説しているようだ

つっかえ中。かなりややこしいな。
[ExecuteAlays]というのをするとプレイしなくてもstartの関数が呼び出されたりするらしい。

なんでこれだけスクリプトで制御してるんだ???←考えてもわからん…

保留保留全然だめだ

案① これ以降考える必要はないので学習目的で一時的にスクリプトを使っている
案② スポットライトは特殊でスクリプトで制御している
案③ 今日は自分の頭が回っていないだけ

第9章 複数の光源を利用する

環境光は全部(ライブラリ内)に書いてよい。(Base以外では無視されるため)

ここまでベタ打ちしていたattenuationはUNITY_LIGHT_ATTENUATION(attenuation, v2f構造体, v2f構造体.worldPos)使用する際は"AutoLight.cginc"を使うと宣言すること。←attenuationに減衰が格納されている。

法線、光源方向のベクトル、拡散反射、環境光は書かないといけない様子

第10章 phongの反射モデル

少し納得。光の反射ベクトルの単位ベクトルと視線ベクトル(物体から視線に向かうベクトル)の単位ベクトルの内積

第11章 binn-phongの反射モデル

10章phongの反射モデルの改良版


10章11章まとめて全反射の話

第12章

第13章 BRDF

新しく出てきた関数はすべてspecular関連だった。
saturateがよくわからない挙動をする。イメージと違う挙動が多くて悩む。
視線ベクトルもわからん。

第14章 金属反射

lerp( _MainColor, 何か, _Metalness)がやたら多い
フレネル反射のみにかかってくる

_fresnelはなんだ?_routhnessはなんだ? _fresnel * ( 1 - _roughness)は何を表す?
_roughnessが大きい時(_roughness = 1の時)フレネル反射は0 : ざらざらだとフレネル反射がない
_roughnessが小さい時(_roughness = 0の時)フレネル反射は_fresnel : ツルツルだとフレネル反射が大きくなる


第15章 環境マップの映り込み

なんかうまくいかない。

フレネルやmetalicがいまいち理解できていない。UNITY_SAMPLE_TEXCUB E_LOD:反射するテクスチャ。
LODとmipmapってなんだ?

第16章 オクルージョンマップ

今日は集中力が出なかった。

陰影を表現する方法、環境光にのみ作用させるのが自然。

15章の環境マップ映り込みが不安。

模様がついてるだけの気分。テクスチャとあまり差がわからなかった。

第17章 法線マップ

binormalについては初めて知った。

tangent
binormal
normal

第18章

第19章 フォグ

ややこしいのはunityの仕様なので受け入れよとのこと。

texcoordを一つ使うので空けておかねばならない。

雰囲気出る。


編集中のものが消えてしまった。泣き。