多层Unity3D物体模型穿透问题处理

2023-11-04

本文针对在一个界面中展示多层3D物体时遇到的模型穿透问题提出一些解决方案

如图,当我们想要在同一个界面中展示两层或以上3D物体时,有时会因为第一层物体材质上的 shader 渲染深度被破坏或其它原因导致第一层的物体穿透到第二层界面上来了。

在 Scene 视图中这三个橙色球体原本是在第二层黄色背景之下的:

在Scene视图中这三个橙色球体原本是在第二层黄色背景之下的

但是在 Game 视图中我们发现那三个橙色球体居然跑到第二层黄色背景之上来了,这就出现了模型穿透问题:

但是在Game视图中我们发现那三个橙色球体居然跑到第二层黄色背景之上来了,这就出现了模型穿透问题

由于以上两层3D物体的展示是在同一个界面上的,所以无法通过设置每个界面独立的 SortingLayer 来解决问题。此时可以通过设置第一层物体材质上的 shader 渲染深度解决问题:

首先在所有3D物体的 shader 文件中的 Properties 及 SubShader 中加入以下代码,其中的默认值可以根据实际需要进行更改:

Properties 中:
		_Stencil("Stencil ID", Float) = 2
		_StencilComp("StencilComp", int) = 6
		_StencilPass("StencilPass", int) = 0

SubShader 的 Pass 中:
			Stencil
			{
				Ref[_Stencil]
				Comp[_StencilComp]
				Pass[_StencilPass]
			}

加完部分效果如下图:

在这里插入图片描述

加完之后可以根据这三个枚举值,设置3D物体的渲染深度。具体用法与规则可以参考下这篇文章:Stencil 在 Unity 中的使用

具体解决思路是:首先在第二层界面上使用一个遮罩挡住第一层界面上的3D物体。这个遮罩使用的 shader 需要设置成大于第一层3D物体并同时小于第二层3D物体的渲染深度。比如说,假如第一层3D物体设置的 Stencil ID 、StencilComp、StencilPass (这个枚举值在有的地方也叫 Stencil Operation ) 三个枚举值分别为2、6、0,此时遮罩就可以设置成2、8、2,这样就可以在挡住第一层的3D物体的同时,不影响第二层的3D物体。具体效果如下:

第一层3D物体的 shader 渲染深度枚举值:

在这里插入图片描述

用于挡住第一层3D物体的遮罩 shader 渲染深度枚举值,其中 Always 表示 8 ,Replace 表示 2 :

在这里插入图片描述

第三层3D物体的 shader 渲染深度枚举值:

在这里插入图片描述

加载3D物体时设置当前实例 shader 渲染深度枚举值方法如下:(这种方式只会修改当前加载的物体,而不会对其它同样使用这个 shader 文件的对象产生影响)

	local skinnedMeshArray = go.transform:GetComponentsInChildren(typeof(UnityEngine.Renderer))
    if skinnedMeshArray.Length <= 0 then
        return
    end
    for i = 0, skinnedMeshArray.Length - 1 do
        local skinnedMesh = skinnedMeshArray[i]
        for j = 0, skinnedMesh.materials.Length - 1 do
            skinnedMesh.materials[j]:SetInt("_Stencil", 2)
            skinnedMesh.materials[j]:SetInt("_StencilComp", 6)
            skinnedMesh.materials[j]:SetInt("_StencilPass", 0)
        end
    end

如此一来,就可以实现分层管理3D物体,从而不出现模型穿透现象了。希望本文能够对你有所帮助,以上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多层Unity3D物体模型穿透问题处理 的相关文章

  • 基于 Q3DScatter 的自定义图表,QCustom3DItem 运行缓慢

    我想制作一个带条形的 3D 图表 条形颜色取决于其大小 两个都Qt 条形图和散点图类型 https doc qt io qt 5 qtdatavisualization overview html接近我正在寻找的东西 我最终创建了一个基于的
  • 如何在Android中渲染OBJ或FBX? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有几个 obj 和 fbx 格式的 3D 对象 其中包含 mtl 和纹理文件 我想知道哪个是在 An
  • 点列表的 3D 轮廓(凹壳)

    我有一个 C 中的 Vector3 点列表 我需要计算这些点的凹轮廓 确实有很多参考资料 特别是对于 凸 分辨率 由于格雷厄姆算法 我已经成功实现了 然而 由于我现在需要有效地计算凹轮廓 所以我迷失了 维基百科确实列出了很多用于凸计算的资源
  • 可点击的精灵标签?

    我一直在玩精灵文本标签 更具体地说是这个例子 http stemkoski github io Three js Sprite Text Labels html http stemkoski github io Three js Sprit
  • 一次性渲染阴影

    考虑到阴影投射的成本 我想知道对于动态定位的静态对象 例如 程序城市 是否有一个功能或可能 实验性的方法可以在 Three js 中仅渲染一次阴影贴图 甚至在 webgl 中 因此 结果可以在静态对象的下一帧中免费使用 仅当物体移动时才会进
  • Unity3D:在 AA 解析后绘制粒子以提高性能

    我正在尝试评估 MSAA 对 Unity 中含有大量粒子的场景的影响 为此 我需要 使用 8x MSAA 绘制场景中的所有非粒子对象 使用上一个通道中解析的深度缓冲区来渲染所有 将非遮挡粒子系统转移到较小的渲染目标上 将 2 的颜色缓冲区与
  • 如何创建热图来说明控制发散调色板中心颜色位置的网格差异?

    我有两个人脸 3D 网格 我希望使用热图来说明差异 我想使用红蓝发散色阶 我的数据可以查到here https github com Patricklv How to create heatmap illustraing 3D mesh d
  • 我应该如何格式化 .dat 文件以便制作 3D 矢量图?

    我正在为大学做这个编程任务 我们必须写一个c 计算 3D 空间中某些线圈的磁场矢量的程序 我已经成功编写了这个程序 并且我认为它运行得很好 不过 我想添加一个特殊的东西 这是我的试卷 所以它必须特别好 我想绘制出向量 我习惯打电话gnupl
  • 如何将平面上的 3D 点转换为 UV 坐标?

    我有一个 3d 点 定义为 x0 y0 z0 该点属于一个平面 定义为 a b c d normal a b c and ax by cz d 0 如何将 3d 点转换或映射为一对 u v 坐标 这一定是非常简单的事情 但我无法弄清楚 首先
  • 判断点是否在截锥体内

    我正在尝试找出确定一个点是否在截锥体内的最佳方法 我有一些工作 但不确定它是否太麻烦 也许我应该有一种更优雅 有效的方法来做到这一点 假设我想查明点 x 是否在截锥体内 一旦我知道了平截头体的 8 个点 4 个近点 4 个远点 的位置 我就
  • DirectX::SpriteFont/SpriteBatch 阻止 3D 场景绘制

    我使用时遇到问题DirectX SpriteFont DirectX SpriteBatch 来自 DirectXTK 与此处讨论的问题完全相同 使用 SpriteFont 类绘制文本时出现问题 https stackoverflow co
  • 如何在不使用 Kinect SDK 函数的情况下将深度空间中的点转换为 Kinect 中的颜色空间?

    我正在做一个增强现实应用程序 将 3D 对象叠加在用户的彩色视频之上 使用 Kinect 1 7 版本 虚拟对象的渲染在 OpenGL 中完成 我已经成功地在深度视频上叠加了 3D 对象 只需使用 NuiSensor h 标头中深度相机的固
  • 如何从横滚、俯仰和偏航获取相机向上矢量?

    我需要从滚动角 俯仰角和偏航角 以度为单位 获取相机的向上矢量 以获得正确的外观 我已经尝试了几个小时不同的事情 但没有运气 这里的任何帮助将不胜感激 横滚 俯仰和偏航定义 3 轴旋转 从这些角度 您可以构建一个 3x3 变换矩阵来表达该旋
  • 在 Unity 中平滑动态生成的网格?

    给定 Unity 和 C 中的网格 其本身是通过合并更简单的基础网格实时创建的 我们如何在运行时 将其变成平滑的 几乎像包裹在布中的网格版本一样 不是完全凸出的版本 而是更圆润 软化锋利的边缘 桥接深间隙等 理想情况下 表面也将像 平滑角度
  • 在 R 中根据时间序列数据制作 3D 曲面

    我有一个大型数据集 我想从中制作 3D 表面 我希望 x 轴为日期 y 轴为时间 24 小时 z 轴 高度 为我的值 我是 R 初学者 所以越简单越好 http www quantmod com examples chartSeries3d
  • 计算任意网格的平面 UV 坐标

    我有从二维形状生成三角形网格的代码 因为在大多数情况下 这些形状在表面上的顶点分布不均匀 所以我在生成 UV 时遇到了问题 这样就不会导致纹理扭曲 任何人都可以推荐一些讨论平面网格上 UV 计算技术的文章 书籍 代码示例吗 谢谢 好的 让我
  • 在 matlab 中求 3d 峰的体积

    现在我有一个带有峰值的 3D 散点图 我需要找到其体积 我的数据来自图像 因此 x 和 y 值表示 xy 平面上的像素位置 z 值是每个像素的像素值 这是我的散点图 scatter3 x y z 20 z filled 我试图找到数据峰值的
  • 在 R 中绘制 3D 数据

    我有一个 3D 数据集 data data frame x rep c 0 1 0 2 0 3 0 4 0 5 each 5 y rep c 1 2 3 4 5 5 data z runif 25 min data x data y 0 1
  • 现代 GPU 上的纹理更改(和其他状态更改)成本

    我正在编写一个基于场景图的图形引擎用于建模目的 我正在使用 XNA 4 在我读过的许多地方 渲染期间应该最小化纹理变化 和其他状态变化 因此我必须按材质等对图元进行排序 我在 XNA 4 中创建了一个小型测试应用程序 它使用单个纹理渲染数百
  • 如何在 R 中导入并绘制三角形网格?

    我想在 R 中绘制我的模型输出 它是格式为的三角形网格 x1 y1 z1 x2 y2 z2 x3 y3 z3 value 每行代表一个三角形 我想用以下方法绘制这些三角形value作为规模 mymesh lt structure c 0 9

随机推荐

  • KEIL 调试的 ini 文件有什么用?

    在初学者眼里 调试手段很多 自己平常使用调试手段的具有局限性 单一性 碰到复杂的问题还是很难解决 比如看watch窗口 memory窗口 打断点这些基本的调试手段 就比如新接手中的一个项目 总是会出现串口通信错误 我也知道这是两次数据发送混
  • 轻松拥有美国号码,免费收发短信

    轻松拥有美国号码 免费收发短信 标签 美国 刚刚 国外许多购物 服务 支付等网站注册都需要手机号码验证身份 然而中国的手机号码并不能满足 E g 美区PayPal 在支持PayPal购物的网站利用美区PayPal 可以绕过国卡限制 说道虚拟
  • SQL随机查询

    SQL Server Select TOP N From tablename Order By NewID NewID 函数将创建一个 uniqueidentifier 类型的唯一值 上面的语句实现效果是从Table中随机读取N条记录 Ac
  • React实现插入变量输入框

    React实现变量输入框 组件功能描述 组件效果 组件使用示例 组件实现代码 查看视频效果图代码 组件功能描述 本组件结合antd中的Form和Input组件实现一个变量输入框 该输入框可插入多个变量 其中变量格式为 X1 X2 X3 X4
  • 怎样利用闲鱼赚差价?教你在闲鱼卖货赚钱!

    闲鱼这个二手平台 本质上 是以兴趣鱼塘为媒介 聚拢相同爱好的圈子 让大家彼此交流 出售一些自己用不上的东西 有环保的理念 初衷很好 有需求就有供应 慢慢的很多人以此为主来销售一些产品 相对其他的购物平台来说 他不需要押金 没那么多复杂的规则
  • java 判断输入字符串String 是否为合法数值或两位小数数值double类型

    java 判断输入字符串String 是否为合法数值或两位小数数值double类型 import java util regex Matcher import java util regex Pattern 判断是否为合法 Double类型
  • npm打包失败的原因

    npm打包失败的原因 1 modules依赖安装有没有问题 版本对不对得上 2 node版本不一致 有一些api高版本才有 node v16以上的就兼容了m1芯片的 3 less编译没过 或者其它编译没过 或者将cache loader关掉
  • Opencv2.4.9源码分析——K-Nearest Neighbors

    一 原理 K近邻算法 KNN K NearestNeighbors 是一种非常简单的机器学习方法 它既可以处理分类问题 也可以处理回归问题 而且它的执行效果非常好 KNN是一种懒惰学习算法 lazy learningalgorithm 所谓
  • 动手学深度学习_全卷积网络 FCN

    全卷积网络 fully convolutional network FCN 顾名思义 网络中完全使用卷积而不再使用全联接网络 全卷积网络之所以能把输入图片经过卷积后在进行尺寸上的还原 就是利用转置卷积实现的 因此 输出的类别预测与输入图像在
  • new和delete的底层原理以及模板

    本文主要内容 new和delete的底层原理 什么是模板 模板怎么使用 模板可以声明定义在两个文件里面吗 new和delete的底层原理 前面我们谈了new和delete的使用 以及和C语言里面malloc和free的差别 但是 new和d
  • 密码学理论09:数论和密码学困难问题

    整数模N 符号 Z N Z gt 0 gcd a N 对于 a N Z 令 gcd a N 为最大的 d Z gt 0 使得 d a 和 d N ZN ZN N 除法 余数 模数 令a为整数且令N为正整数 那么存在唯一的整数 q r 其中
  • 计算机丢失disrupt,disrupt造句

    1 In mice the pathogen Citrobacter rodentium can disrupt this layer and cause inflammation and diarrhea 2 Women interrup
  • 指针定义(一级指针和二级指针)以及内存四区

    1 一级指针 1 定义 类型 指针变量名 变量 Int p a 地址 地址是内存的位置编号 是常量不可以修改 指针 一般指指针变量 用来存放地址的 是可以被修改的 2 二级指针 指向一级指针 保存的是一级指针的地址 Int p x int
  • 深搜(dfs)和广搜(bfs)

    深搜 dfs 和广搜 bfs 广搜可以用来解决最小路径问题和连通性问题 深搜可以解决连通性问题 实现方式 深搜用函数递归实现 广搜用队列实现 问题 输入地图判断连通性和最小路径 每次只能走上下左右 S为起点 T为终点 为障碍物 可以走 如以
  • Dart 2.18 正式发布

    互操作性增强 平台特定的网络组件 优化类型推断 以及空安全语言里程碑的近期更新 文 Michael Thomsen Google Flutter Dart 产品经理 Dart 2 18 稳定版也随着 Flutter 3 3 稳定版一起发布
  • 智能车制作——速度环PID

    做了智能车写这个做个记录 各位大佬勿喷 PID控制器 PID 控制器 比例 积分 微分控制器 是一种通过控制系统的偏差来调整输入信号的线性反馈控制算法 通俗的说 它可以给出使执行器 电机 快速准确到达目标的 指导方案 反馈 反馈是指将系统输
  • 基于深度学习和自闭症脑成像数据库(ABIDE)识别自闭症谱系障碍

    ASD是一种以大脑为基础的疾病 其特征是社会缺陷和重复行为 根据美国疾病控制中心最近的数据 美国68名儿童中就可能有1名患有自闭症 本研究的目的是基于深度学习算法从大型脑成像数据集中识别自闭症谱系障碍 ASD 患者 本文调查了一个ASD患者
  • Java代码之JDBC实现数据库之间定时的表格传输(由一个库读取到另一个库)实例

    本代码主要是JDBC和Java定时器 注释很详细 希望对大家有用 有什么不明白的可以在评论处留言 共同探讨 package first import java sql Connection import java sql DriverMan
  • R语言深度学习:强化学习入门

    专栏内含有很多案例供参考 目录 1 强化学习基础 2 强化学习的一个简单例子 玩游戏 结论 在今天的博客中 我们将一起探索强化学习 Reinforcement Learning 的世界 强化学习是深度学习的一个重要领域 它让机器通过与环境的
  • 多层Unity3D物体模型穿透问题处理

    本文针对在一个界面中展示多层3D物体时遇到的模型穿透问题提出一些解决方案 如图 当我们想要在同一个界面中展示两层或以上3D物体时 有时会因为第一层物体材质上的 shader 渲染深度被破坏或其它原因导致第一层的物体穿透到第二层界面上来了 在