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

文章目录


前言

在之前的文章中,我们实现了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 n≤z≤0

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

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

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

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

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

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

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

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

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

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 n≤z≤−f

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

0 ≤ z − n ≤ − f − n 0\leq z -n \leq-f - n 0≤z−n≤−f−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} 0≤(z−n)−f−n1≤−(f+n)−f−n1

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

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

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

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 −n≤z≤f

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

0 ≤ z + n ≤ f + n 0\leq z+n \leq f+n 0≤z+n≤f+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} 0≤z+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+n1≤1

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

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

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

相关推荐
WarrenMondeville39 分钟前
AI复刻街头霸王到 Unity
unity·游戏引擎
玖玥拾6 小时前
Lua 基础语法(六)xLua Lua 调用 C# 交互
开发语言·unity·c#·lua
xcLeigh20 小时前
Unity基础:MonoBehaviour的生命周期——Awake、OnEnable、Start、Update执行顺序
unity·游戏引擎
qq_2131578921 小时前
其域lcc2丢失部分lod/远处显示空洞的解决方式
unity·lcc2
辻弋20121 小时前
自动检测硬件生成驱动清单、实时监控FPS、120秒性能记录——30+项优化模块化开关,所有改动可精确复原
服务器·windows·游戏引擎·电脑·开源软件
点心的游戏开发世界1 天前
GDScript 入门笔记:目录
开发语言·笔记·游戏引擎·godot
XR技术研习社1 天前
关于 PICO 串流测试中报错 IndexOutOfRangeException: renderPassIndex 的两个排障方法
unity·ar·xr·vr
想做后端的前端1 天前
Unity · 性能优化:内存管理完全指南:从托管堆到跨桥开销
unity·性能优化·游戏引擎
平行云1 天前
实时云渲染信创架构解析:从GPU池化到全栈适配的技术演进
linux·unity·docker·ue5·webgl·数字孪生·实时云渲染
玖玥拾1 天前
Lua 基础语法(五)Unity xLua基础配置与 C# 访问 Lua
开发语言·unity·c#·lua