Unityでのシェーダー
シェーダを書けるプログラマになろう \#1 シェーダを理解しよう - Unity道場2019 2月
https://www.youtube.com/watch?v=wUx_Y9BgC7k
シェーダを書けるプログラマになろう \#2 GPUの神秘 - Unity道場2019 2月
https://www.youtube.com/watch?v=-Ki1Q2CAqEc
まずは3Dモデルからきちんと学ぶ必要がある
頂点列
頂点座標
法線
UV
テクスチャ座標
三角形列
頂点3つで面が作られるので、それの組み合わせ
描画処理
頂点ごとに描画位置を算出
頂点シェーダーの仕事
Transform の状態をモデル行列にして計算に用いる
$ \begin{pmatrix} 1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}
3x3の部分がRotationとScale、その隣の1x3がPositionを表す
一番下の列は固定
なにも変化しなければただの単位行列だね
裏表を決めて、裏なら描画しない
右回り、左回りで決める
設定で変更可
描画点を確定
これは機械的に行われる
深度バッファと比較
設定で変更可
描画点の色を確定する
フラグメントシェーダーの仕事
テクスチャ、ライティング、シャドウ、フォグによって影響を受ける
点を打つ
ブレンド関数使用可
深度バッファを更新
設定で変更可
テクセル
テクスチャのある点の色
ミップマップ
テクスチャインポート時に高度な縮小を作成してくれる
できないこと
線分を書く
半透明をプログラマブルにやる
ちなみに半透明の処理は色々と面倒な部分があり、現代の解決策としてすべての半透明の描画は不透明の描画の後に実行するようになっている
サーフェイスシェーダー
Unity が提供するやつ
頂点シェーダーはだいたい同じことを書くのでそれを勝手に生成してくれる
フラグメントシェーダーはだいたい複雑になりがちなのでそれを楽な記述で書けるようにしてくれる