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 One
			ZWrite Off

			Stencil
			{
				Ref [_StencilID]
				Comp Always
				Pass Replace
				Fail 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.mfbz.cn/a/573771.html

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

相关文章

详解Qt中的鼠标事件

在Qt中,处理鼠标事件是构建交互式界面的关键。Qt提供了一系列与鼠标相关的事件处理函数,允许开发者捕获鼠标的各种动作,如按下、释放、移动、双击等。以下是鼠标事件的使用方法、技巧以及注意事项,并附带C代码示例。 基础使用方法…

Git学习笔记(四)远程仓库

根据前面几篇文章的介绍,在本地使用Git基本不成问题了,常用的基本命令和一些基本概念基本也介绍完毕了。这一张主要讲讲远程仓库的创建和使用。 概念 其实在前面第一篇文章中,我们就简单介绍过远程仓库,它其实就是一个托管在远程服…

ROS标定海康威视摄像头

ROS视摄像头标定----海康威视 引言: ​ 摄像头标定是为了确保视觉系统能够准确反映现实世界中的对象,并消除图像中的畸变效果。在本实验中,我们使用了ROS中的功能包进行摄像头标定。标定的原理包括畸变校正和摄像头参数估计。通过移动标定板并…

java 创建和请求sse服务

主要依赖 <!--spring-boot父工程--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version></parent><dependency><gro…

SAP采购订单-条件类型-配置开发步骤

由于采购业务变更&#xff0c;需要创建新的价格类型&#xff0c;并添加新的计算逻辑计算。首先在例程&#xff08;VOFM&#xff09;中创建计算逻辑&#xff0c;然后在系统配置&#xff08;SPRO&#xff09;中找到配置点&#xff0c;创建新的条件类型‘ZMM00’,创建定价过程‘ZM…

算法-动态规划专题

文章目录 前言 : 动态规划简述1 . 斐波那契模型1.1 泰波那契数列1.2 最小花费爬楼梯1.3 解码方法 前言 : 动态规划简述 动态规划在当前我们的理解下,其实就是一种变相的递归,我们查看一些资料也可以知道,动态规划其实属于递归的一个分支,通过把递归问题开辟的栈帧通过一定的手…

模拟信号的离散化

本文介绍模拟信号的离散化。 1.采样定理 定义&#xff1a;若想重建输入的模拟信号&#xff0c;采样频率必须大于等于输入模拟信号最高频率的2倍&#xff0c;即&#xff1a; 其中&#xff0c;为采样频率&#xff0c;为输入模拟信号最高频率 否则&#xff0c;信号会发生混叠 2…

榕城·江上图三居装修攻略,硬装费用18万。福州中宅装饰,福州装修

设计亮点 **方案分析:** 整体墙面采用纯白色为主&#xff0c;搭配木质元素设计&#xff0c;室内铺设浅色木地板。客厅区域设计了一个嵌入式工作区&#xff0c;满足日常办公需求。餐厅、走廊和卧室充分利用每一处空间&#xff0c;扩大收纳空间。 **改造方案:** 1. 采用白色和原木…

Emby for Mac 1.9.9中文激活永久使用(多媒体影音库)

Emby 是一款流媒体服务器软件&#xff0c;可以用于在不同设备上共享音乐、电影、电视节目和照片等多媒体资源。用户可以将自己的媒体文件添加到Emby服务器中&#xff0c;并通过网络将它们发送到其他设备&#xff0c;如电视、手机、平板电脑等。 Emby for Mac 1.9.9中文激活下载…

Linux多进程(三) 信号信号集与统一事件源

信号是由用户、系统或者进程发送给目标进程的信息&#xff0c;以通知目标进程某个状态的改变或系统异常。Linux信号可由如下条件产生&#xff1a; 对于前台进程&#xff0c;用户可以通过输入特殊的终端字符来给它发送信号。比如输入CtrlC通常会给进程发送一个中断信号。系统异…

LeetCode:51. N 皇后

leetCode51.N皇后 题解分析 代码 class Solution { public:int n;vector<vector<string>> ans;vector<string> path;vector<bool> col, dg,udg;vector<vector<string>> solveNQueens(int _n) {n _n;col vector<bool> (n);dg …

如何在阿里云快速配置自动定时重启ECS云服务器?

背景 无论是电子商务、在线教育、游戏&#xff0c;还是流媒体等业务&#xff0c;服务器的稳定运行都是至关重要的。然而&#xff0c;在实际运行中&#xff0c;我们可能会遇到这样一些场景&#xff1a; 系统更新&#xff1a;一些操作系统或者软件的更新可能需要重启服务器才能…

政企版 WPS Pro 专业版注册安装教程

政企版 WPS Pro 专业版安装及激活步骤 第 1 步&#xff1a;下载压缩包&#xff08;内含注册码&#xff09;【无解压密码】。 第 2 步&#xff1a;解压缩后&#xff0c;运行 exe 文件&#xff0c;默认步骤安装即可。 第 3 步&#xff1a;安装完成后&#xff0c;新建一个 Word …

【Camera Sensor Driver笔记】五、点亮指南之Actuator配置

<slaveInfo> actuatorName dw9714v dirver IC 型号 slaveAddress 0x18 i2c write address i2cFrequencyMode FAST i2c 操作频率(400KHz) actuatorType VCM/BIVCM 马达类型 BIVCM&#xff08;中置马达&#xff…

Andorid进程间通信之 UNIX SOCKET

1&#xff0c;什么是UNIX SOCKET UNIX SOCKET&#xff0c;域套接字&#xff0c;UNIX SOCKET可用于同一台设备进程间通信&#xff0c;它不需要经过网络协议栈&#xff0c;不需要打包拆包、计算校验和、维护序列号应答等&#xff0c;只需要将数据从一个进程复制到另一个进程&…

WPS-EXCEL:快速删除多个线条对象

问题图 我需要将线条快速删除 方法一:使用定位对象功能 使用定位功能&#xff1a;按Ctrl G打开定位对话框。在对话框中&#xff0c;点击“定位条件”。 定位对象&#xff1a;在定位条件对话框中&#xff0c;勾选“对象”选项&#xff0c;然后点击“确定”。这样&#xff0c;…

git忽略文件配置 !

.gitignore中!表示取反 注意&#xff0c;如果父目录被排除&#xff0c;则父目录下的子目录也会被排除&#xff0c;此时对父目录下的子目录取反也不会生效&#xff0c;比如存在目录结构&#xff0c;再.gitignore目录下配置的 /*&#xff08;排除所有文件&#xff09;&#xff0c…

探索 Python 的动态类型系统:变量引用、不可变性及高效内存管理与垃圾回收机制的深入分析

文章目录 1. 动态类型及其内存管理解析1.1 变量与对象的引用关系1.2 对象的不可变性和内存地址的变化 2. 垃圾回收与内存优化策略2.1 动态内存分配的基础2.2 Python 的垃圾回收 Python作为一种流行的高级编程语言&#xff0c;以其代码的易读性和简洁性著称。尤其是它的动态类型…

U盘无法正常格式化?教你一个强力的办法

前言 电脑格式化U盘或者移动硬盘的操作&#xff0c;相信各位小伙伴都是有一定经历的。 如果设备正常&#xff0c;那么进入到【此电脑】&#xff0c;在对应的分区点击【鼠标右键】-【格式化】就可以把对应的存储设备恢复到初始状态。 但凡事都会有例外&#xff0c;比如在格式化…

SKF 与KISSSOFT的连接

SKF 与KISSSOFT的连接 HEDZER TILLEMA&#xff0c;荷兰SKF B.V.产品线经理 最近&#xff08;2019年&#xff09;&#xff0c;瑞典滚动轴承制造商斯凯孚&#xff08;SKF&#xff09;和瑞士齿轮箱设计软件开发商KISSsoft已将斯凯孚的轴承计算服务整合到KISSsoft的软件中。借助 K…