【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.pswp.cn/pingmian/77148.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77148.shtml
英文地址,請注明出處:http://en.pswp.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%,…