今日まなび(20240829):深度バッファを表示してみる

「今日まなび」は最低1日1h、ゲーム作るために学びたいことなんでもいいから学んでいくコーナー。
完全自分用でまとめることは考えなくてOK.1記事1h。(1hでどんだけ学べるかのスピード感もみていきたいので)
1hのうちに次回学ぶことも決定しておくこと

環境:unity2021.3.40f


今日の学び

深度バッファはカメラからの距離を0~1の範囲で表した値をピクセル単位に定義されている領域というか情報群。
これがあることによってピクセル単位に手前のオブジェクトを判断して手前にあれば描画する、奥なら描画しない(Zテスト)。
といった制御ができるやつだ。

今回はこの深度バッファの値を実際に画面に表示してみる。
深度値を使ってできる表現を学んでいきたいのでその予備ちしき。

light11.hatenadiary.com

  • cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test20240829 : MonoBehaviour
{
    public Material mat;
    void Start()
    {
        GetComponent<Camera>().depthTextureMode |= DepthTextureMode.Depth;

    }

    public void OnRenderImage(RenderTexture source, RenderTexture dest)
    {
        Graphics.Blit(source, dest, mat);
    }
}
  • shader
Shader "Test/20240829"
{
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            sampler2D _CameraDepthTexture;

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                fixed depth = UNITY_SAMPLE_DEPTH(tex2D(_CameraDepthTexture,i.uv));
                depth = Linear01Depth(depth);  //←これいれないとうまく表示できなかった
                return fixed4(depth,depth,depth,1);
            }
            ENDCG
        }
    }
}

なんかかっこいいのができた

今日は時間がもうないので明日深くこのコードを見ていく!

TODO (調べたいこと、やりたいこととか疑問)

・ポストプロセスで例えばモノクロを適応したときに、一部分(例えば特定のキャラの描画だけとか)には適応したくない場合がある。
これまでカメラをわけて対応してきたが1つのカメラでもそういった制御ができる方法はないか
・Unityで深度バッファの値をどうやって取得できる?


・法線マップを扱う
・Unityのシャドウマップってなんだろう
・影を制御したい、動かしたり形を変えたり、色をかえたり


・StandardShaderでできることを把握しておきたい
・名前わすれたけど、プロファイラーのPassごとの描画を調査できるやつの使い方まなびたい
・shaderで図形描いたりするのによく使う関数と使い方まとめ

終わったやつ

・自作shaderを適応したQuadでも影を落としたい