《Unity shader入门精要》复习<第13章 关于NDC坐标和深度/法线纹理>

2023-11-09 16:59

本文主要是介绍《Unity shader入门精要》复习<第13章 关于NDC坐标和深度/法线纹理>,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

NDC(Normalize Device Coordinates)归一化的设备坐标

NDC坐标是模型空间下的坐标通过MVP变换之后再进行归一化得到的归一化的设备坐标。只需要再一步变换就能得到屏幕空间坐标。顺便提一下因为已经归一化了,如果需要从NDC坐标乘以VP的逆矩阵还原成世界坐标,还原后w分量不一定为1,需要注意最后除w分量。

何为线性何为非线性

正交投影得到的深度是线性的,而透视投影得到深度是非线性的。
所谓线性,就是指变化曲线的一阶导数为常量,也就是说变化量是恒定的。既然变换是恒定的,即深度z的采样点在[-1,1]之间均匀分布。
正交投影的裁剪空间变换矩阵并没有变化w的值,而是对xyz进行等量缩放,变化之后z还是均匀变化的,所以为线性。
而透视投影经过裁剪空间变换矩阵后w的值等于-z的值,由于最终归一化z需要除w,所以是和1/z成变化关系,变化量必然不恒定,所以为非线性。

得到相机记录的深度/法线信息

深度纹理和NDC的深度的关系

我们可以调用camera.depthTextureMode |= DepthTextureMode.Depth;
camera.depthTextureMode |= DepthTextureMode.DepthNormals;来得到深度纹理/深度和法线纹理,深度纹理记录的深度对应的是NDC坐标中的z分量。
因为深度纹理的分量取值范围为[0,1],而NDC的分量的取值范围为[-1, 1],两者的关系为
d = Zndc * 0.5 + 0.5

如何得到线性深度

我们前面说到透视投影后得到的深度不是线性的,而Unity给我们提供了相关的api来解析深度为线性深度。

  • LinearEyeDepth(float depth) :还原成视角空间的深度。经过MV还未进行P变化时的空间 ,取值为[near, far],near为近平面的深度,far为远平面的深度。
  • Linear01Depth(float depth):在上一个的基础除以相机远平面far从而缩放为[0, 1]之间。

这里贴一下入门精要里面还原成线性深度的过程
在这里插入图片描述
但是入门精要对于Projection变换矩阵并没有很详细的推理,需要知道矩阵怎么得到应该去看Game101

  • 通过深度纹理获取深度
//在C#代码声明
camera = GetComponent<Camera>();
camera.depthTextureMode |= DepthTextureMode.Depth;//在shader中
//直接在Subshader里面声明
sampler2D _CameraDepthTexture;//获取
float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv);
//视角空间下的深度
LinearEyeDepth(Depth);
//返回范围在[0,1]的线性深度值,也就是上面那个除以Far,因为裁剪空间的Z轴取值为[Near, Far]
Linear01Depth(Depth);
  • 深度和法线纹理获取线性深度和法线方向
    Unity提供了函数DecodeDepthNormal来帮助我们获取深度和法线,这个深度值是范围在[0, 1]的线性深度值(这与单独的深度纹理中存储的深度值不同〉,而得到的法线则是视角空间下的法线方向。
inline void DecodeDepthNormal( float4 enc, out float depth, out float3 normal){depth = DecodeFloatRG (enc.zw);normal= DecodeViewNormalStereo(enc);}
camera.depthTextureMode |= DepthTextureMode.DepthNormals;
//在Subshader中声明
sampler2D __CameraDepthNormalsTexture;//获取[0,1]范围内的线性深度
float depth = DecodeFloatRG(tex2D(_CameraDepthNormalsTexture, i.uv).zw);
//获取法线
fixed3 normal = DecodeViewNormalStereo(tex2D(_CameraDepthNormalsTexture, i.uv).xy);
return fixed4(normal *0.5 + 0.5 ,1.0);

深度纹理和NDC坐标的关系

//取得深度纹理在对应uv下的深度
float d = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv_depth);
float NDC = float4(i.uv.x * 2 - 1, i.uv.y * 2 - 1, d * 2 - 1, 1);

在对应的uv坐标下取得深度纹理的z分量之后,只需要 * 2 - 1就是Zndc。

所以NDC坐标为(i.uv , d * 2 - 1, 1)

而如果需要 还原成线性深度,则d带入LinearEyeDepth / Linear01Depth得到结果

这篇关于《Unity shader入门精要》复习<第13章 关于NDC坐标和深度/法线纹理>的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/377408

相关文章

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

Spring Boot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)

《SpringBoot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)》:本文主要介绍SpringBoot拦截器Interceptor与过滤器Filter深度解析... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实

MyBatis分页插件PageHelper深度解析与实践指南

《MyBatis分页插件PageHelper深度解析与实践指南》在数据库操作中,分页查询是最常见的需求之一,传统的分页方式通常有两种内存分页和SQL分页,MyBatis作为优秀的ORM框架,本身并未提... 目录1. 为什么需要分页插件?2. PageHelper简介3. PageHelper集成与配置3.

Maven 插件配置分层架构深度解析

《Maven插件配置分层架构深度解析》:本文主要介绍Maven插件配置分层架构深度解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Maven 插件配置分层架构深度解析引言:当构建逻辑遇上复杂配置第一章 Maven插件配置的三重境界1.1 插件配置的拓扑

POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能

《POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能》ApachePOI是一个流行的Java库,用于处理MicrosoftOffice格式文件,提供丰富API来创建、读取和修改O... 目录前言:Apache POIEasyPoiEasyExcel一、EasyExcel1.1、核心特性

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis