学习100个Unity Shader (17) --- 深度纹理

效果

在这里插入图片描述

shader部分

Shader "Example/DepthTexture"
{
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            sampler2D _CameraDepthTexture;

            struct a2v
            {
                float4 pos : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 pos : POSITION;
                float2 uv : TEXCOORD0;
            };

            v2f vert (a2v i)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(i.pos);
                o.uv = i.uv;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv);
                depth = Linear01Depth(depth);

                return fixed4(depth, depth, depth, 1);
            }
            ENDCG
        }
    }

    FallBack "Diffuse"
}

C# 部分

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DepthTexture : MonoBehaviour
{
  public Shader depthTextureShader;
  private Material depthTextureMaterial = null;
  public Material material
  {
    get
    {
      depthTextureMaterial = new Material(depthTextureShader);
      return depthTextureMaterial;
    }
  }

  void OnEnable()
  {
    Camera cam = GetComponent<Camera>();
    cam.depthTextureMode |= DepthTextureMode.Depth;
  }

  void OnDisable()
  {
    Camera cam = GetComponent<Camera>();
    cam.depthTextureMode &= ~DepthTextureMode.Depth;
  }

  void OnRenderImage(RenderTexture src, RenderTexture dest)
  {
    if (material != null)
    {
      Graphics.Blit(src, dest, material);
    }
    else
    {
      Graphics.Blit(src, dest);
    }
  }

}

理解

在Unity中,通过摄像机生成一个深度纹理,属于后处理,获取深度纹理通过在C#中cam.depthTextureMode = DepthTextureMode.Depth;实现。在Shader中,通过_CameraDepthTexture访问深度纹理,然后再使用SAMPLE_DEPTH_TEXTURE用当前像素的纹理坐标对深度纹理进行采样。Linear01Depth(i)通过深度纹理 i 给出高精度值时,返回相应的线性深度,范围在 0 到 1 之间。C#脚本需要挂在相机上。

参考

Unity 内置宏
《Unity Shader入门精要》

相关推荐

  1. 学习100Unity Shader (16) --- 程序纹理简述

    2024-05-10 16:44:05       11 阅读
  2. 深度学习面试100题(1-10

    2024-05-10 16:44:05       31 阅读
  3. 深度学习-10-测试

    2024-05-10 16:44:05       8 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-10 16:44:05       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-10 16:44:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-10 16:44:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-10 16:44:05       18 阅读

热门阅读

  1. OceanBase 中的ROWID与Oracle的差异与如何迁移

    2024-05-10 16:44:05       13 阅读
  2. 面试前的刷题,要有充分的准备

    2024-05-10 16:44:05       7 阅读
  3. 【C++ list所有函数举例如何使用】

    2024-05-10 16:44:05       11 阅读
  4. 【AAGNet】GNN模型用于BREP数模分割代码复现笔记

    2024-05-10 16:44:05       12 阅读
  5. 将每个Excel文件的数据量统一减少至120000行

    2024-05-10 16:44:05       13 阅读
  6. 商城数据库88张表DDL(71-88)

    2024-05-10 16:44:05       11 阅读
  7. 典型相关分析模型评价的标准和代码

    2024-05-10 16:44:05       9 阅读