shader
要はGPUを用いた3D描画用プログラム
モニターという二次元空間にどのように色付きの点を打つか
マテリアル、テクスチャーをどのように描画するか
マテリアルとはshader、テクスチャ、shader実行時の外部パラメータを1つにまとめたもの
描画というのはモニターの画素に色付きの点を打つこと
ポリゴンの頂点の描画(vertex shader
ポリゴンで作られる面の描画(fragment shader)
GPUによる並列処理になるのも特徴
難しさというかとっつきにくさはこの点が大きいか
そもそも3Dグラフィック処理の仕組み全体が一般的ではないし、簡単ではないということころもあるか
shader lang
tutorial
Rendering Pipline
複数shaderによる一連の処理のフローをrendring piplineと呼ぶ
ゲームエンジン側でこのフロー自体は用意されている
urpはこの処理フロー全体をスクリプトで制御できるようにしたもの ユーザー側はこのフローの中の一部のshader処理を自前の物に書き換えることができる。
https://gyazo.com/72884a7b544c2d25eaebded0b27f4f6b
それぞれの処理のイメージ
https://gyazo.com/d60caf48c535840e5199a87cb119ec34
https://www.youtube.com/watch?v=wUx_Y9BgC7k
shaderの種類
基本は次の二つ
vertex shader
vertexはポリゴンの点の座標情報、法線ベクトル、テクスチャー座標を内包している
歪み効果とかはこのvertex shaderでx,y座標の値をsine波を用いて時間とともに変換している
pixel shader(flagment shader)
色を塗る処理
ピクセルごとのcolor, 深度,alpha channelをコントロールする。
いわゆるシェーダーはこのflagment shaderの処理を指すことも多い
現在はいろいろある
描画手順
3Dモデルを準備
頂点と、面を作るための三角形のポリゴン情報
モデルのトランスフォーム情報を取得
4x4行列として表現
モデル行列と呼ぶ
モデル行列と3Dモデルの各種頂点ポリゴン情報から画面(モニタースクリーン)上の描画する座標位置を計算
画面の二次元空間に描画する際には、裏となる部分は描画しない
隠れるから
各ポリゴン内の描画点を確定
描画点を深度を比較して、すでに描画済みの点が手前にあるなら描画しない
深度とはカメラからの距離
描画点に打つべき色を確定
テクスチャ、ライティング、シャドウ、フォグを考慮
いわゆるシェーダーの仕事はここ。GPU計算もここで使われる
各描画点ごとにシェーダーコードがGPUで並列実行されている
描画点ごとの処理だが用意されたAPIでは隣接する描画点の内容を参照していたりする
実際に点を打つ
半透明処理はBlendで行う、深度バッファ(Zバッファ)もここで更新 まずはZバッファに不透明オブジェクトに記憶して最後に半透明オブジェクトを描画
https://gyazo.com/e29f75ffe7c05e14483d4ee4d035ee86
テクスチャー座標(UV座標)
2Dテクスチャー座標(UV座標)は左上(0,0) - 右下(1,1)の座標系
これはどんなテクスチャーでも必ずこうなる
このテクスチャーを構成するピクセルをテクセルと呼ぶ
実際のテクスチャーマッピングによる描画がやっていることはテクセルをワールド座標系へ転写
(0,0)-(1,1)の座標系をモニターの2D座標系に変換している
mipmap
カメラから遠い場所のテクスチャー描画はどうせよく見えないので元となるテクスチャーの解像度は落として問題ない
事前に複数解像度のテクスチャーを生成して、カメラからの距離によって利用するテクスチャーを切り替える
全体としてのレンダリングコストが押さえられる。
cel-shader
godot4
https://www.youtube.com/watch?v=76x3UNJdUyc&list=PLdR6p8Th9rzdWqGb_5b3qwxtHIgWV7aaw&index=34