頂点シェーダー/フラグメントシェーダー
ライティングを必要としない場合に用いる。あるいは、頂点の情報をダイレクトに扱う低レベルシェーダーを作成する場合にも用いる。Cg/HLSL で記述する。照明あるいは影を扱う場合はサーフェスシェーダーの方が向いている。
ドキュメント:
頂点シェーダーとフラグメントシェーダーの記述 | Unity 2018.4 マニュアル [公式]
導入
ドキュメント:
頂点シェーダーとフラグメントシェーダーの例 | Unity マニュアル [公式]
参考:
Vertex and Fragment Shader Examples のサンプルを試しつつメモ – Qiita
頂点データ
ドキュメント:
頂点プログラムへ頂点データの流し込み | Unity マニュアル [公式]
非照明シェーダー (Unlit)
参考:
Unlit Shader の要素を全て解説 | アマガミナブログ
放出/エミッション (Emission)
参考:
Fragment Shader に Emission を適用する – Qiita
トーンマッピングでオブジェクトを発光させる | Ny Program
How to add emission map to this shader – Unity Forum
カメラ深度を描画する
Depth.shader
を作成する。
Shader "Custom/Depth"
{
CGINCLUDE
#include "UnityCG.cginc"
UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);
half4 frag(v2f_img i) : SV_TARGET
{
half4 depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv);
return Linear01Depth(depth);
}
ENDCG
SubShader
{
Tags { "RenderType"="Opaque" "RenderType" = "Opaque" }
Cull Off
ZTest Always
ZWrite Off
Pass
{
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
ENDCG
}
}
FallBack Off
}
Code language: Arduino (arduino)
CameraDepth.cs
を作成して、カメラにコンポーネントとして追加し、Custom/Depth
シェーダーを割り当てる。
using UnityEngine;
[ExecuteAlways]
[RequireComponent(typeof(Camera))]
public class CameraDepth : MonoBehaviour
{
public Shader _shader;
private Material _material;
void Awake()
{
GetComponent<Camera>().depthTextureMode |= DepthTextureMode.Depth;
}
private void OnEnable()
{
_material = new Material(_shader);
}
private void OnRenderImage(RenderTexture source, RenderTexture dest)
{
Graphics.Blit(source, dest, _material);
}
}
Code language: C# (cs)
参考:
Unity で Depth をリニアで EXR 形式で出力 | C++ 幼女先輩
No depthtexture on forward rendering when shadows disabled – Unity Forum
ディザリング
参考:
ビルトインのディザ抜き用テクスチャを使ってお手軽ディザ抜き | LIGHT11
ビルトインのディザ抜き用テクスチャを取得する | LIGHT11
vert_img
フラグメントシェーダーでスクリーン座標及び UV 座標のみしか使用しない場合、UnityCG.cginc
で定義されている vert_img
が使用できる。
// ...
Pass
{
CGPROGRAM
#include "UnityCG.cginc"
#pragma vertex vert_img
// shader codes here
ENDCG
}
// ...
Code language: Arduino (arduino)
参考:
vert_img を使った 頂点処理の記述を省略したシェーダー | うにてぃブログ
座標変換
インライン関数
UnityObjectToClipPos
座標変換行列
UNITY_MATRIX_MVP
UNITY_MATRIX_MV
UNITY_MATRIX_V
UNITY_MATRIX_P
UNITY_MATRIX_VP
ドキュメント:
ビルトインのシェーダー変数 | Unity マニュアル [公式]
参考:
Unity が勝手にシェーダーコードを書き換える?! | VirtualCast Blog
サンプラー
変数の宣言
UNITY_DECLARE_TEX2D
: テクスチャとサンプラーの組を宣言する。UNITY_DECLARE_TEX2D_NOSAMPLER
: サンプラーなしのテクスチャを宣言する。UNITY_DECLARE_TEX2DARRAY
: テクスチャ配列とサンプラーを宣言する。
サンプリングの実行
UNITY_SAMPLE_TEX2D
:uv
を与えてテクスチャからサンプリングを実行する。UNITY_SAMPLE_TEX2D_SAMPLER
: サンプラーを使い回してサンプリングを実行する。UNITY_SAMPLE_TEX2DARRAY
: テクスチャ配列からサンプリングを実行する。UNITY_SAMPLE_TEX2DARRAY_LOD
: ミップマップレベルを明示的に指定してテクスチャ配列からサンプリングを実行する。
インラインサンプラーステート
- テクスチャフィルタリングモード:異方性フィルタリングのモードを設定する。
Point
: ポイントサンプリングLinear
: バイリニアフィルタリング/テクスチャは補間される。Trilinear
: トリリニアフィルタリング/ミップマップ境界が分からないように補間される。
- テクスチャラップモード:UVW 各軸のラップモードを設定する。
Clamp
: クランプ/領域を丸める。テクスチャは打ち切られて延長される。Repeat
: 繰り返しMirror
: 反転を含めて繰り返す。MirrorOnce
: 反転像を含めるが繰り返さない。
- 深度比較: 深度比較用にサンプラーを設定する。
Compare
ドキュメント:
定義済みシェーダープリプロセッサーマクロ | Unity マニュアル [公式]
シェーダーでのテクスチャ配列の使用 | Unity マニュアル [公式]
MultiplyUV
UV 座標変換行列
UNITY_MATRIX_TEXTURE0
UNITY_MATRIX_TEXTURE1
UNITY_MATRIX_TEXTURE2
UNITY_MATRIX_TEXTURE3
参考:
What is the function MultiplyUV() in shader? – Unity Answers
ライティングを適用する
参考:
Vertex / Fragment Shader で通常のライティングとシャドウを適用するサンプル – Qiita
Unity で複数ライトによるライティングを行う方法 – Qiita
ジオメトリシェーダー
参考:
Geometry Shader 基礎 #1 | 知識 0 からの Unity Shader 勉強
Geometry Shader 基礎 #2 | 知識 0 からの Unity Shader 勉強
破壊/分解/消滅
参考:
ポリゴン分解シェーダー | 知識 0 からの Unity Shader 勉強
互換性
ドキュメント:
様々なグラフィックス API のシェーダーの作成 | Unity 2021.3 マニュアル [公式]