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值的反转

在这里插入图片描述

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

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

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

  • 小数的十进制转二进制

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker小白第十一天

docker小白第十一天 dockerfile分析 Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。即构建新镜像时会用到。 构建三步骤:编写dockerfile文件-docker build命令构建镜像-docker run镜像 运行容器实例。即一…

TB-C/C++

1.main函数之前之后执行的代码 设置栈指针初始化静态变量和全局变量(.data段内容,已初始化且不为0)赋初值(.bss段内容,未初始化的全局变量和静态变量)传参(argc,argv)atexit() 在…

C++-类和对象(2)

1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下 6 个默认成员 函数。 默认成员函数:用户没有显式实现,编译…

13个干货议题!拓数派携众多大咖共话国产数据库未来趋势

1月6日下午,由拓数派、PolarDB 开源社区、PostgreSQL 中文社区共同主办的《国产数据库共话未来趋势》技术沙龙将在上海举行。 本次沙龙现场大咖云集,来自拓数派、阿里云、平安科技等公司的众多行业技术大咖将与大家面对面交流,与广大技术爱好…

MySQL中的六种日志你都懂么?不懂!那就必须看看

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

【Linux】深度解剖环境变量

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:熟悉并掌握Linux的环境变量。 > 毒鸡汤&#x…

基于SSM的滁艺咖啡在线销售系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

基于果蝇算法优化的Elman神经网络数据预测 - 附代码

基于果蝇算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于果蝇算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于果蝇优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要:针…

CSS 中间位置翻转动画

<template><div class"container" mouseenter"startAnimation" mouseleave"stopAnimation"><!-- 旋方块 --><div class"box" :class"{ rotate-hor-center: isAnimating }"><!-- 元素内容 -->…

Unity之ShaderGraph如何实现瓶装水效果

前言 有一个场景在做效果时,有一个水瓶放到桌子上的设定,但是模型只做了个水瓶,里面是空的,所以我就想办法,如何做出来瓶中液体的效果,最好是能跟随瓶子有液体流动的效果。 如下图所示: 水面实现 水面效果 液体颜色设置 因为液体有边缘颜色和内里面颜色,所以要分开…

【vue】Easy Player实现视频播放:

文章目录 一、效果&#xff1a;二、文档&#xff1a;三、实现&#xff1a;【1】安装插件&#xff1a;【2】引入js文件&#xff1a;【3】使用&#xff1a; 四、方法&#xff1a; 一、效果&#xff1a; 二、文档&#xff1a; GitCode - EasyPlayer.js npm-easydarwin/easyplayer…

FairGuard游戏加固产品常见问题解答

针对日常对接中&#xff0c;各位用户对FairGuard游戏加固方案在安全性、稳定性、易用性、接入流程等方面的关注&#xff0c;我们梳理了相关问题与解答&#xff0c;希望可以让您对产品有一个初步的认知与认可。 Q1:FairGuard游戏加固产品都有哪些功能? A&#xff1a;FairGuar…

贝叶斯推断:细谈贝叶斯变分和贝叶斯网络

1. 贝叶斯推断 统计推断这件事大家并不陌生&#xff0c;如果有一些采样数据&#xff0c;我们就可以去建立模型&#xff0c;建立模型之后&#xff0c;我们通过对这个模型的分析会得到一些结论&#xff0c;不管我们得到的结论是什么样的结论&#xff0c;我们都可以称之为是某种推…

Linux 485驱动通信异常

背景 前段时间接到一个项目&#xff0c;要求用主控用485和MCU通信。将代码调试好之后&#xff0c;验证没问题就发给测试了。测试测的也没问题。 但是&#xff0c;到设备量产时&#xff0c;发现有几台设备功能异常。将设备拿回来排查&#xff0c;发现是485通信有问题&#xff…

电脑提示找不到msvcp140.dll的修复方法,亲测有效的两种方法

msvcp140.dll是Microsoft Visual C 2015 Redistributable的一个组件&#xff0c;它包含了许多C运行时库文件。这些库文件为运行基于C编写的应用程序提供了必要的支持。当系统中缺少某个或某些库文件时&#xff0c;就可能出现msvcp140.dll丢失的错误。 一、以下是msvcp140.dll文…

qt .pro工程转vs工程

1. 新建vs空项目或者Qt Console Application&#xff1b; 2. 扩展 -》Qt VS Tools -》Open Qt Project (.pro) 打开对应的pro文件即可将.pro工程转成vs工程&#xff1b; 注意&#xff1a; &#xff08;1&#xff09;转成的vs工程在pro文件同级目录下&#xff0c;双击打开vcx…

23年中科院1区算法|开普勒优化算法原理及其利用(Matlab/Python)

CEC2017中的测试 本文作者将介绍一个2023年发表在中科院1区期刊《Knowledge -Based Systems》上的优化算法——开普勒优化算法(Kepler optimization algorithm&#xff0c;KOA)[1] 算法性能上&#xff0c;与鹈鹕、黏菌、灰狼和鲸鱼等一众优化算法在CEC2014、CEC2017、CEC2020和…

论文阅读--EFFICIENT OFFLINE POLICY OPTIMIZATION WITH A LEARNED MODEL

作者&#xff1a;Zichen Liu, Siyi Li, Wee Sun Lee, Shuicheng YAN, Zhongwen Xu 论文链接&#xff1a;Efficient Offline Policy Optimization with a Learned Model | OpenReview 发表时间&#xff1a; ICLR 2023年1月21日 代码链接&#xff1a;https://github.com/s…

AES加密数据:Python加密Java解密

总体步骤&#xff0c;分2步&#xff1a; 1.Python加密存入数据库 1.1 AES加密&#xff0c;CBC模式 1.2 秘钥Key 和 向量异或 IV 1.3数据加盐PKCS5Padding 1.4 Base64转码 2.Java解密API传前端展示 代码示例&#xff1a; 1.Python加密存入数据库 needAESText "需要…

使用 AnyGo 修改 iPhone 手机定位

在当今数字化时代&#xff0c;我们的手机已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;有时我们可能会遇到一些情况&#xff0c;需要修改手机的定位信息。这个需求可能来自于各种不同的原因&#xff0c;包括但不限于保护个人隐私、测试应用程序的地理位置相关功能…