頂点シェーダー/フラグメントシェーダー

ライティングを必要としない場合に用いる。あるいは、頂点の情報をダイレクトに扱う低レベルシェーダーを作成する場合にも用いる。Cg/HLSL で記述する。照明あるいは影を扱う場合はサーフェスシェーダーの方が向いている。

参考:

頂点シェーダーとフラグメントシェーダーの記述 | Unity 2018.4 マニュアル [公式]

導入

参考:

Vertex and Fragment Shader Examples のサンプルを試しつつメモ – Qiita

頂点シェーダーとフラグメントシェーダーの例 | Unity マニュアル [公式]

Unlit シェーダー

参考:

Unlit Shader の要素を全て解説 | アマガミナブログ

放出/エミッション (Emission)

参考:

Fragment Shader に Emission を適用する – Qiita

トーンマッピングでオブジェクトを発光させる | Ny Program

シェーダーにエミッションを追加したい – teratail

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)

参考:

カメラから見た深度を描画する | LIGHT11

Unity で Depth をリニアで EXR 形式で出力 | C++ 幼女先輩

No depthtexture on forward rendering when shadows disabled – Unity Forum

ディザリング

参考:

ビルトインのディザ抜き用テクスチャを使ってお手軽ディザ抜き | LIGHT11

ディザ抜きで半透明描画を実現する | LIGHT11

ビルトインのディザ抜き用テクスチャを取得する | LIGHT11

vert_img

フラグメントシェーダーでスクリーン座標及び UV 座標のみしか使用しない場合、UnityCG.cginc で定義されている vert_img が使用できる。

// ... Pass { CGPROGRAM #include "UnityCG.cginc" #pragma vertex vert_img // ... ENDCG } // ...
Code language: Arduino (arduino)

参考:

vert_img を使った 頂点処理の記述を省略したシェーダー | うにてぃブログ

座標変換

インライン関数
  • UnityObjectToClipPos
座標変換行列
  • UNITY_MATRIX_MVP
  • UNITY_MATRIX_MV
  • UNITY_MATRIX_V
  • UNITY_MATRIX_P
  • UNITY_MATRIX_VP

参考:

シェーダで使える定義済値 – Qiita

Unity が勝手にシェーダーコードを書き換える?! | VirtualCast Blog

ビルトインのシェーダー変数 | Unity 2018.4 マニュアル [公式]

サンプラー

変数の宣言
  • UNITY_DECLARE_TEX2Dテクスチャとサンプラーの組を宣言する。
  • UNITY_DECLARE_TEX2D_NOSAMPLERサンプラーなしのテクスチャを宣言する。
  • UNITY_DECLARE_TEX2DARRAYテクスチャ配列とサンプラーを宣言する。
サンプリングの実行
  • UNITY_SAMPLE_TEX2Duv を与えてテクスチャからサンプリングを実行する。
  • UNITY_SAMPLE_TEX2D_SAMPLERサンプラーを使い回してサンプリングを実行する。
  • UNITY_SAMPLE_TEX2DARRAYテクスチャ配列からサンプリングを実行する。
  • UNITY_SAMPLE_TEX2DARRAY_LODミップマップレベルを明示的に指定してテクスチャ配列からサンプリングを実行する。
インラインサンプラーステート
  • テクスチャフィルタリングモード異方性フィルタリングのモードを設定する。
    • Pointポイントサンプリング
    • Linearバイリニアフィルタリング/テクスチャは補間される。
    • Trilinearトリリニアフィルタリング/ミップマップ境界が分からないように補間される。
  • テクスチャラップモードUVW 各軸のラップモードを設定する。
    • Clampクランプ/領域を丸める。テクスチャは打ち切られて延長される。
    • Repeat繰り返し
    • Mirror反転を含めて繰り返す。
    • MirrorOnce反転像を含めるが繰り返さない。
  • 深度比較深度比較用にサンプラーを設定する。
    • Compare

参考:

定義済みシェーダープリプロセッサーマクロ | Unity マニュアル [公式]

サンプラー状態の利用 | 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

互換性

参考:

プラットフォーム特有のレンダリングの違い | Unity 2018.4 マニュアル [公式]

チュートリアル

チュートリアル: 頂点プログラムとフラグメントプログラム | Unity マニュアル [公式]

記事をシェアする:
タグ:

コメントを残す

メールアドレスが公開されることはありません。

Protected by reCAPTCHA