Unity中Shader的Reversed-Z(DirectX平台)

文章目录

  • 前言
  • 一、在对裁剪坐标归一化设置NDC时,DirectX平台Z的特殊
  • 二、在图形计算器中,看一下Z值反转前后变化
    • 1、在图形计算器创建两个变量 n 和 f 分别 控制近裁剪面 和 远裁剪面
    • 2、带入公式得到齐次裁剪空间下Z值
    • 3、进行透视除法
    • 4、用 1 - Z 得出Z值反转前的函数图形
    • 5、进行Z值反转的原因
    • 在这里插入图片描述
  • 三、为什么浮点值计算会存在误差


前言

在之前推导正交相机 或 透视相机 到 裁剪空间的矩阵的归一化设置坐标NDC时。我们在DirectX平台下,都进行了Z值的反转。


一、在对裁剪坐标归一化设置NDC时,DirectX平台Z的特殊

  • 在OpenGL下,我们归一化设置的Z坐标在归一化后范围为[-1,1]

  • 在DirectX下,我们归一化设置的Z坐标在归一化后范围为应该为[0,1]

  • 但是,却使用了Reversed-Z对Z值进行了反转[1,0]

  • DirectX下进行了反转后的矩阵
    [ 2 n w 0 0 0 0 2 n h 0 0 0 0 n f − n n f f − n 0 0 − 1 0 ] \begin{bmatrix} \frac{2n}{w} & 0 & 0 & 0 \\ 0 & \frac{2n}{h} & 0 &0\\ 0 & 0 & \frac{n}{f-n} &\frac{nf}{f-n}\\ 0 & 0 & -1 & 0\\ \end{bmatrix} w2n0000h2n0000fnn100fnnf0


二、在图形计算器中,看一下Z值反转前后变化

[ 2 n w 0 0 0 0 2 n h 0 0 0 0 n f − n n f f − n 0 0 − 1 0 ] ⋅ [ x v y v z v 1 ] \begin{bmatrix} \frac{2n}{w} & 0 & 0 & 0 \\ 0 & \frac{2n}{h} & 0 &0\\ 0 & 0 & \frac{n}{f-n} &\frac{nf}{f-n}\\ 0 & 0 & -1 & 0\\ \end{bmatrix} · \begin{bmatrix} x_v\\ y_v\\ z_v\\ 1\\ \end{bmatrix} w2n0000h2n0000fnn100fnnf0 xvyvzv1

  • Z值公式 = n f − n z v + n f f − n \frac{n}{f-n}z_v+\frac{nf}{f-n} fnnzv+fnnf

1、在图形计算器创建两个变量 n 和 f 分别 控制近裁剪面 和 远裁剪面

在这里插入图片描述

2、带入公式得到齐次裁剪空间下Z值

在这里插入图片描述

3、进行透视除法

在这里插入图片描述

4、用 1 - Z 得出Z值反转前的函数图形

在这里插入图片描述

5、进行Z值反转的原因

在进行计算时,浮点值 在十进制 和 二进制 之间转化计算会造成误差
从而导致结果不是我们想要的结果。

  • 在Z值反转前的函数中,可以看出我们函数在[0,0.1]之间斜率很大,导致在这 1 10 \frac{1}{10} 101 定义域中,对计算前的Zv精度要求越低。
  • 但是,在其余的(0.1,1]之间斜率太小,导致在 9 10 \frac{9}{10} 109 定义域中,对计算前的 Zv精度要求越高。

这与我们实际需要的效果不符合
应该在离摄像机近时,精度高一点
离摄像机远时,精度低一点

在这里插入图片描述

  • 所以,有了Z值的反转

在这里插入图片描述

三、为什么浮点值计算会存在误差

在我们的计算机中,我们的计算最后都会转化为二进制。

在我们的寄存器存储小数时,会把十进制小数转化到二进制中 ,存储不下的、靠右的部分舍弃,以保证我们的计算能够正常运行

  • 小数的十进制转二进制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/593141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS+QT五子棋游戏开发

1、首先安装好VS软件和QT库,将其配置好,具体不在此展开说明。 2、文件结构如下图: 3、绘制棋盘代码,如下: void Qwzq::paintEvent(QPaintEvent* event) {QPainter painter(this);painter.setRenderHint(QPainter::An…

【响应式编程-01】Lambda表达式初体验

一、简要描述 Lambda初体验Lambda表达式的语法格式Lambda表达式应用举例Lambda表达式底层实现 二、什么是Lambda表达式 Java8新特性,来源于数学中的λ[l:mdə]演算 是一套关于函数(f(x))定义、输入量、输出量的计算方案 Lambda表达式 -> 函数 使代码变得简洁…

维生素B5和琥珀酰辅酶A可以改善SF3B1基因突变引起无效造血过程

今天给同学们分享一篇实验文章“Vitamin B5 and succinyl-CoA improve ineffective erythropoiesis in SF3B1-mutated myelodysplasia”,这篇文章发表在Sci Transl Med期刊上,影响因子为17.1。 结果解读: SF3B1突变导致MDS-RS患者COASY异构体…

短视频账号矩阵系统源码/技术交付3年开发源头

账号矩阵3年技术独立开发打造是一个非常有挑战性和前景的项目。以下是一些建议,帮助你成功打造一个成功的短视频账号矩阵: 1. 确定目标受众:首先需要明确你的目标受众是谁,了解他们的兴趣爱好、年龄、性别等,以便为他们…

八大算法排序@选择排序(C语言版本)

目录 选择排序概念算法思想示例步骤1步骤2步骤...n最后一步 代码实现时间复杂度空间复杂度特性总结 选择排序 概念 选择排序(Selection Sort)是一种简单直观的排序算法。基本思想是在未排序的序列中找到最小(或最大)元素&#xf…

RS485数据采集模块,如何一次采集多个modbus设备数据?

在工业数据采集中,RS485是一种常见的数据通信协议,而Modbus则是其上的常用设备协议。那么,如何用一个模块高效采集多个Modbus设备的数据呢?这就是我们今天要探讨的话题! 什么是RS485数据采集模块? 首先&a…

ALSA学习(5)——设备中的alsa

参考博客: https://blog.csdn.net/DroidPhone/article/details/7165482 (一下内容基本是原博主的博客转载) 文章目录 一、ASOC的由来二、硬件架构三、软件架构四、数据结构五、内核对ASoC的改进 一、ASOC的由来 ASoC–ALSA System on Chip …

CMake入门教程【基础篇】在Windows、Linux上安装CMake

文章目录 1.windows平台第1步:下载CMake第2步:安装CMake第3步:验证安装第4步:初次使用第5步:构建和运行 2.Linux平台2.1 使用包管理器安装2.2 使用预编译的二进制文件2.3 从源代码编译2.4注意事项 1.windows平台 第1步…

数据库中二进制数据图片的读取并存储为文件C++

插入二进制数据https://blog.csdn.net/wjl990316fddwjl/article/details/135334950我们需要将插入的数据进行读取,本文主要介绍如何C如何将数据库中二进制数据图片进行读取和存储 1、查询数据 sql"select * from t_data"; 2、获得查询结果 MYSQL_RES …

IF;10.0+,中科院1区TOP,Elsevier出版社,发文量大!毕业首选!

【SciencePub学术】本期,小编给大家推荐的是一本Elsevier旗下、工程技术领域、影响因子为10.0的中科院1区TOP。其详情如下: 期刊简介 ENERGY CONVERSION AND MANAGEMENT ISSN:0196-8904 E-ISSN:1879-2227 IF(2…

软件测试行业最核心的竞争力是什么?

在当今数字化时代,软件测试行业已成为科技领域不可或缺的一环。软件测试人员扮演着保障产品质量和用户满意度的重要角色。然而,随着行业的竞争日益激烈,如何保持竞争力成为软件测试人员必须思考的问题。 为了弄清楚这个问题,我和…

数据库进阶教学——主从复制(Ubuntu22.04主+Win10从)

目录 一、概述 二、原理 三、搭建 1、备份数据 2、主库配置Ubuntu22.04 2.1、设置阿里云服务器安全组 2.2、修改配置文件 /etc/my.cnf 2.3、重启MySQL服务 2.4、登录mysql,创建远程连接的账号,并授予主从复制权限 2.5、通过指令,查…

mysql 条件位运算实现多值存储

一、多值存储 mysql 条件位运算位运算实现多值存储,方法适合数据范围有限,且不会变更在业务上往往会出现多选的情况,例:选择 周一 至 周日 随意组合; 数据在设计时就会如何去储存? 一种是一般是在储存是以…

阶段五-JavaWeb综合练习-学生管理系统

一.项目说明 1.前台 (用户使用) 前端,后端 2.后台 (管理员使用) 前端,后端 3.该项目为后台管理系统 项目开发流程: 1.需求分析 1.1 登录功能 用户访问登录页面输入用户名和密码,并且输入验证码。全部输入正确后点击登录,登录成功跳转主页面;登录…

清风数学建模笔记-因子分析

内容:因子分析 概念: 通过分析研究变量间的相关系数矩阵,把这些变量间错综复杂的关系归结成少数几个综合因子,由于归结出的因子个数少于原始变量的个数,但是又包含原始变量的信息,所以这一过程也称之为降…

清风数学建模-数学规划模型

内容:数学规划模型(cab aeqbeq lbub) 一.题型类型 1.线性规划linprog 2.非线性规划 fmincon 3.整数规划 intlinprog 4.(0-1规划)(特殊的线性整数规划)intlinprog 5.多目标规划 linprog 标…

STM32 ESP8266 物联网智能温室大棚 (附源码 PCB 原理图 设计文档)

资料下载: https://download.csdn.net/download/vvoennvv/88680924 一、概述 本系统以STM32F103C8T6单片机为主控芯片,采用相关传感器构建系统硬件电路。其中使用DHT11温湿度传感器对温度和湿度的采集,MQ-7一氧化碳传感器检测CO浓度,GP2Y101…

设计模式:简单工厂模式、工厂方法模式、抽象工厂模式

简单工厂模式、工厂方法模式、抽象工厂模式 1. 为什么需要工厂模式?2. 简单工厂模式2.1. 定义2.2. 代码实现2.3. 优点2.4. 缺点2.5. 适用场景 3. 工厂方法模式3.1. 有了简单工厂模式为什么还需要有工厂方法模式?3.2. 定义3.3. 代码实现3.4. 主要优点3.5.…

深入数组扩展应用

一、字符串反转 例如:‘123abc’----->‘cba321’ 字符串方法实现: var str 123abcvar reversFn function(str) {var newStr for (var i str.length - 1; i > 0; i--) {newStr str[i]}return newStr }console.log(reversFn(str));数组方法实现&#xf…

Elasticsearch:如何使用 Elasticsearch 进行排序

虽然你在唱这首歌时可能会想象圣诞老人,但欧洲民间传说,尤其是阿尔卑斯地区的民间传说,有两个传奇人物圣尼古拉斯和坎普斯。 象征着慷慨和善良的圣尼古拉斯,在 12 月 6 日 为乖巧的孩子们带来礼物和欢乐! 相比之下&…