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

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

参考:

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

導入

参考:

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

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

Unlit シェーダー

参考:

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

カメラ深度を描画する

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
}

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);
    }
}

参考:

カメラから見た深度を描画する | 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
    }
// ...

参考:

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_TEX2D
  • UNITY_SAMPLE_TEX2D_SAMPLER
  • UNITY_SAMPLE_TEX2DARRAY
  • UNITY_SAMPLE_TEX2DARRAY_LOD

参考:

定義済みシェーダープリプロセッサーマクロ | 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 マニュアル [公式]

タグ:

コメントを残す

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