シェーダメモ
_Color("Color", Color) = (1,1,1,1) みたいな感じで書く
書式は name('display name', type) = initialize みたいな感じ
使える型は以下の通り
Range(min, max) Float Int Color(rgba) Vector (4次元固定) 2D (テクスチャなど) Cube 3D
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
Unityに対してレンダリングに関する情報を渡す
Queue : オブジェクトを描画する順番の指示
Background : 最初に描画する
Geometry : デフォルト値
AlphaTest : アルファテストする場合
Transparent : 半透明など、デプスバッファに書き込みしないシェーダー
Overlay : 最後に描画する(ポストエフェクト、レンズフレア)
RenderType わからん。不透明はOpaque、透明はTransparentになってるのをよく見る この中にシェーダーとか書く
Pass定義冒頭で、色々指示が書ける
Cull : カリング要否、デフォルトだとポリゴンの裏面は描画されないが、Cull Offを書くと描画されたりする ZWrite : デプスバッファに書くかどうか
通常合成 Blend SrcAlpha OneMinusSrcAlpha
加算合成 Blend OneMinusDstColor One
乗算合成 Blend DstColor Zero
上記の他、固定関数を使ったシェーダが書ける。
なんかBlenderのマテリアル定義みたいな事ができるっぽい
LightMode : まだよくわからん。ライティングを考慮する場合にForwardBaseにしないといけないらしい 塗ったピクセルをバッファに持ったり、バッファされた領域だけシェーダを動かす、とかが出来る感じ
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するか、テクスチャの設定にもよるけど
モデル変換:ローカル座標→ワールド座標への変換
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()で次の頂点との接続(辺の生成)を切れるので、必要に応じて使う