当前位置: 首页 > web >正文

PicoVR眼镜在XR融合现实显示模式下无法显示粒子问题

PicoVR眼镜开启XR融合现实显示模式下,Unity3D粒子效果无法显示问题,其原因是XR融合显示模式下,Unity3D应用显示层在最终合成到眼镜显示器时,驱动层先渲染摄像机画面,再以Alpha透明方式渲染应用层画面,问题就出在Alpha通道上:粒子显示位置的Alpha值为0。
在这里插入图片描述
究其原因,Unity3D在设置PicoXR视频融合模式时,需要将Camera设置为背景模式,背景色全黑,且背景色的Alpha值也为0。背景色的设置其实就是在BeginDraw时,用背景色清空渲染画布,值为0x00000000的背景色,初始画布为全黑透明画布。
在这里插入图片描述
渲染普通实体时,除了在画布上渲染颜色,还会将Alpha设置为255。而粒子一般用Additive叠加模式,其只会叠加画布颜色,不会修改画布Alpha透明度,导致最终合成时,粒子渲染颜色被替换为背景摄像机画面,看到的就是粒子画面全透明了,只有在实体表面才会有存留。
在这里插入图片描述
解决办法有两个:
其一是修改粒子的shader,让粒子shader渲染颜色同时,修改Alpha值。但这种方法要修改的东西很多,需要修改每个粒子的shader,工作量很大,而且不通用。
其二是增加一个后期shader,由后期shader统一处理最终提交给驱动的渲染画布。
操作如下:
1、创建一个后期着色器,在后期着色器中统一将有颜色的像素,根据色彩值修改Alpha值

Shader "Hidden/AlphaByColor" {Properties {_MainTex ("Base (RGB)", 2D) = "white" {}_Threshold ("Alpha Threshold", Range(0,1)) = 0.05}SubShader {Cull Off ZWrite Off ZTest AlwaysPass {CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct v2f {float4 pos : SV_POSITION;float2 uv : TEXCOORD0;};sampler2D _MainTex;float _Threshold;v2f vert (appdata_img v) {v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv = v.texcoord;return o;}fixed4 frag (v2f i) : SV_Target {fixed4 col = tex2D(_MainTex, i.uv);// 方法1:亮度检测float luminance = dot(col.rgb, float3(0.299, 0.587, 0.114));float newAlpha = smoothstep(_Threshold, _Threshold + 0.1, luminance);col.a = max(col.a, newAlpha);// 方法2:颜色通道检测(二选一)// float colorPresence = max(col.r, max(col.g, col.b));// col.a = step(_Threshold, colorPresence);return col;}ENDCG}}
}

2、挂载后期处理脚本

using UnityEngine;[ExecuteInEditMode]
public class AlphaPostProcess : MonoBehaviour
{public Material postProcessMaterial;[Range(0, 1)] public float threshold = 0.05f;void OnRenderImage(RenderTexture src, RenderTexture dest){postProcessMaterial.SetFloat("_Threshold", threshold);Graphics.Blit(src, dest, postProcessMaterial);}
}

在这里插入图片描述
这样处理以后,粒子就可以正常叠加在实景画面上了。

在这里插入图片描述

http://www.xdnf.cn/news/1996.html

相关文章:

  • 大模型扫盲之推理性能指标全面详解
  • linux系统问题杂谈
  • Framework模块编译脚本利器
  • KafkaSpark-Streaming
  • C语言数据类型全面解析:从入门到精通
  • Django【应用 01】django-plotly-dash安装及使用
  • Java 设计模式心法之第22篇 - 备忘录 (Memento) - 捕获与恢复对象状态的“时光机”
  • 力扣-160.相交链表
  • 制作一款打飞机游戏23:编辑器ui
  • kafka与flume的整合、spark-streaming
  • Virtio 技术解析 | 框架、设备实现与实践指南
  • 【分布式系统中的“瑞士军刀”_ Zookeeper】一、Zookeeper 快速入门和核心概念
  • EasyRTC音视频实时通话嵌入式SDK,打造社交娱乐低延迟实时互动的新体验
  • Golang日志模块之xlog
  • 58、微服务保姆教程(一)
  • classfinal 修改过源码,支持jdk17 + spring boot 3.2.8
  • BGE-m3 和 BCE-Embedding 模型对比分析
  • 深度强化学习(DRL)实战:从AlphaGo到自动驾驶
  • 三串口进行试验
  • Golang | 倒排索引
  • 前端技术Ajax实战
  • 机器学习基础理论 - 判别模型 vs 生成模型
  • Kafka和其他组件的整合
  • 从零开始学习人工智能Day5-Python3 模块
  • 25%甘油(灭菌)保存菌液以及10%甘油(普通)保存蛋白的原理及操作-实验操作系列-010
  • 驱动开发硬核特训 · Day 21(下篇): 深入剖析 PCA9450 驱动如何接入 regulator 子系统
  • WordPress AI插件能自动写高质量文章吗,如何用AI提升网站流量
  • django.db.utils.OperationalError: (1050, “Table ‘你的表名‘ already exists“)
  • 第十四届蓝桥杯刷题——day20
  • 【大语言模型】大语言模型(LLMs)在工业缺陷检测领域的应用