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)

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

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

相关文章

python+selenium爬虫笔记

本文只是做例子,具体网站路径麻烦你们换下,还有xpath路径也换下 一、安装所需要的组件(此处采用谷歌) 1、安装驱动 查看你的浏览器版本,去安装对应的版本 下载驱动 下载驱动路径 之前版本的 输入这个路径下载下来解压…

HarmonyOS应用开发之ArkTS语言学习记录

1、ArkTS介绍 ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript(简称TS)基本语法风格的基础上,对TS的动态类型特性施加更严格的约束,引入静态类型。同时,提供了声明式UI、状态管理等相应的能力,让开发者…

【React系列】Hook(二)高级使用

本文来自#React系列教程:https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. Hook高级使用 1.1. useReducer 很多人看到useReducer的第一反应应该是redux的某个替代品,其实并不是…

通过消费者特征,设计更符合市场的商业模式,树立标杆用户拓展用户圈层

迅腾文化观察:通过消费者特征,设计更符合市场的商业模式,树立标杆用户拓展用户圈层 在当今快速变化的市场环境中,企业需要不断创新和调整自己的商业模式,以适应消费者的需求和市场的发展。迅腾文化观察到,…

经常耳鸣别大意,可能是这6种疾病的预警信号

你在日常生活中有没有遇到过这样的情况:耳朵里突然出现一阵响声,有时候像流水、有时候像蝉鸣、有时候像机器轰鸣……这些往往都是耳鸣的表现。 而耳鸣是一种很常见的症状,一项发表于《美医学会杂志:神经病学分册》的研究表明&…

机器学习分类

1. 监督学习 监督学习指的是人们给机器一大堆标记好的数据,比如: 一大堆照片,标记出哪些是猫的照片,哪些是狗的照片 让机器自己学习归纳出算法或模型 使用该算法或模型判断出其他没有标记的照片是否是猫或狗 上述流程如下图所…

ChatGPT大升级,文档图像识别领域迎来技术革新

​写在前面ChatGPT迎来重大升级冲击与机遇并存​大模型时代的思考与探索■ 像素级OCR统一模型- UPOCR■ OCR大一统模型- SPTS v3■ 文档识别分析LLM应用 写在最后问卷抽奖 ​写在前面 2023 年 12 月 31 日第十九届中国图象图形学学会青年科学家会议在广州召开,该会…

ZigBee协议栈 -- 协议栈版本与IAR版本适配说明(Zstack2.5.1a + IAR10.30.1)

文章目录 协议栈安装工程适配 在讲到ZigBee协议栈的文章中所用的协议栈版本是Zstack2.5.1a,对于Zstack2.5.1a运行在IAR8.10中是可以完全适配进行编译开发的,现在较新版本的IAR都是10的版本以上了,有部分开发者习惯使用最新版本来获得更好的开…

Python 可视化 web 神器 streamlit

官网:https://streamlit.io/ github:https://github.com/streamlit/streamlit API 参考:https://docs.streamlit.io/library/api-reference 1、streamlit 简介 streamlit 简介 Streamlit 是Python可视化 web 神器 ,是一个开箱即…

Open3D聚类算法

按照官网的例子使用聚类,发现结果是全黑的。 经过多次测试发现 eps3.3, min_points1这里是关键 min_points必须等于1否则无效果 import time import open3d as o3d; import numpy as np; import matplotlib.pyplot as plt#坐标 mesh_coord_frame o3d.geometry.Tria…

自定义ChatGPT商店下周上线!大模型“App Store时刻”来啦

1月5日凌晨,OpenAI向所有自定义GPT开发者发布了一封邮件,下周将上线“自定义GPT商店”。 自定义GPTs是OpenAI在去年首届开发者大会上发布的重磅产品,用户无需任何代码,全程支持可视化点击操作。 用户只需要提交对话指令、额外的…

企业核心技术泄露可能给企业带来深远的负面影响以及补救措施

企业核心技术是企业竞争优势的重要来源,但同时也是企业面临的最大风险之一。随着信息技术的发展,企业核心技术泄露的风险也越来越大。一旦企业核心技术泄露,不仅会给企业带来直接的经济损失,还会对企业的品牌形象、市场竞争力、战…

led台灯哪些牌子性价比高?那些性价比高的LED护眼台灯推荐

台灯作为家居用品在日常生活中使用频繁。用户可以根据个人需求和喜好,在市场上找到合适的款式。然而,由于台灯种类繁多,甚至连相关标准都存在差异,这使得一些缺乏经验的购物小白感到困扰。那么,led台灯哪些牌子性价比高…

提升图像分割精度:学习UNet++算法

文章目录 一、UNet 算法简介1.1 什么是 UNet 算法1.2 UNet 的优缺点1.3 UNet 在图像分割领域的应用 二、准备工作2.1 Python 环境配置2.2 相关库的安装 三、数据处理3.1 数据的获取与预处理3.2 数据的可视化与分析 四、网络结构4.1 UNet 的网络结构4.2 UNet 各层的作用 五、训练…

SpringCloud之Eureka组件工作原理详解

Eureka是一种服务注册与发现组件,最初由Netflix开发并开源出来。它主要用于构建分布式系统中的微服务架构,并提供了服务注册、服务发现、负载均衡等功能。在本文中,我们将详细解释Eureka的工作原理。 一、Eureka概述 Eureka是Netflix开源的一…

MySQL数据库的CURD、常见函数及UNION和UNION ALL

一、概述 MySQL是一种流行的关系型数据库管理系统,广泛应用于各种应用场景。在MySQL中,CURD操作是指创建(Create)、读取(Read)、更新(Update)和删除(Delete)…

ROS学习笔记(9)进一步深入了解ROS第三步

0.前提 1. (C)Why did you include the header file of the message file instead of the message file itself?(为包含消息的头文件而不是消息本身?) 回答:msg文件是描述ROS消息字段的文本文件,用于生成不同语言消息…

【Mars3d】new mars3d.layer.GeoJsonLayer({不规则polygon加载label不在正中间的解决方案

问题: 1.new mars3d.layer.GeoJsonLayer({type: "polygon",在styleOptions里配置label的时候,发现这个 不规则polygon加载的时候,会出现label不在中心位置。 graphicLayer new mars3d.layer.GeoJsonLayer({ name: "全国省界…

游戏Lua调用01.lua的编译及测试

一、lua库下载与编译 进入lua官网 Lua: version history 找到lua5.1 选择lua5.1是因为大部分游戏使用的都是lua5.1的库,也可以选择高版本,影响不大 下载完了后使用vs建立一个静态库或者动态库的工程 这里以动态库为例子,静态库也是一样的…

6 网关和配置服务器

文章目录 网关模式Spring Cloud网关Spring Cloud网关微服务其他项目的变更运行和测试小结 运行状况Spring Boot Actuator在微服务中包含Actuator 服务发现和负载均衡ConsulSpring Cloud ConsulSpring Cloud负载均衡器网关中的服务发现和负载均衡使用服务发现和负载均衡 环境配置…