深度图

  • 深度图原理
    • 深度重建
    • 深度写入
    • 一些遇到的坑

深度图原理

移步:深度测试,这篇文章讲了深度图的概念。

深度重建

深度图是经过NDC坐标空间后渲染出来的,深度存储时不是线性的,因此需要进行重建。幸运的是,Unity3D ShaderLab中提供了这个函数接口。

// vert
o.vertex = UnityObjectToClipPos(v.vertex); // mvp变换
o.screenPos = ComputeScreenPos(o.vertex);  // 获取屏幕空间坐标
o.uv = v.uv;                               // uv
COMPUTE_EYEDEPTH(o.screenPos.z);            // 获取模型在View空间的z// frag
float depth = SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.screenPos));   // 线性深度值
float screenZ = LinearEyeDepth(depth);         // View空间下的深度值
float depth01 = Linear01Depth(depth);          // 归一到0-1的深度值
// 顶点重建
float4 H = float4(i.uv.x * 2 - 1, i.uv.y * 2 - 1, depth01 * 2 - 1, 1); // dnc 坐标系下的 x y z
float4 D = mul(_CurrentInverseVP, H);                                  // 重建世界坐标点
float4 W = D / D.w;                                                        // 透视逆变换, 需要将xyz/w进行归一

深度写入

注意:RenderQueue <= 2450

Pass {Name "ShadowCaster"Tags { "LightMode" = "ShadowCaster" }ZWrite On ZTest LEqual Cull OffCGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 2.0#pragma multi_compile_shadowcaster#include "UnityCG.cginc"struct v2f {V2F_SHADOW_CASTER;UNITY_VERTEX_OUTPUT_STEREO};v2f vert(appdata_base v){v2f o;UNITY_SETUP_INSTANCE_ID(v);UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)return o;}float4 frag(v2f i) : SV_Target{SHADOW_CASTER_FRAGMENT(i)}ENDCG
}

一些遇到的坑

  1. 深度图 != 深度缓冲,深度图和深度缓存不同,zwrite off可以关闭写入深度缓存,但还会写入深度图。_CameraDepthTexture本身是渲染得到的屏幕纹理,和zwrite并没有直接联系

Unity3D 深度图相关推荐

  1. Unity3D ShaderLab 内发光防护罩

    内发光防护罩 内发光防护罩 思路 内轮廓发光效果 相交效果 缺陷 内轮廓发光缺陷 缺陷解决方案 相交效果缺陷 缺陷解决方案 实现 效果 内发光防护罩 1.利用模型法线和视角方向得到内轮廓发光效果. 2 ...

  2. unity3d软阴影和硬阴影的原理_Unity3D中两种默认阴影的实现

    Unity3D中两种阴影的实现 传统的ShadowMap ShadowMap说起来十分简单,把摄像机和光源的位置重叠,那么场景中该光源的阴影区域就是那些摄像机看不到的地方,主要应用在前向渲染路径中. ...

  3. unity3d 求两个点长度_Unity3D实现体积光

    体积光是现实中常见的因丁达尔效应而产生的一种大气现象,文人墨客常用"慵懒的阳光泄下"描绘该现象带来的美感.笔者在一次旅游后见到了这种神奇的自然现象,遂决定在游戏中实现并使用这样的效 ...

  4. 【Unity3d Shader】景深效果

    摄影常用的一招就是背景虚化,背景虚化的相片可以突出拍摄主题,强调自己要展现的事物. 摄影技巧为:1,开大光圈:2,拉长焦距:3,主体离镜头近:4,背景离主体远 有了背景虚化,照片会变的有艺术感见下图( ...

  5. 不能直接获取?聊聊如何在Shader Graph中获取深度图

    0x00 前言 在这篇文章中,我们选择了过去几周Unity官方社区交流群以及UUG社区群中比较有代表性的几个问题,总结在这里和大家进行分享.主要涵盖了** StreamingAssets.Profil ...

  6. (八)unity自带的着色器源码剖析之——————Unity3D的全局光照和阴影:下篇(unity3D中的球谐光照和SH球谐函数、unity实时阴影抗锯齿解决方案)

    一.探针基于球谐函数的全局光照 球谐光照是基于预计算辐射度传输理论实现的一种实时渲染技术.预计算辐射度传输技术能够重现在区域面光源照射下的全局照明效果.这种技术通过在运行前对场景中光线的相互作用进行预 ...

  7. kinect linux 深度处理,kinect彩色图和深度图对齐(一)

    本文主要记录kinect相关的知识和对齐方法,这是第一部分,此记. 深度相机成像方法简介 深度相机就是可以获取场景中物体距离摄像头物理距离的相机.深度相机通常由多种镜头和光学传感器组成,根据测量原理不 ...

  8. 神奇的深度图:复杂的效果,不复杂的原理

    神奇的深度图:复杂的效果,不复杂的原理 0x00 前言 本文是<有趣的深度图>的第二篇文章,上一篇文章<有趣的深度图:可见性问题的解法>中已经和大家介绍了深度图在解决可见性问题 ...

  9. Unity3D 阴影和深度纹理总结

    首先介绍一下,阴影的生成,阴影一般是在屏幕空间生成的,利用Unity3D引擎实现阴影的绘制,首先要明白其实现原理,Unity5的Demo已经为我们提供了代码实现,先介绍一下阴影的视线原理: 屏幕空间的 ...

最新文章

  1. 这些编程语言程序员工资最高!Java才第四
  2. Facebook的首席技术官:人工智能已用于内容审核,未来会做更多
  3. Python的初级语法
  4. 前端学习(2180):vue-router全局导航守卫
  5. BZOJ 4415 洛谷 3988 [Shoi2013]发牌
  6. Extjs textfield keyup事件
  7. Boss说:你要是能搞懂这六个分布式技术栈,我给你薪资翻倍
  8. 向前差分格式 matlab,热传导方程向前差分格式的matlab程序
  9. 斯特陵往事(转自清韵论坛 冯·迪特里施专栏)
  10. 微信小程序--加载动画【水波涟漪效果】
  11. java对象转excel_Java中excel与对象的互相转换的通用工具类编写与使用(基于apache-poi-ooxml)...
  12. 平板电脑出现计算机错误,苹果平板电脑显示iPad已停用连接iTunes怎么办
  13. PoW 、PoS , DPoS 算法
  14. ModuleNotFoundError: No module named ‘tensorflow.compat.v2‘解决方法
  15. git错误 You are not currently on a branch的解决办法
  16. 【必读】C语言基础知识大全
  17. springboot注解 + mybatisplus拦截器实现数据权限拦截(兼容分页插件)
  18. [OpenGL - 游戏开发] 仿制《Minecraft/我的世界》 - 总结及演示程序
  19. python找1000以内的完数_Python编程题3--找出1000以内的完全数
  20. c语言定时开关程序,C语言写的简单的定时关机程序

热门文章

  1. NYOJ 79 拦截导弹
  2. eayUi panel实现上一页下一页
  3. 在CentOS上安装和配置Guacamole
  4. P3375 【模板】KMP字符串匹配 (KMP模板)
  5. 整体C#与Sql培训内容及结构
  6. c#NPOI导出2007版本excel
  7. Spring入门hello world常见问题及解决办法
  8. PHP漏洞之session会话劫持
  9. 电信系统方案 电信综合营帐系统
  10. 转载:一文带你入门统计学(附资源)