【Quest开发】在虚拟世界设置具有遮挡关系的透视窗口

软件:Unity 2022.3.51f1c1、vscode、Meta XR All in One SDK V72

硬件:Meta Quest3

仅针对urp管线

参考了YY老师这篇,可以先看他的再看这个可能更好理解一些:Unity Meta Quest MR 开发(七):使用 Stencil Test 模板测试制作可以在虚拟与现实之间穿梭的 MR 传送门_unitymr-CSDN博客

他这篇只讲了怎么在现实开虚拟世界的门,我的游戏需要有透视“裂缝”,所以研究了一下怎么在虚拟世界打开能被虚拟物体遮挡的透视窗口(building block里面已有的surface projected passthrough并没有遮挡关系)

我的大概思路就是把他的逻辑不完全地反过来吧,要在虚拟世界开透视世界的洞,又不能像surface projected passthrough一样让它浮在最前方,那么只能让透视世界作为最底层的背景层,只让指定物体(下文称为crack)可以显示出最底层,并让指定物体正常参与深度测试。

博主对渲染完全不熟,胡乱尝试中摸出了想要的结果,我尽可能去理解解释原理,可能有误,不要完全相信我讲的,希望渲染大佬指正。

一、使用BuildingBlock配置全局透视

删除原有场景的mainCamera将以下两个模块拖入场景

原理解释:打开passthrough物体找到下面这个组件,可以看到设置的placement是underlay,表明该透视图层会放置在虚拟下方

那么这种情况下,如果场景中还有天空盒的话,透视图层则无法显示(因为透视图层在最下层)

而meta在自动配置中给出的办法则是让摄像机忽略天空盒

点开BackGround可以看到它将背景颜色设为了透明

二、设置虚拟世界天空盒

要知道,我们现在可是想在虚拟世界开一个透视世界的洞,虚拟世界怎么能没有天空呢

建一个巨大球体给上需要的天空盒材质即可

将该球体的Layer设置为Background层级(很关键)

三、新建一个模板Shader和材质并将其赋给需要透视的物体crack

先解释一下模板测试

  • 每个像素都有一个“模板值”(存在Stencil Buffer模板缓冲区里,默认保存的值是 0)。

  • 你设置一个测试条件(比如:只有模板值 != 1 的地方才画)。

  • Unity 会检查每个像素的模板值是否满足这个条件。

    • 满足 → 可以渲染。

    • 不满足 → 这个像素就被“挡住”,不渲染。

而下面这个shader的作用是更新它自身的模板值为我们手动设定的StencilID

Shader "Examples/Stencil"
{Properties{[IntRange] _StencilID ("Stencil ID", Range(0, 255)) = 0}SubShader{Tags { "RenderType" = "Opaque"//告诉Unity这个是“不透明”物体"Queue" = "Geometry"//设置渲染队列(在透明物体之前渲染)"RenderPipeline" = "UniversalPipeline"//指定这个 Shader 适用于 URP}Pass{Blend Zero One//不画任何东西(颜色乘以0),因为只想用这个 Pass 来设置模板值,不是真的画图。//ZWrite Off //不写入深度,不参与深度测试,一定要画上去Stencil{Ref [_StencilID]// 要写入的模板值Comp Always// 总是通过测试Pass Replace// 测试通过时把模板值替换为 _StencilIDFail Keep//如果测试失败 → 保持原值(虽然这里总是通过)}}}
}

这就是YY老师给的Shader代码,我唯一改的是注释掉了不写入深度,因为我们需要让挂有此材质的crack物体与背景以外的其他物体有正常的遮挡关系。

创建一个材质,shader选择为Stencil,模板值设置为1,将材质赋给需要透视的物体

给上去以后发现是这种不可见的效果

因为我们还没有在管线里打开模板测试,现在这个shader所做的只是更改了自身的模板值,然后什么也不画。

四、配置URP管线

1.在quality里找到自己正在使用的渲染管线

2.找到Render Pipeline Asset里正在使用的Renderer,复制一份后修改名字替换给它(也可以不复制直接改,我这里为了备份一下才复制了个新的)

3.配置Renderer Data

Unity - Manual: Universal Renderer asset reference for URP

Filtering里移除天空盒所在的Background层级,即在主渲染流程中不渲染该层

在此Renderer Data中添加一个RendererFeature(渲染器功能),配置如下

Unity - Manual: Render Objects Renderer Feature reference for URP

Unity - Manual: Stencil command in ShaderLab reference

各个配置的意思大家翻unity文档吧,这里只解释作用还有一个比较容易误会的点

作用:它相当于为此渲染器添加了一个功能,在渲染完不透明物体以后,再渲染Background层级的物体,并针对该层级开启模板测试,只让该层级下模板值!=1的物体通过模板测试,也就是说,有crack在的屏幕像素点都无法通过模板测试就会形成下面的效果。

易错点:pass keep和fail keep的意思是有没有通过模板测试都会保留该位置模板值,不是保留像素点颜色

这时候应该会有同学和我有一样的疑惑吧,为什么在crack前面的物体就正常渲染出来了,而天空盒就这样被抠了一个洞呢?

因为crack的层级不是Background,所以,它自身并没有参与模板测试,它所做的只是为需要模板测试的Background层级提供了一个模板值。它自己是位于正常的层级关系里,当然会和其他物体一样具有遮挡关系

好了这就完成啦,串流上头盔就能看见透视场景咯。


我不知道没学过渲染的同学是不是觉得我说得很有道理。希望大家可以照着步骤做但是不要全信我讲的原理,因为我是根据现象推的结论,而这一切结论都被我将管线设置为对所有层级进行模板测试,只让不等于1的模板值通过测试后出现的效果推翻了哈哈哈。按理来说应该会和之前的效果一致啊,怎么会无效呢,到底为什么呢,是顺序出错了吗,有没有大佬跟我讲一下为什么


2025.4.17

测试发现这种配置方法和Lit材质里开了alpha clipping的材质不兼容,会出现诡异的透视效果,目前没找到解决办法,直接解决问题的来源了哈(不用alpha clipping)

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

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

相关文章

GPU 招投标全流程分析与总结

GPU 招投标全流程分析与总结 招投标流程概述 以下是通过代理商采购Nvidia H20-GPU 141G的招投标全流程分析: #mermaid-svg-hMPPfkCpGj8GKXfV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hMPPfkCpGj8GKXfV .er…

[C++] STL中的向量容器<vector>附加练习

目录 讲在前面(必看)八卦阵题目描述输入格式输出格式输入输出样例数据范围AC代码及要点 决赛应援题目描述输入格式输出格式输入输出样例数据范围AC代码及要点 讲在前面(必看) 本篇为练习篇, vector讲解篇在这里. 菜鸟食用前请做好心理准备(你懂的) 八卦阵 题目描述 n 名同学…

基于SpringBoot+Vue3实现的宠物领养管理平台功能一

一、前言介绍: 1.1 项目摘要 随着社会经济的发展和人们生活水平的提高,越来越多的人开始关注并参与到宠物领养中。宠物已经成为许多家庭的重要成员,人们对于宠物的关爱和照顾也日益增加。然而,传统的宠物领养流程存在诸多不便&a…

parameter和localparam的区别(verilog中)

在Verilog中,parameter 和 localparam 都用于定义常量,但是它们之间有一些重要的区 作用范围: parameter:可以在模块外部被修改或重定义。它可以被作为模块的参数传递给其他模块,因此具有较广泛的作用范围,…

鸿蒙API15 “一多开发”适配:解锁黄金三角法则,开启高效开发新旅程

一、引言 在万物互联的时代浪潮中,鸿蒙操作系统以其独特的 “一多开发” 理念,为开发者打开了一扇通往全场景应用开发的新大门。“一多开发”,即一次开发,多端部署 ,旨在让开发者通过一套代码工程,就能高效…

Linux中docker容器拉取镜像失败解决方案

查看 /etc/systemd/system/docker.service.d/http-proxy.conf 文件(没有则新建),查看自定义 Docker 服务的代理设置 输入内容 [Service] Environment"HTTP_PROXYsocks5://10.211.13.214:7890" Environment"HTTPS_PROXYsocks…

半导体设备通信标准—secsgem v0.3.0版本使用说明文档(2)之GEM(SEMI 30)

文章目录 1、处理器1.1、事件 2、GEM 合规性2.1、状态模型2.2、 设备加工状态2.3、 文档2.4、 控制 (作员启动)2.5、 动态事件报告配置2.6、 跟踪数据收集2.7、 报警管理2.8、 远程控制2.9、 设备常量2.10、 工艺配方管理2.11、 物料移动2.12、 设备终端…

每日算法-链表(23.合并k个升序链表、25.k个一组翻转链表)

一.合并k个升序链表 1.1题目描述 1.2题解思路 解法一:小根堆 我们可以先定义一个小根堆,将k个指针的头结点如堆,每次取堆顶元素尾插到newhead中,然后再pop(),接着push堆顶原来堆顶元素的下一个节点 重点分析&#…

Java性能剖析工具箱

1. 基础知识 1.1 Java性能调优概述 1.1.1 性能调优的重要性 性能调优是提升系统效率、降低成本和增强用户体验的关键步骤。通过优化,可以减少响应时间、降低资源消耗并提高系统的稳定性和可扩展性。 1.1.2 性能问题的常见表现 高CPU使用率:可能由热点方法或线程阻塞引起。…

如何使用SpringApplicationRunListener在Spring Boot 应用的不同生命周期阶段插入自定义逻辑

目录 一、引言二、核心方法概述三、加载机制四、使用场景五、扩展 - 如何在测试的不同阶段插入逻辑5.1 TestExecutionListener & AbstractTestExecutionListener5.1.1 主要功能5.1.2 生命周期方法 5.2 如何集成TestExecutionListener5.3 总结 一、引言 SpringApplicationR…

【NLP】 19. Tokenlisation 分词 BPE, WordPiece, Unigram/SentencePiece

1. 翻译系统性能评价方法 在机器翻译系统性能评估中,通常既有人工评价也有自动评价方法: 1.1 人工评价 人工评价主要关注以下几点: 流利度(Fluency): 判断翻译结果是否符合目标语言的语法和习惯。充分性…

openai发布今天发布了o3和o4-mini。

ChatGPT Plus、Pro和Team用户已经可以使用o3、o4-mini和o4-mini-high,取代o1、o3-mini和o3-mini-high。具体特点: ChatGPT-o3 特点:o3模型使用高级推理技术,这意味着它在处理复杂问题和逻辑推理方面表现出色。但是不能联网搜索 …

ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(输入类外设之触摸屏 Touch)

目录 ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(输入类外设之触摸屏 Touch)简介模块概述功能定义架构位置核心特性 触摸(Touch)外设触摸外设概述触摸外设API和数据结构外设层API(periph_touch.h/periph_touch…

python 读取分级目录

import osdef read_files_in_directory(root_dir):# 遍历根目录下的所有文件和目录for year_dir in os.listdir(root_dir):year_path os.path.join(root_dir, year_dir)if os.path.isdir(year_path): # 确保是目录for month_dir in os.listdir(year_path):# if month_dir in …

MongoServerError: Authentication failed.处理办法

1停止MongoDB服务: systemctl stop mongod2临时修改MongoDB配置,禁用认证: vim /etc/mongdb.config 在配置文件中找到 security:authorization: disabled # 临时关闭认证3.重启MongoDB服务 # 重启MongoDB服务 sudo systemctl restart mon…

ObjectInputStream 终极解析与记忆指南

ObjectInputStream 终极解析与记忆指南 一、核心本质 ObjectInputStream 是 Java 提供的对象反序列化流,继承自 InputStream,用于读取由ObjectOutputStream序列化的Java对象。 核心特性速查表 特性说明继承链InputStream → ObjectInputStream核心功能实现Java对象反序列化…

Java面试高频问题(1-5)

一、HashMap实现原理与并发问题 核心机制 1. 哈希冲突解决方案:采用数组链表红黑树结构(JDK1.8),当链表长度超过阈值(默认8)时转为红黑树,提升查询效率 2. 扩容机制:当元素数量超过…

Genspark:重新定义AI搜索与代理的全能型工具

在当今快速发展的AI技术领域,搜索工具正在经历前所未有的变革。Genspark,这家由前百度高管景鲲和朱凯华创立的AI公司,为我们带来了全新的AI代理引擎体验。作为一位专注于AI工具分享的博主,今天我将为大家详细介绍这款强大的工具&a…

工作记录3

前言: 继续刷尚硅谷的前端视频,查漏补缺。 JS (1)apply() 方法与 call() 方法 (2)构造函数 (3)原型对象<

photo-sphere-viewer 4.8.1在vue中使用

photo-sphere-viewer 加载单张平面图 import { Viewer } from photo-sphere-viewerthis.viewer new Viewer({panorama: ‘完整的url,也可以是一个base64’,// Containercontainer: document.getElementById(viewer1),navbar: true,// Resize the panoramasize: {width: 100%,…