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

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

ドキュメント:

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

導入

ドキュメント:

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

参考:

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

Phong 反射モデルの実装 | えれめん

頂点データ

ドキュメント:

頂点プログラムへ頂点データの流し込み | 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

        // 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 マニュアル [公式]

参考:

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

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 マニュアル [公式]

シェーダーでのテクスチャ配列の使用 | 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 マニュアル [公式]

チュートリアル

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

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Protected by reCAPTCHA