シェーダメモ
#シェーダ
ShaderLab側
Properties
マテリアルから設定できる値を定義する
_Color("Color", Color) = (1,1,1,1) みたいな感じで書く
書式は name('display name', type) = initialize みたいな感じ
使える型は以下の通り
Range(min, max) Float Int Color(rgba) Vector (4次元固定) 2D (テクスチャなど) Cube 3D
使うときはHLSL側で型宣言する必要がある
fixed4 _Color; みたいな感じで
特別なテクスチャプロパティー
2D型の _MyTexture ("Texture", 2D) = "white" {} は、特殊なプロパティを追加で作れる
sampler2D _MyTexture; テクスチャ本体
float4 _MyTexture_ST; タイリング、オフセット値。x,yがタイリング値、z,wがオフセット値(マテリアル指定値)
float4 _MyTexture_TexelSize; テクスチャサイズ。x,yが1.0/width|height、z,wがwidth|height
Subshader
Tags
Unityに対してレンダリングに関する情報を渡す
Queue : オブジェクトを描画する順番の指示
Background : 最初に描画する
Geometry : デフォルト値
AlphaTest : アルファテストする場合
Transparent : 半透明など、デプスバッファに書き込みしないシェーダー
Overlay : 最後に描画する(ポストエフェクト、レンズフレア)
RenderType わからん。不透明はOpaque、透明はTransparentになってるのをよく見る
Pass
この中にシェーダーとか書く
Pass定義冒頭で、色々指示が書ける
Cull : カリング要否、デフォルトだとポリゴンの裏面は描画されないが、Cull Offを書くと描画されたりする
ZWrite : デプスバッファに書くかどうか
Blend : アルファブレンド時の合成方法
通常合成 Blend SrcAlpha OneMinusSrcAlpha
加算合成 Blend OneMinusDstColor One
乗算合成 Blend DstColor Zero
上記の他、固定関数を使ったシェーダが書ける。
https://docs.unity3d.com/ja/current/Manual/SL-Material.html
なんかBlenderのマテリアル定義みたいな事ができるっぽい
Tags : Pass内でのみ有効なTag。
LightMode : まだよくわからん。ライティングを考慮する場合にForwardBaseにしないといけないらしい
Stencil : ステンシルバッファ操作
この辺参照...
塗ったピクセルをバッファに持ったり、バッファされた領域だけシェーダを動かす、とかが出来る感じ
Name
Passに名前をつける。UsePassで使用する
UVの捉え方
UVを、テクスチャを撮影するカメラの領域と捉える
テクスチャ中心で回転する時は、UVを一度原点位置へ引き込んでから回転行列を適用する
code:texture rotate
uv -= 0.5;
uv.x = cos(_Time.x) - sin(_Time.x);
uv.y = sin(_Time.x) + cos(_Time.x);
uv += 0.5;
UVをスカラ倍するとテクスチャが縮小するのは、カメラ撮影領域が広がるから
1以上の領域に対して、cropするかrepeatするか、テクスチャの設定にもよるけど
MVP変換
モデル変換:ローカル座標→ワールド座標への変換
world_v = mul(UNITY_MATRIX_M, local_v)
ビュー変換:ワールド座標→カメラが原点となる座標への変換
view_v = mul(UNITY_MATRIX_V, world_v)
プロジェクション変換:透視投影になるように歪ませる変換
projection_v = mul(UNITY_MATRIX_P, view_v)
モデル変換後の頂点に変更を加えることで、ワールド空間依存の実装ができる。
ビュー変換後の頂点に変更を加えることで、透視投影を反映した見かけの操作ができる(ビルボード風な表現とか?
プロジェクション変換後の頂点に変更を加えることで、平行投影的な見かけの操作ができる(UI風な?
ライティング
ライティングを考慮したシェーダ
頂点または面の法線とライトの向きのドット積(内積)の値がライトの強さ。みたいな計算(一つのライトのみ対応)
ライトの個数だけ計算が発生するイメージ
板ポリの作り方
Z型に頂点を繋ぐ
triStream.RestartStrip()で次の頂点との接続(辺の生成)を切れるので、必要に応じて使う
ジオメトリシェーダ
ジオメトリシェーダ習作
パーリンノイズ
謎模様ジェネレータ
ディゾルブシェーダ