Unity中URP下统一不同平台下的z值

文章目录

  • 前言
  • 一、ComputeFogFactor 来计算雾效混合因子
  • 二、UNITY_Z_0_FAR_FROM_CLIPSPACE 来统一计算不同平台下的Z值
    • 1、DirectX平台
    • 2、GL平台下(在Unity.2022.LTS下,该功能没有完善)
    • 3、Opengl下


前言

在之前的文章中,我们实现了URP下的雾效。

  • Unity中URP下的添加雾效支持

我们在这篇文章中,看一下Unity在URP下,计算雾效因子时是怎么统一Z值的。


一、ComputeFogFactor 来计算雾效混合因子

在这里插入图片描述


二、UNITY_Z_0_FAR_FROM_CLIPSPACE 来统一计算不同平台下的Z值

在这里插入图片描述

  • UNITY_REVERSED_Z(DX类平台都为1,其他平台都为0)
  • UNITY_UV_STARTS_AT_TOP(DX类平台都为1,其他平台都为0)
    (这个的作用应该是防止出现什么奇怪的平台时,对传入的Z值不做处理)

1、DirectX平台

  • 我们看一下反转过Z值的类DirectX平台,在处理雾效因子时,Z值是怎么处理的。
  • [near, 0] -> remapping to [0, far]

//D3d with reversed Z => z clip range is [near, 0] -> remapping to [0, far]
//max is required to protect ourselves from near plane not being correct/meaningful in case of oblique matrices.
#define UNITY_Z_0_FAR_FROM_CLIPSPACE(coord) max(((1.0-(coord)/_ProjectionParams.y)*_ProjectionParams.z),0)

n ≤ z ≤ 0 n \leq z \leq0 nz0

n − n ≤ z − n ≤ 0 − n n - n \leq z - n\leq0 - n nnzn0n

0 ≤ z − n ≤ − n 0 \leq z - n\leq- n 0znn

0 ≤ ( z − n ) 1 − n ≤ − n 1 − n 0 \leq (z - n)\frac{1}{-n}\leq- n\frac{1}{-n} 0(zn)n1nn1

0 ≤ z − n − n ≤ 1 0 \leq \frac{z - n}{-n}\leq1 0nzn1

0 ≤ z − n − n f ≤ f 0 \leq \frac{z - n}{-n}f\leq f 0nznff

0 ≤ n − z n f ≤ f 0 \leq \frac{n - z}{n}f\leq f 0nnzff

0 ≤ ( n n − x n ) f ≤ f 0 \leq (\frac{n}{n}-\frac{x}{n})f\leq f 0(nnnx)ff

0 ≤ ( 1 − x n ) f ≤ f 0 \leq (1-\frac{x}{n})f\leq f 0(1nx)ff

  • 最后得出的公式是和我们Unity中使用的公式是一致的
    0 ≤ ( 1 − x n ) f ≤ f 0 \leq (1-\frac{x}{n})f\leq f 0(1nx)ff

max(((1.0-(coord)/_ProjectionParams.y)*_ProjectionParams.z),0)

  • _ProjectionParams在Unity中的定义
    在这里插入图片描述

2、GL平台下(在Unity.2022.LTS下,该功能没有完善)

  • 在GL平台下,我们也需要对Z值进行重映射
  • [near, -far] -> remapping to [0, far]

//GL with reversed z => z clip range is [near, -far] -> remapping to [0, far]
#define UNITY_Z_0_FAR_FROM_CLIPSPACE(coord) max((coord - _ProjectionParams.y)/(-_ProjectionParams.z-_ProjectionParams.y)*_ProjectionParams.z, 0)

n ≤ z ≤ − f n \leq z \leq-f nzf

n − n ≤ z − n ≤ − f − n n -n\leq z -n \leq-f - n nnznfn

0 ≤ z − n ≤ − f − n 0\leq z -n \leq-f - n 0znfn

0 ≤ ( z − n ) 1 − f − n ≤ − ( f + n ) 1 − f − n 0\leq (z -n) \frac{1}{-f-n}\leq-(f + n)\frac{1}{-f-n} 0(zn)fn1(f+n)fn1

0 ≤ z − n − f − n ≤ 1 0\leq \frac{z-n}{-f-n}\leq1 0fnzn1

0 ≤ z − n − f − n f ≤ f 0\leq \frac{z-n}{-f-n}f\leq f 0fnznff

  • 最后得出的公式是和我们Unity中使用的公式是一致的
    0 ≤ z − n − f − n f ≤ f 0\leq \frac{z-n}{-f-n}f\leq f 0fnznff

max((coord - _ProjectionParams.y)/(-_ProjectionParams.z-_ProjectionParams.y)*_ProjectionParams.z, 0)

3、Opengl下

  • 在OpenGL平台下,我们
  • [-near, far] -> remapping to [0, far]

//Opengl => z clip range is [-near, far] -> remapping to [0, far]
#define UNITY_Z_0_FAR_FROM_CLIPSPACE(coord) max(((coord + _ProjectionParams.y)/(_ProjectionParams.z+_ProjectionParams.y))*_ProjectionParams.z, 0)

− n ≤ z ≤ f -n \leq z \leq f nzf

− n + n ≤ z + n ≤ f + n -n +n \leq z+n \leq f+n n+nz+nf+n

0 ≤ z + n ≤ f + n 0\leq z+n \leq f+n 0z+nf+n

0 ≤ z + n 1 f + n ≤ ( f + n ) 1 f + n 0\leq z+n\frac{1}{f+n}\leq (f+n)\frac{1}{f+n} 0z+nf+n1(f+n)f+n1

0 ≤ ( z + n ) 1 f + n ≤ 1 0\leq (z+n)\frac{1}{f+n}\leq 1 0(z+n)f+n11

0 ≤ ( z + n ) 1 f + n f ≤ f 0\leq (z+n)\frac{1}{f+n}f\leq f 0(z+n)f+n1ff

  • 最后得出的公式是和我们Unity中使用的公式是一致的
    0 ≤ ( z + n ) 1 f + n f ≤ f 0\leq (z+n)\frac{1}{f+n}f\leq f 0(z+n)f+n1ff

max(((coord + _ProjectionParams.y)/(_ProjectionParams.z+_ProjectionParams.y))*_ProjectionParams.z, 0)

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

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

相关文章

go.mod与module

在 Go 语言的项目中,go.mod 文件是 Go Modules 依赖管理系统的核心文件之一。在 go.mod 文件中,module 声明是用来定义当前项目的模块路径的。模块路径是项目中包的导入路径的前缀。下面是关于 go.mod 文件中 module 声明的详细介绍: module…

Pointnet++改进:在特征提取模块加入NAMAttention注意力机制,有效涨点

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入NAMAttention注意力机制,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一

Base64的理解及优缺点?png8、png16、png32的区别,png 的压缩原理?如何优化图片,网页制作会用到的图片格式有哪些?优化大量图片加载的方法?

Base64的理解 Base64是一种将任意二进制数据转换为纯文本的编码方式,它可以将二进制数据转换为普通文本,以便在网络上更方便地传输和存储数据。常被用于在文本协议下传输非文本文件,以及在URL中传递数据等场景。它将3个8位字节转为4个6位字节…

电动汽车BMS PCB制板的技术分析与可制造性设计

随着电动汽车行业的迅猛发展,各大厂商纷纷投入巨资进行技术研发和创新。电动汽车的核心之一在于其电池管理系统(Battery Management System, BMS),而BMS的心脏则是其印刷电路板(PCB)。通过这篇文章探讨电动…

Python字符串的判断

Python字符串的判断: 以下代码演示了Python字符串的判断: 实例 # Filename : test.py # author by : www.dida100.com # 测试实例一 print("测试实例一") str "dida100.com" print(str.isalnum()) # 判断所有字符都是数字或者字…

Graphics Control

Graphics Control提供了一个易于使用的图形设置管理解决方案,帮助您加快开发。它附带了一个常用设置库,如分辨率、垂直同步、全屏模式、光晕、颗粒、环境光遮挡等。我们的可自定义设置面板UI预制件为您提供了一个可用的UI面板,支持完整的游戏手柄和键盘输入。图形控制还附带…

version `GLIBCXX_3.4.21‘ not found

现象 今天在运行pytorch时报错了 version GLIBCXX_3.4.21‘ not found原因 centos7当前的gcc版本太老 ,里面的动态链接库没有GLIBCXX_3.4.21 排查 执行命令 检查动态库 strings /usr/lib64/libstdc.so.6 | grep GLIBCGLIBCXX_3.4 GLIBCXX_3.4.1 GLIBCXX_3.4.2 GLIBCXX_3.…

Spark---RDD介绍

文章目录 1.Spark核心编程2.RDD介绍2.1.RDD基本原理2.2 RDD特点1.弹性2.分布式 :数据存储在大数据集群的不同节点上3.数据集 :RDD封装了计算逻辑,并不保存数据4.数据抽象 :RDD是一个抽象类,具体实现由子类来实现5. 不可…

CCF模拟题 202312-1 仓库规划

问题描述 试题编号: 202312-1 试题名称: 仓库规划 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 输入格式 输出格式 样例输入 4 2 0 0 -1 -1 1 2 0 -1样例输出 3 1 0 3样例解释 Java实现代码: import …

macbook录屏快捷键大全,教你快速录制视频

“有人知道macbook电脑有录屏快捷键吗,现在录屏的速度太慢了,每次打开都要浪费不少时间,要是有录屏快捷键,应该会快很多,有哪位大佬知道吗?教教我!” 无论是在工作还是生活中,电脑已…

生活中危险的气体:一氧化碳与二氧化碳中毒的症状及安全预防措施

一氧化碳和血红蛋白亲和力超过氧气,会占用血红蛋白,导致缺氧。 二氧化碳会和血浆结合,导致血液pH值不正常,抑制呼吸,导致窒息。 通俗点说:一氧化碳是中毒,二氧化碳则是窒息。 一氧化碳中毒 …

基于 Docker 搭建交叉编译环境

本文主要介绍如何使用 Docker 搭建交叉编译环境 关于 docker 交叉编译环境,已经有人做成项目开源了。我们只需使用即可 # 获取 linux-arm64 镜像 docker pull dockcross/linux-arm64# 该镜像不能直接运行, 需要间接运行,我是真的服了 # 根据提示, 将运行…

通过Vue自定义指令实现前端埋点

在营销活动中,通过埋点可以获取用户的喜好及交互习惯,从而优化流程,进一步提升用户体验,提高转化率。 在之前的埋点方案实现中,都是在具体的按钮或者图片被点击或者被曝光时主动通过事件去上报埋点。这种方法在项目中…

K8Spod组件

一个pod能包含几个容器 一个pause容器(基础容器/父容器/根容器) 一个或者多个应用容器(业务容器) 通常一个Pod最好只包含一个应用容器,一个应用容器最好也只运行一个业务进程。 同一个Pod里的容器都是运行在同一个node节点上的,并且共享 net、…

javaweb学习笔记

JSP 动态网页,指的是随时间、地点、用户操作改变的网页 架构 CS架构 client-server 缺点:每一台客户端都需要安装客户端软件,如果升级全要升级,如果坏了就得维护 优点:响应快,界面美观 BS架构 browser-…

Zookeeper集群 + Kafka集群的详解与部署(以及Filebeat+Kafka+ELK )

zookeeperkafka.txt Zookeeper概述 Zookeeper是一个分布式的开源协调服务,用于管理和维护大型分布式系统中的配置信息、命名服务、状态同步等。它提供了一个可靠的分布式环境,用于协调多个节点之间的通信和管理。 数据结构 ZooKeeper数据模型的结构与…

以STM32为例,实现按键的短按和长按

以STM32为例,实现按键的短按和长按 目录 以STM32为例,实现按键的短按和长按1 实现原理2 实现代码3 测试结束语 1 实现原理 简单来说就是通过设置一个定时器来定时扫描几个按键的状态,并分别记录按键按下的持续时间,通过时间的长短…

序列化与反序列化xml bin

1、XML XML(可扩展标记语言)序列化是一种将对象的数据结构转换为XML格式的过程,以便将其存储在文件中、通过网络传输或与其他系统进行数据交换。在C#中,你可以使用.NET框架提供的XmlSerializer类来执行对象到XML的序列化和XML到对…

Java中访问未初始化的对象:原理、错误与防范

在Java编程中,访问未初始化的对象是一种常见的错误,可能导致程序运行时异常。这个问题的根本原因在于Java要求对象在使用之前必须经过初始化,否则会存在未知的状态。本文将详细讲解Java中访问未初始化对象的原理、可能导致的错误以及如何防范…

后端杂七杂八系列篇一

后端杂七杂八系列篇一 ① MySQL选择合适的数据类型① Char与Varchar② Text与Blob ② EqualsAndHashCode(callSuper true)的作用③ mybatis-plus 相关① 主键生成策略② 使用Model实现CRUD③ Wrapper的用法① Wrapper的继承关系② 项目中最常用的warpper [LambdaQueryWrapper]…