[Unreal shader]深度缓冲重建世界坐标

UE中通过深度缓冲重建世界空间坐标原理和Unity shader重建原理基本一致,但是UE中重建世界坐标的实现路径与Unity是不一致的 :

• Unity中使用SAMPLE_DEPTH_TEXTUR采样的是原始深度值(RawDepth),是一个范围[0,1]的非线性深度值;UE中SceneDepth节点获取的是真实距离的线性深度(Linearepth),单位是厘米。

• Unity和UE的坐标系不同,Unity是左手坐标系,Y轴向上 (Y-Up),Z轴向前;UE是左手坐标系,Z轴向上 (Z-Up),X轴向前。这意味着Unity和UE的矩阵内容不同,Unity 的逆矩阵和 UE 的逆矩阵,里面的 16 个数字是不一样的;Clip Space 方向不同,Unity 的 UV 原点通常在左下角 (OpenGL) 或左上角 (DX),UE 的 UV 原点在左上角。这会导致 Y 轴方向可能需要1 - y反转。

• Unity和UE的单位不一致,Unity的世界单位是米,UE的世界单位是厘米,因此按照Unity的路径重建出来是 (0, 1, 0),在 UE 里重建出来则是 (0, 0, 100)。如果不缩放,特效大小会差 100 倍

因此在UE中通过深度缓冲重建世界坐标,建议使用射线法:

1. 射线法

原理公式:P´ = C + ->v * Depth / ->v * ->f

如图所示,P是像素的屏幕空间位置(ScreenPosition),是像素的世界空间位置(WorldPosition);C是相机的世界空间位置(CameraPosition);->v是相机指向像素P视线的向量(CameraVector),->f是相机朝向向量(CameraDirrction);Depth是像素P的深度值。由向量->v点乘向量->f可得向量->v->f的夹角θ的余弦值cosθDepth/cosθ获取CP´长度。向量->v* 距离CP´获得向量->CP´,向量->CP´只表示到相机C的相对距离,要获取在世界空间中的绝对位置,还需要加上相机C的世界空间坐标,即可确定像素P在世界空间中的位置。公式如下:

UE节点连线图:

2. 逆矩阵重建

UE中通过逆矩阵重建世界坐标,基本逻辑和Unity一致,由裁剪空间逆矩阵反推至世界空间,但在具体执行层面与Unity不一样

2.1 实现方法

UE中没有提供逆矩阵相关节点,因此需要使用CustomNode输入代码实现逆矩阵

//1.采样:获取纹理坐标,自动适配动态分辨率 (Screen Percentage) //GetSceneTextureUV 为UE内置函数,用于采样屏幕空间UV坐标 float2 ScreenUV = GetSceneTextureUV(Parameters); //获取 DeviceZ (采样0 ~ 1 的非线性深度) float deviceZ = LookupDeviceZ(ScreenUV); //2.几何重建 //获取NDC空间坐标,GetScreenPosition UE内置函数,直接获取NDC空间坐标 float2 ndcPos = GetScreenPosition(Parameters).xy; //通过NDC坐标构建裁剪空间齐次坐标 float4 ClipPos = float4(ndcPos, deviceZ, 1.0); //3.空间变换(Transform) //逆投影矩阵,由裁剪空间齐次坐标转为平移世界空间坐标 float4 TranslatedWorldPosH = mul(ClipPos, ResolvedView.ClipToTranslatedWorld); //透视除法(归一化),还原为平移世界空间笛卡尔2坐标 TranslatedWorldPos = TranslatedWorldPosH / TranslatedWorldPosH.w; //4.LWC还原(LWC Restore) //获取平移世界坐标偏移量 float3 PreViewTranslation = LWCToFloat(ResolvedView.PreViewTranslation); //还原绝对世界坐标 float3 WorldPos = TranslatedPos.xyz - PreViewTranslation; return WorldPos;

2.2 平移世界空间 (Translated World Space)

平移世界空间 (Translated World Space) 是 Unreal Engine (UE) 渲染管线中一个非常独特且核心的概念。它是 “以相机为原点,但坐标轴方向与世界保持一致” 的坐标系。

在计算机图形学中,GPU处理顶点和像素位置时,通常使用32位浮点数 (Float32)。Float32有一个致命弱点:数值越大,精度越低。如一个超大开放世界游戏中,玩家走到地图边缘(比如坐标1000000, 1000000),此时如果直接使用绝对世界坐标进行渲染计算:模型会开始疯狂抖动(顶点乱跳)、阴影会变成锯齿状或消失、物理计算会崩溃。为了解决这个问题,UE采用了一个聪明的策略:既然GPU处理大数值精度低,那我就强行让所有计算都发生在原点 (0,0,0) 附近。

• 绝对世界空间:世界原点固定不动;相机可能飞到十万八千里外;精度风险:高

• 平移世界空间:强行把世界原点移动到相机所在的位置,在渲染每一帧时,引擎会计算一个偏移量 PreViewTranslation(大约等于 - CameraPosition),所有的物体坐标,都加上这个偏移量,无论玩家走到地图哪里,在GPU看来,相机永远在 (0,0,0) 附近,所有要渲染的物体也都在相机附近。数值永远很小,精度永远完美。

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

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

相关文章

【毕业设计】基于springboot的隧道云视频监控管理信息平台设计与实现(源码+文档+远程调试,全bao定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

logging库使用教程

logging日志模块 logging是python常用的日志模块,logging涉及三个概念:logger可以理解为记者,决定写什么 handler可以理解为发布渠道,决定发到哪里 formatter可以理解为文章格式,决定排版格式 Level可以理解为重要…

【课程设计/毕业设计】基于springboot的隧道云视频监控管理信息平台设计与实现隧道内事故、火灾、车辆滞留等问题监察【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

SpringBoot:封装 starter

01 Starter 核心机制 SpringBoot 核心思想是约定大于配置,而 Starter 正是这一思想的核心落地载体。 简单来说,Starter 把某一类功能的依赖管理、默认配置、自动装配逻辑打包成一个独立 Jar 包。 项目只需引入这个 Jar 包,就能直接使用对应功…

滴滴 wsgsig secdd-challenge

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由 此产生的一切后果均与作者无关! 部分python代码 url "ota/re…

RabbitMQ 在大数据领域的故障排查与解决方案

RabbitMQ 在大数据领域的故障排查与解决方案 关键词:RabbitMQ、大数据、消息队列、故障排查、性能优化、高可用性、消息丢失 摘要:本文深入探讨RabbitMQ在大数据环境下的常见故障及其解决方案。我们将从RabbitMQ的核心架构出发,分析其在大数据场景下面临的挑战,详细介绍故障…

Linux 内核漏洞提权

一、 内核提权的核心原理Linux 采用权限分级机制(root:0,普通用户:1-65535),内核运行在最高权限的内核态(Ring 0),用户程序运行在用户态(Ring 3)。内核提权的…

连接 AI 的隐形纽带:深度解构 MCP 传输层——从 Stdio 到 SSE 的实战抉择与架构差异

文章目录 🛰️ 连接 AI 的隐形纽带:深度解构 MCP 传输层——从 Stdio 到 SSE 的实战抉择与架构差异 📡🏗️ 第一章:协议与通道的解耦——MCP 通信的底层逻辑1.1 JSON-RPC 2.0:MCP 的通用语言1.2 传输层的两…

计算机毕业设计springboot基于农科所农作物信息管理系统的设计与实现 基于SpringBoot的农业科研院所作物数据智慧管理平台的设计与实现面向农科机构的SpringBoot作物全生命周期

计算机毕业设计springboot基于农科所农作物信息管理系统的设计与实现8h3n8w22 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。在“互联网农业”快速渗透的今天,农科所…

测试转网络安全如何弯道超车?

目录😭 测试的痛,谁懂?1. 重复劳动,永无止境2. 被动等待,毫无主动权3. 技术含量低,成长受限❓ 转行网安1. 测试经验,天然就是安全优势2. 技能高度重叠,转型零成本3. 工作模式更自由&…

Java计算机毕设之基于springboot的智慧医疗网上预约系统智慧医疗服务-智慧医疗服务平台(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

微服务架构演进实战 从单体到微服务的拆分原则与DDD入门

目录 💡 先说说我经历的微服务"车祸现场" ✨ 摘要 1. 为什么需要从单体转向微服务? 1.1 单体的痛苦现实 1.2 微服务的核心优势 2. 领域驱动设计(DDD)核心概念 2.1 战略设计:划分业务边界 2.2 战术设…

python mqgg 发送 json 文件

pip install paho-mqtt 发送json,含有音频文件; import json, base64 import paho.mqtt.client as mqtt import timedef on_connect(client, userdata, flags, rc):if rc 0:print("[A] Connected to broker")client.subscribe(TOPIC_SUB)pri…

学习日记day64

Day64_0121专注时间:目标是:5h30~6h。实际:5h47min每日任务:饭后的休息(25min),学习间歇的休息(15min)都用手表计时器来监督{step1}40min二刷1道力扣hot100昨天的题再做一…

GGUF、Safetensors、ONNX三种格式

https://blog.csdn.net/woshihlf/article/details/149123005 GGUF、Safetensors、ONNX三种格式

Java毕设项目:基于springboot的智慧医疗网上预约系统(源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

springboot_ssm815大学生校园图书借阅购买管理系统--论文

目录具体实现截图摘要系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!具体实现截图 摘要 随着高校图书馆信息化建设的不断推进,传统的人工管理模式已难以满足师生对图书借阅与购买的高效需求。基于…

#对象模型

Qt 对象模型的核心是元对象系统(Meta-Object System)Qt的对象模型是Qt核心特性的基础,它定义了对象的组织和交互方式 Qt的对象模型基于C的面向对象编程的原则,而我们又可以大致理解为对象模型是由QObject类以及它的特性元对象系统…

强烈安利8个AI论文平台,本科生搞定毕业论文!

强烈安利8个AI论文平台,本科生搞定毕业论文! AI 工具让论文写作不再难 对于许多本科生来说,毕业论文的撰写是一个既重要又令人头疼的任务。从选题、收集资料到撰写初稿、反复修改,每一步都可能让人感到力不从心。而随着 AI 技术的…

springboot_ssm816大学运动场地预约器材租借管理系统--论文

目录具体实现截图摘要系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!具体实现截图 摘要 随着高校体育运动的普及和场地资源的有限性,传统的人工管理方式已无法满足师生对运动场地和器材的高效预约…