Unity Meta Quest MR 开发(七):使用 Stencil Test 模板测试制作可以在虚拟与现实之间穿梭的 MR 传送门

文章目录

  • 📕教程说明
  • 📕Stencil Test 模板测试
  • 📕Stencil Shader
  • 📕使用 Unity URP 渲染管线设置模板测试
    • ⭐Render Pipeline Asset 与 Universal Renderer Data
    • ⭐删除场景中的天空盒
    • ⭐设置虚拟世界的层级 Layer
    • ⭐设置模板测试
  • 📕给传送门添加 Stencil Shader
  • 📕模板测试全流程解释
  • 📕在虚拟与现实之间穿梭

此教程相关的详细教案,文档,思维导图和工程文件会放入 Spatial XR 社区。这是一个高质量 XR 开发者社区,博主目前在内担任 XR 开发的讲师。该社区提供专人答疑、完整进阶教程、从零到一项目孵化保姆服务(包含产品上架App lab)、投资|融资对接、工程文件下载等服务。

社区链接:
SpatialXR社区:完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子

在这里插入图片描述


📕教程说明

这期教程我将介绍如何使用 Stencil Test 模板测试,来制作可以在虚拟与现实之间穿梭的 MR 传送门。

在上一期制作虚拟门窗的教程中,我们介绍了一种 Depth Only Shader,它能够让物体不显示颜色,但是能够参与到深度测试中。而这期教程,我们会介绍另外一种 Shader,也是能实现在现实中透视出一块虚拟区域的效果。这种 Shader 叫做 Stencil Shader,它与 Stencil Test,也就是模板测试有关。

在这里插入图片描述

配套的视频链接:
https://www.bilibili.com/video/BV1SC411G7b9

系列教程专栏:https://blog.csdn.net/qq_46044366/category_12118293.html

Meta XR SDK 版本:v64

Unity 版本:2022.3.20f1

在进阶教程中我还会介绍如何制作多个传送门,并且每个传送门对应不同的虚拟世界。我会把进阶教程分享在我们 Spatial XR 社区,大家可以从文章顶部的链接加入社区。

在这里插入图片描述


📕Stencil Test 模板测试

首先介绍一下模板测试中的一些基本概念。

模板缓冲区 Stencil Buffer
模板缓冲区可以为屏幕上的每一个像素点保存一个无符号整数值(通常为8位int 0-255)。也就是每一个像素点保存一个 0-255 之间的整数值。模板缓冲区中默认保存的值是 0。

模板测试
渲染过程中,可以用模板缓冲区中保存的值预先设定好的参考值作(ReferenceValue)比较,根据结果来决定是否更新相应的像素点的颜色值。这个比较的过程就称为模板测试。

在这里插入图片描述

如上如所示,最左边的 Color buffer 代表了画面原本的样子。中间的 Stencil Buffer 记录了画面上的每一个像素点保存的值,可以看到有一块“回”字形的区域记录的是 1,其余区域记录的是 0。假设我们预先设定的参考值为 1,规定只保留模板缓冲区中值为 1 的像素,那么我们可以设置一个比较的方法,当模板缓冲区的值等于我们设定的参考值的时候,对应位置的像素通过模板测试,像素被保留,因此可以参考最右边的 After stencil test,这是最终进行了模板测试后看到的画面,可以看到只有模板缓冲区中值为 1 的部分被保留了下来。

总结下来,模板测试主要有三个关键词:模板缓冲区中保存的值,预先设定好的参考值,比较。


📕Stencil Shader

Shader "Examples/Stencil"
{Properties{[IntRange] _StencilID ("Stencil ID", Range(0, 255)) = 0}SubShader{Tags { "RenderType" = "Opaque""Queue" = "Geometry""RenderPipeline" = "UniversalPipeline"}Pass{Blend Zero OneZWrite OffStencil{Ref [_StencilID]Comp AlwaysPass ReplaceFail Keep}}}
}

创建了 Stencil Shader 后,我们创建一个材质,添加上 Stencil Shader:

在这里插入图片描述

Stencil ID 相当于预先设定的参考值,后续用来与模板缓冲区中的值进行比较,我们可以把它设为 1。


📕使用 Unity URP 渲染管线设置模板测试

这里推荐大家使用 Unity 的 URP 渲染管线来制作模板测试的功能,因为它提供了一些更便捷的设置方法,让我们不用去写额外的 Shader 来控制模板缓冲区中的值和模板测试的比较方法。

首先创建一个 Unity 的 URP 项目,在 Unity Hub 里新建项目的时候可以选择 Universal 3D:

在这里插入图片描述

⭐Render Pipeline Asset 与 Universal Renderer Data

项目创建成功后我们打开 Edit>Project Settings>Quality:

在这里插入图片描述
创建了 URP 项目后默认是 High Fidelity,我们可以观察它右边的几个方框,勾选了并且颜色为绿色的代表当前的 URP Quality 设置生效的平台,High Fidelity 默认是只在 PC 端生效,但是如果我们想要把应用打包到头显当中运行,需要确保安卓端也生效,因为 Quest 系统是安卓系统。所以我们可以按下图所示进行更改:

在这里插入图片描述

点击红色方框标出的部分后,安卓端的方框就变绿了。

然后我们找到该 Quality 下的 Render Pipeline Asset,点击它可以定位到 Project 窗口中的 URP 配置文件:

在这里插入图片描述
在这里插入图片描述

我们可以找到该 Render Pipeline Asset 下的 Renderer List 里的 Universal Renderer Data,我们可以将它复制一份,取名为 “URP-MRPortal”,然后把 URP-High Fidelity 中的 Renderer List 替换成 URP-MRPortal,我们后续可以在 URP-MRPortal 这个配置文件中进行渲染设置。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

⭐删除场景中的天空盒

我们需要透过 MR 传送门看到传送门后的虚拟世界,传送门之外的部分需要显示现实环境。因此我们需要配置透视功能,并且透视的层级要处于最底层。如果场景中有背景天空盒,那么我们是无法看到位于最底层的透视图层的。所以我们需要删除场景中的天空盒。可以点击 Unity 菜单栏的 Window>Rendering>Lighting,把 Skybox Material 设为 None。

在这里插入图片描述

⭐设置虚拟世界的层级 Layer

首先我们准备一个虚拟场景的游戏物体,把虚拟场景里的所有物体作为一个物体的子物体,然后修改这个物体以及它的所有子物体的 Layer,我们可以新建一个 Layer,叫做 Stencil Layer 1。

在这里插入图片描述
之后我们需要对 Universal Renderer Data 配置文件进行设置,它可以控制某一个 Layer 物体的渲染效果。我们找到之前创建的 URP-MRPortal。

⭐设置模板测试

首先在 Opaque/Transparent Layer Mask 中把之前添加的 Stencil Layer 1 层级给取消掉,这个时候你会发现虚拟世界在 Scene 窗口中看不到了。
在这里插入图片描述

我们之后要单独为 Stencil Layer 1 层设置它的渲染效果。我们可以拉到该 Universal Renderer Data 的最底部,点击 Add Renderer Feature,选择 Render Objects,然后对 Render Objects 做如下设置:

在这里插入图片描述

在这里插入图片描述

Event 设为 AfterRenderingOpaques,Layer Mask 设为 Stencil Layer 1,这样层级为 Stencil Layer 1 的物体会在 Opaque (不透明)的物体之后渲染,Opaque 的物体可以见刚刚设置的 Filtering 中 Opaque Layer Mask 的物体:

在这里插入图片描述

我们的传送门物体默认是 Default 层级,因此虚拟世界的渲染会在传送门之后发生。

在 Render Objects 中的 Overrides 里,需要把 Stencil 勾选上。
Value 设为 1,它是预先设置的参考值。
Compare Function 为 Equal,意思是参考值与模板缓冲区中的值相等,则通过模板测试。
Pass 和 Fail 为 Keep,意思是有没有通过模板测试都会保留模板缓冲区中的值。

📕给传送门添加 Stencil Shader

我们在传送门门口的这块区域放一个空物体,然后给它添加之前创建的 Stencil Mask 材质。

在这里插入图片描述
如果之前的设置都正确的话,你就能只透过传送门的门口,看到门口后的虚拟世界。

📕模板测试全流程解释

现在,我们对产生现在的视觉效果流程做一个详细的解释。首先因为 URP 配置文件中设置了 Stencil Layer 1 会在 Opaque 物体之后渲染,而传送门物体的层级是 Default,属于 Opaque Layer Mask,所以虚拟世界会比传送门后渲染。

因为门口的 Shader 为 Stencil Shader,它会先参与模板测试。我们看一下 Shader 中设置的模板测试条件:

在这里插入图片描述
Comp 比较方式为 Always,意味者它总是会通过模板测试。Pass 为 Replace,意味着通过模板测试后它会把模板缓冲区中的值替换成 Stencil ID 参考值。我们给它设置的参考值是 1,因此门这块区域的模板缓冲区中保存的值被替换成了 1。

在这里插入图片描述

接下来轮到门后的虚拟世界参与模板测试。门的这块区域的模板缓冲区保存的值是 1,等于我们给 Stencil Layer 1 设置的参考值 1,所以门这块区域通过模板测试,像素被保留,我们能够透过门看到位于门后的虚拟世界,而其他地方的模板缓冲区中的值还是默认的 0,与 1 不相等,所以门以外的区域没有通过模板测试,像素不被渲染,我们就在其他区域看不到虚拟世界了。

📕在虚拟与现实之间穿梭

此时如果我们运行程序,虽然我们能看到传送门的视觉效果,但是当我们把头伸进传送门内部的时候,就看不到传送门内的虚拟世界了,仿佛传送门物体就是一张薄纸片。为了解决这个问题,我们需要判断玩家是否进入到传送门内,然后动态修改视觉效果,这部分教程我会作为进阶教程分享在 Spatial XR 社区,大家可以从文章顶部的链接加入。

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

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

相关文章

《Vid2Seq》论文笔记

原文链接 [2302.14115] Vid2Seq: Large-Scale Pretraining of a Visual Language Model for Dense Video Captioning (arxiv.org) 原文笔记 What: 《Vid2Seq: Large-Scale Pretraining of a Visual Language Model for Dense Video Captioning》 作者提出一种多…

深度学习检测算法YOLOv5的实战应用

在当前的检测项目中,需要一个高效且准确的算法来处理大量的图像数据。经过一番研究和比较,初步选择了YOLOv5作为算法工具。YOLOv5是一个基于深度学习的检测算法,以其快速和准确而闻名。它不仅能够快速处理图像数据,还能提供较高的…

【OceanBase诊断调优】——hpet(高精度时钟源)引起的CPU高问题排查

最近总结一些诊断OCeanBase的一些经验,出一个【OceanBase诊断调优】专题出来,也欢迎大家贡献自己的诊断OceanBase的方法。 1. 前言 昨天在问答区帮忙排查一个用户CPU高的问题,帖子链接:《刚刚新安装的OceanBase集群,…

Rime 如何通过 iCloud 实现词库多端同步,Windows、iOS、macOS

Rime 如何通过 iCloud 实现词库多端同步,Windows、iOS、macOS 一、设备环境 最理想的输入环境就是在多端都使用同一个词库,这样能保持多端的输入习惯是一致的。 以我为例,手头每天都要用到的操作平台和对应的输入法: 操作系统设…

【热门前端【vue框架】】——vue框架和node.js的下载和安装保姆式教程

👨‍💻个人主页:程序员-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

【ARM 裸机】模仿 STM32 驱动开发

1、修改驱动 对于 STM32 来说,使用了一个结构体将一个外设的所有寄存器都放在一起,在上一节的基础上进行修改; 1.1、添加清除 bss 段代码, 1.2、添加寄存器结构体 新建一个文件,命名imx6u.h,注意地址的连…

NLP Step by Step -- How to use pipeline

正如我们在摸鱼有一手:NLP step by step -- 了解Transformer中看到的那样,Transformers模型通常非常大。对于数以百万计到数千万计数十亿的参数,训练和部署这些模型是一项复杂的任务。此外,由于几乎每天都在发布新模型&#xff0c…

Linux系统网络---DNS域名解析服务

目录 一、DNS的简介 DNS系统的分布式数据结构👇 DNS系统类 两种查询方式 二.正向解析实验 1.先关闭防火墙、selinux 2.安装bind 3.查看配置、修改配置 4.修改区域配置文件 正向解析👇 反向解析👇 5.修改 正向解析&#x1f…

python环境安装jupyter

1 前提条件:python环境 系统:win10 python:本地已经有python,可以查看本地的python版本: C:\Users\PC>python --version Python 3.8.10 2 安装jupyter并启动 安装jupyter C:\Users\PC>pip install jupyter …

Qt xml示范

1.数据格式 #ifndef XML_DATA_H #define XML_DATA_H#include<QWidget>struct Student {int s_id;QString s_name;double s_math_score;double s_english_score;}; struct Teacher{int t_id;QString t_name;QVector<Student> t_students_v; };#endif // XML_DATA_H…

面试:JVM垃圾回收

一、三种垃圾回收算法 1、标记清除&#xff08;已废弃&#xff09; 找到根对象&#xff08;局部变量正在引用的对象、静态变量正在引用的对象&#xff09;&#xff1b;沿着根对象的引用链&#xff0c;查看当前的对象是否被根对象所引用&#xff0c;若被引用&#xff0c;则加上…

区块链 | OpenSea 相关论文:Toward Achieving Anonymous NFT Trading(一)

​ &#x1f951;原文&#xff1a; Toward Achieving Anonymous NFT Trading &#x1f951;写在前面&#xff1a; 本文对实体的介绍基于论文提出的方案&#xff0c;而非基于 OpenSea 实际采用的方案。 其实右图中的 Alice 也是用了代理的&#xff0c;不过作者没有画出来。 正文…

UEFI安全启动模式下安装Ubuntu的NVIDIA显卡驱动

UEFI安全启动模式下安装ubuntu的nvidia显卡驱动 实践设备&#xff1a;华硕FX-PRO&#xff08;NVIDIA GeForce GTX 960M&#xff09; 一、NVIDIA官网下载驱动 1.1在浏览器地址栏输入https://www.nvidia.cn/drivers/lookup/进入网站&#xff0c;接着手动驱动搜索&#xff0c;并…

The Clock and the Pizza [NeurIPS 2023 oral]

本篇文章发表于NeurIPS 2023 (oral)&#xff0c;作者来自于MIT。 文章链接&#xff1a;https://arxiv.org/abs/2306.17844 一、概述 目前&#xff0c;多模态大语言模型的出现为人工智能带来新一轮发展&#xff0c;相关理论也逐渐从纸面走向现实&#xff0c;影响着人们日常生活…

探讨mfc100u.dll丢失的解决方法,修复mfc100u.dll有效方法解析

mfc100u.dll丢失是一个比较常见的情况&#xff0c;由于你电脑的各种操作&#xff0c;是有可能引起dll文件的缺失的&#xff0c;而mfc100u.dll就是其中的一个重要的dll文件&#xff0c;它的确实严重的话是会导致程序打不开&#xff0c;系统错误的。今天我们就来给大家科普一下mf…

太速科技-多路PCIe的阵列计算全国产化服务器

多路PCIe的阵列计算全国产化服务器 多路PCIe的阵列计算全国产化服务器以国产化处理器&#xff08;海光、飞腾ARM、算能RSIC V&#xff09;为主板&#xff0c;扩展6-8路PCIe3.0X4计算卡&#xff1b; 计算卡为全国产化的AI处理卡&#xff08;瑞星微ARM&#xff0c;算能AI&#x…

【stm32】swjtu西南交大嵌入式实验三 外部中断实验:按键中断

实验内容&#xff1a; 1、编写程序&#xff0c;设置主程序&#xff1a;跑马灯以 0.2s 的速度旋转&#xff1b;将 KB1 设置为外部中断&#xff0c;下 降沿触发&#xff0c;按下 KB1 则全彩灯的 R 灯闪烁 5 次。编译、下载程序到开发板&#xff0c;观察实 验现象&#xff1b;按下…

阶跃星辰:探索智能科技的星辰大海

引言 在当今快速发展的科技时代&#xff0c;人工智能已经成为推动社会进步的重要力量。阶跃星辰&#xff0c;正是在这一背景下诞生的。 阶跃星辰是一家专注于通用人工智能探索的公司&#xff0c;成立于2023年4月。该公司的创始团队由一群对人工智能充满热情和渴望的人组成&am…

LM1875L-TB5-T 音频功率放大器 PDF中文资料_参数_引脚图

LM1875L-TB5-T 规格信息&#xff1a; 商品类型音频功率放大器 音频功率放大器的类型- 输出类型1-Channel (Mono) 作业电压16V ~ 60V 输出功率25W x 1 4Ω 额外特性过流保护,热保护 UTC LM1875是一款单片功率放大器&#xff0c;可为消费类音频应 用提供极低失真和高品质的…

物联网鸿蒙实训解决方案

一、建设背景 在数字化浪潮汹涌的时代&#xff0c;华为鸿蒙系统以其前瞻的技术视野和创新的开发理念&#xff0c;成为了引领行业发展的风向标。 据华为开发者大会2023&#xff08;HDC. Together&#xff09;公布的数据&#xff0c;鸿蒙生态系统展现出了强劲的发展动力&#x…