(十五)unity shader之——————使用深度和法线纹理

在之前的文章中讲述的屏幕后处理效果都只是在屏幕颜色图像上进行各种操作来实现的。然而很多时候我们不仅需要当前屏幕的颜色信息,还希望得到深度和法线信息。例如在进行边缘检测时,直接利用颜色信息会使检测到的边缘信息受到物体纹理和光照等外部因素的影响,得到很多我们不需要的边缘点。一种更好的方法是,我们可以在深度纹理和法线纹理上进行边缘检测,这些图像不会受到纹理和光照的影响,而仅仅保存了当前渲染的模型信息,通...
摘要由CSDN通过智能技术生成

在之前的文章中讲述的屏幕后处理效果都只是在屏幕颜色图像上进行各种操作来实现的。然而很多时候我们不仅需要当前屏幕的颜色信息,还希望得到深度和法线信息。例如在进行边缘检测时,直接利用颜色信息会使检测到的边缘信息受到物体纹理和光照等外部因素的影响,得到很多我们不需要的边缘点。一种更好的方法是,我们可以在深度纹理和法线纹理上进行边缘检测,这些图像不会受到纹理和光照的影响,而仅仅保存了当前渲染的模型信息,通过这样的方式检测出来的边缘更加可靠。

下面会学习如何在unity中获取深度纹理和法线纹理来实现特定的屏幕后处理效果。

一、获取深度和法线纹理

1.1 背后原理

深度纹理实际上就是一张渲染纹理,只不过它里面存储的像素值不是颜色值,而是一个高精度的深度值。由于被存储在一张纹理中,深度纹理的深度值范围是[0,1],而且通常是非线性分布的。这些深度值来自于顶点变换后得到的归一化的设备坐标。一个模型想要最终被绘制在屏幕上,需要把它的顶点从模型空间变换到齐次剪裁坐标系下,这是通过在顶点着色器乘以MVP变换矩阵得到的,在变换最后一步,需要使用一个投影矩阵来变换顶点,当我们使用的透视投影类型的摄像机时,这个投影矩阵就是非线性的。

使用正交摄像机时正交投影使用的变化矩阵是线性的。在得到NDC后,深度纹理中的像素值就可以很方便的计算得到了,这些深度值对应了NDC中顶点坐标的z分量的值,由于NDC中z分量的范围在[-1,1],为了让这些值能够存储在一张图像中,我们需要使用下面的公式对其进行映射:

d=0.5*Zndc+0.5

其中,d对应了深度纹理中的像素值,Zndc对应了NDC坐标中的z分量的值。

unity是怎么得到这样一张深度纹理的呢?在unity中,深度纹理可以直接来自于真正的深度缓存,也可以是由一个单独的Pass渲染而得,这取决于使用的渲染路径和硬件。通常讲,当时用延迟渲染路径时,深度纹理理所当然可以访问到,因为延迟渲染会把这些信息渲染到G-buffer中。而当无法直接获取深度缓存时,深度和法线纹理是通过一个单独的Pass渲染而得的。具体实现是,unity会使用着色器替换技术选择那些渲染类型(RenderType标签)为Opaque的物体

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值