问题描述:

在3D场景中使用Spine模型(2D), 因为Spine需要像Billboard类似的处理,永远是垂直与相机的, 所以一般情况下2D模型能正常显示且前后的阻挡关系也是没有问题的,如下图所示,一切都很美好.(这里用一个四边形,图中的福字表示2D模型)

可是如果后面蓝色的格子比较高,或者2D角色本身也比较高,那么就会出现模型穿插的问题,如下图所示:

如果吧2D模型竖立起来,前后关系肯定是没有问题的,所以也能避免模型穿插的问题,可是就没有Billboard效果,圆形的福字已经被压扁了,如下图:

所以现在的解决办法是,2D模型还是斜着放(不让这里的福压扁),而做深度检测的时候用竖立起来的那个模型所在的深度值(避免模型穿插问题,使前后关系看起来是正确的)

怎么才能既保证2D模型的正常显示(Billboard效果),又能有预期的前后遮挡关系(不穿模),鱼和熊掌是可以兼得的,解决思路来源:https://www.bilibili.com/video/BV1rr4y1c7wz

解决方案:

使用斜着的2D模型经过MVP变化后的结果进行渲染,但是在顶点变换的最后,需要用上面竖立时所处的深度值修改顶点的深度值,就能欺骗过VertShader与FragmentShader之间的深度检测环节,就可以达到预期想要的遮挡关系,防止前后穿模。

下面是将2D模型竖立起来,沿着2D模型的脚下旋转到垂直:

需要注意的是我们是从侧面来看,则是沿着ZY平面进行旋转的,所以需要先找到旋转的中心点(脚下),如这个四边形的旋转中心就是(z=0,y=-0.5),先将模型平移到旋转中心,然后进行ZY平面的旋转(角度和实际相机角度相关联),旋转结束后再做反向的平移操作即可, 而一般的spine模型制作应该都是将脚下的点设为锚点,所以也就可以省去旋转前后的两次平移操作。

完整的VertShader代码:

v2f vert (appdata v)
{v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);//在MVP变换之后再进行旋转操作,并修改顶点的Z值(深度)//弧度fixed radian = _angle / 180 * 3.14159;fixed cosTheta = cos(radian);fixed sinTheta = sin(radian);//旋转中心点(测试用的四边形, 正常的spine做的模型脚下旋转的点就是(0,0), 可以省去下面这一步已经旋转完成后的 +center操作)half2 center = half2(0, -0.5);v.vertex.zy -= center;half z = v.vertex.z * cosTheta - v.vertex.y * sinTheta;half y = v.vertex.z * sinTheta + v.vertex.y * cosTheta;v.vertex = half4(v.vertex.x, y, z, v.vertex.w);v.vertex.zy += center;float4 verticalClipPos = UnityObjectToClipPos(v.vertex);o.vertex.z = verticalClipPos.z / verticalClipPos.w * o.vertex.w ;return o;
}

最终效果(Game窗口)达到预期:

【Unity Shader】2D模型 3D模型混用的穿模问题(Spine在3D场景中出现前后穿模问题的解决办法)相关推荐

  1. Unity Shader 之 简单实现物体被黑洞吸收吞噬(或者从黑洞中出来)的效果

    Unity Shader 之 简单实现物体被黑洞吸收吞噬(或者从黑洞中出来)的效果 目录

  2. Unity Shader 卡通渲染 实时模型动画描边的研究

    前言 卡通渲染也叫非真实感渲染(英文简写:NPR),"描边"在图形学和数字图像里都叫边缘检测.因此你可以在很多文献网站上面找到很多这类文献,但最后我发现基于图形学使用的方式基本都是 ...

  3. Unity Shader特效:人物模型动态流动光特效

    本文写于2017-6-6,转载请注明 以下为正文 ---------------------------------------------------------- 先上效果图: Shader界面图 ...

  4. 通过yolov5训练自己的模型中遇到的一些问题及解决办法

    引言 众所周知,跑深度学习的模型是非常需要好显卡的,虽然我的电脑拥有菜菜的显卡(GeForce 920MX),但也能跑起来.最近尝试着用YOLOV5做小项目,因为我菜菜的显卡,容量是真的不够,期间踩了 ...

  5. Unity Shader 2D水流效果

    水流的模拟主要运用了顶点变换和纹理动画的结合: 顶点变换中,利用正弦函数模拟河流的大致形态,例如波长,振幅等. 纹理动画中,将纹理坐标朝某一方向持续滚动以形成流动的效果. 脚本如下: 1 Shader ...

  6. unity shader 2D火焰流动特效

    效果图: /* *author:maki 火焰流动效果 */ Shader "Custom/FireLiner" {Properties{_Albedo("Albedo& ...

  7. UE4导入人物模型后,材质没有对应的材质插槽,导致材质贴图混乱,的解决办法

    刚用blender做完一个模型,还没来得及绑骨就先导到UE4里看看,结果一看材质没有贴到人物上,我的十几个材质,ue4只自动给我识别了几个材质到人物模型上. 一开始还以为是我的模型合并的时候材质会损失 ...

  8. Unity Shader:Waveform波形(1)-用正弦函数做闪烁效果并分析波形公式中的参数

    (图1:利用三角函数实现的闪烁动画) 由于GPU机制的特殊性,在写Shader做动画效果时,很多时候要用到三角函数. 实现上图中闪烁效果的Shader代码: float brightness=pow( ...

  9. 针对Unity导出的exe如果提示运行库报错或者系统缺少XX组件的对话框的话。一般解决办法如下:

    1.下载个VC程序的反编译依赖工具,(注意看使用介绍) 2.或者嫌麻烦,先下载个"微软常用运行库合集"给自己的电脑安装一下.看看问题解决了么?

最新文章

  1. 李彦宏说自动驾驶比人更安全,还认为中国用户更愿意放弃隐私
  2. 基于HttpClient的HttpUtils(后台访问URL)
  3. css杂项,清除浮动
  4. mysql int(3)与int(11)的区别详解
  5. 常见的js算法面试题收集,es6实现
  6. 基于DDD的.NET开发框架 - ABP工作单元(Unit of Work)
  7. java线程条件变量_使用条件变量(多线程笔记)
  8. [ZZ]关于内存中栈和堆的区别
  9. 关于虚数i和欧拉公式对旋转的一点启示
  10. quartz.net隔一天执行一次_母乳喂养多久喂一次最好?过度喂养危害大
  11. Nginx之rewrite配置
  12. c语言多线程的建立视频,如何用C语言实现多线程
  13. 常用类 (四) ----- Random随机数类
  14. Python知识点入门笔记——特色数据类型(字典)
  15. mysql服务启动失败原因
  16. CAD常用字体库大全
  17. IDEA kotlin项目报错 kotlin not configured
  18. c++二进制转化成十进制
  19. Vue 组件之间传值
  20. Customers Who Never Order

热门文章

  1. linux系统提示faralerror,Linux系统报错Fatal error, run database recovery如何解决
  2. iOS QQ第三方登录的简单实现
  3. 进制转换通用模板(以10进制转换为7进制为例)
  4. 数字图像处理1.3数字图像处理系统
  5. ubuntu环境下编译内核详解(linux kernel compile)
  6. 语义鸿沟_数字鸿沟是真实的,是痛苦的
  7. 分享几个实用的代码片段(附代码例子)
  8. python项目简历内容包括哪些方面_一份完整的简历包括什么?
  9. Janus源码分析(3)——请求处理过程
  10. 校园O2O商铺平台-扩展