UnityのShader基礎に関する簡単な説明とメモ
Surface Shader 関連
↓ 基本的に以下の記事を読みながら、疑問に思った用語を解説しています。
上記の記事を読みながら補足程度に使ってもらえば学習がスムーズに行くかもしれません。
ShaderLab
Unity上でシェーダーを記述する言語
下記のような構造体を指す
Shader "MyShader" {
Properties {
_MyTexture ("My Texture", 2D) = "white" { }
}
SubShader {
}
}
Properties ( プロパティ定義 )
UnityのInspector上に表示される変数
_MyTexture ("My Texture", 2D) = "white"{}
変数名( インスペクター上の表示 , 型 ) = 初期値
_Glossiness - 滑らかさ
_Metalilic - メタリック度
SubShader
シェーダー本体 ( 実際の処理・計算等を行う )
float ( 高精度 )
浮動小数点値。ワールド空間位置、テクスチャ座標、三角法や累乗・べき乗に使用
half ( 中精度 )
浮動小数点値。ショートベクトル、方向、オブジェクト空間位置、HDRカラーに使用
fixed ( 低精度 )
固定小数点数。標準カラーに使用
合成ベクトル / 行列の型
float = 1.0
float2 = (1.0,1.0)
float3 = (1.0,1.0,1.0)
float4 = (1.0,1.0,1.0,1.0)
float4x4 = 4x4変換行列
half4 = (.x, .y, .z, .w)
half4 = (.r, .g, .b, .a)
fixed4 = (1.0,1.0,1.0,1.0)
Surface Shader ( サーフェイスシェーダー )
シェーダーの一種。明るさや影の影響を受けるシェーダー。
Unity標準のシェーダー
Vertex and Fragment Shader ( 頂点・フラグメントシェーダー )
シェーダーの一種。明るさや影の影響を受ないシェーダー。
サーフェイスシェーダーよりも細かく設定することができる上級者向け。
Fixed Function Shader ( 固定関数シェーダー )
シェーダーの一種。古いハードウェアのためのシェーダー。
単純な機能のみ
LOD ( Level Of Detail )
状況に応じてSubShaderを切り替える仕組み
例えば負荷が高い時や、遠くにある物を描画する時に
低負荷処理のSubShaderをスクリプトから適応することができる!
CGPROGRAM ~ ENDCG
シェーダープログラムの「開始位置」と「終了位置」
#paragma surface surf Standard fullforwardshadows
これから使用する処理の宣言
pragma宣言 サーフェスシェーダー使用宣言 関数名 ライティングモデル ランディングモデルオプション
Specular ( スペキュラー )
視点と物体の角度によって光源自身が写り込んでできるハイライト
Standard - 物理法則をベースとしたシェーディング
Lambert - 拡散反射光
入射光と法線で導き出した明るさ。
計算からスペキュラーは無視される(計算されない)ので光沢はない
BlinnPhong - 鏡面反射
物理ベースではないが光が反射する。
Standardの軽量版だが若干リアリティに欠ける。
#pragma target 3.0
これから使用する処理の宣言
pragma宣言 ターゲット宣言 シェーダーモデル
sampler2D - テクスチャの型 ( 2D )
UV座標 - テクスチャ座標
uv_◯◯
uv_MainTexなど 「 uv_ 」 を頭につけることで、自動的にテクスチャ座標設定(TilingとOffset)が
適用されたUV座標が入ってくる
Input - 入力構造体
Unityから送られてくるテスクチャ座標が入った情報。
Albedo ( アルベド ) - 外部からの入射光に対する反射率 (fixed3)
Alpha ( アルファ )- 透過度
Gloss - 鏡面強度
FallBack "Diffuse" - すべり止め
FallBack "すべり止めシェーダー名"
SubShaderが対応していない場合に適応されるシェーダー
Diffuse ( ディフューズ ) - 拡散反射
光を反射する強さ
Ambient ( アンビエント ) - 環境光
反射方向がなく、モデル全体に均等に色を与える。ただし影響は光源からの距離に比例する
Specular ( スペキュラー ) - 鏡面反射
視点と物体の角度によって光源自身が写り込んでできるハイライト(ボンネットとかで光る眩しい部分のやつ)
Normal - 法線
光の反射する角度。
Normal Map - 法線マップ
法線の情報を色情報として書き込んだテクスチャ。
平面であっても法線を工夫することで凹凸を作ったりできる。(ポリゴンの頂点数が減るので負荷を抑えられる)
Emission - 放出
表面から放出するライトの光の色と強さ。
発光している物を表現する時に利用するもの(スマホ画面やブレーキランプなど)
1を超えるとHDRが適応される
HDR (HighDynamic Rage)
人間的に色や光を処理する仕組み
暗いところにある光がより眩しく見えたり、明るすぎる所でも物の判別ができたりする。
通常なら眩しすぎる物があると画面が真っ白になってしまうが、人間の目は発光物以外の物が認識できたりする
UnpackNormal - 法線情報を法線マップから取得する関数
UnityCG.incに定義されている法線情報取得関数
UV ( The base texture coordinates of the mesh )
ポリゴン単位でのテクスチャ画像の任意の位置を貼り付けるもの
Tiling
UV座標を何回繰り返すか
Offset
UV自体の座標を移動するパラメーター
Out
出力するUVの値
RenderQueue - オブジェクトを連打リンスする順番
Vertex / Fragment Shader 関連
#pragma vertex vert
これから使用する処理の宣言
pragma宣言 ヴェール関数使用宣言 関数名
#paragma fragment frag
これから使用する処理の宣言
pragma宣言 フラグメント関数使用宣言 関数名
Vertex
頂点の位置を決める
Fragment
ピクセルに塗る色を決める
appdata
モデルから頂点やUV、法線などの情報などを受け取る
v2f ( vertex to fragment )
vert関数で変換されたappdataの一部の情報が渡ってきます。
ピクセルすべてでこの関数が実行されます。
POSITION - 3D空間の頂点情報
NORMAL - 法線ベクトル
TEXCOORD0,TEXCOORD1,... - テクスチャ座標や位置や方向などの情報
COLOR0,COLOR1,... - 色情報
SV_POSITION - 変換後の頂点情報
SV_TARGET - ピクセルの色情報
SV_TARGET1,SV_TARGET2,... - 他のレンダリング対象に対する色情報
SV_DEPTH - ピクセルの深度情報
UnityObjectToClipPos - 3D空間を2D空間へ変換する関数
Tex2D(_MainTex, i.uv) - UV情報と画像から色情報を取得す関数
セマンティクス
シェーダープログラムの入力や出力の値が、何を意味するかを表すもの。
Cull - ポリゴンのどちら側を描画するか制御
Cull Back : 裏側を描画しない
Cull Front : 表面を描画しない
Cull Off : どちらも描画する
Zwrite - 深度計算した結果を反映するかどうか
ZWrite Off : 反映させない。
ZWrite On : 反映する。デフォルト
ZTest
深度計算の判定基準
ZTest Less : すでに描画されているオブジェクトより近い場合のみクリア!
ZTest Greater : すでに描画されているが前にある場合のみクリア!
ZTest LEqual : すでに描画されているオブジェクト距離が等しいかより近い場合クリア ( デフォルト )
ZTest GEqual : すでに描画されているオブジェクトが前にある場合か完全に重なっている場合クリア
ZTest Equal : 完全に重なっているときのみクリア
ZTest NotEqual : 完全に重なっているとき以外クリア
ZTest Always : 常にクリア
#pragmaのalphaオプジョン
#pragma surface surf Standard alpha
alpha : 透過部分を存在しているように見せる
alpha:auto : alphaと同じ
alpha:blend : アルファブレンディングを可能にする
alpha:fade : 透過部分を存在していないように見せる
alpha:premul : プレマルチプライドアルファ透明度を可能にする
alpha:VariableName : アルファカットアウト透明度を有効にする
worldNormal - 法線ベクトル
表面に対して垂直方向のベクトル
viewDir - 視線ベクトル
カメラが向いている方向のベクトル
screenPos - スクリーンベクトル
画面上のベクトル float2