热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

3D角色遮挡住UI的实现,关于StencilBuffer,描边,以及其他

3D角色遮挡住UI的实现,关于StencilBuffer,描边,以及其他我这么懒的人能会写这篇博客,主因是这个需求对我造成的大量伤害~~~起因最近服务器AI的工作刚刚阶段性完
3D角色遮挡住UI的实现,关于Stencil Buffer,描边,以及其他

我这么懒的人能会写这篇博客,主因是这个需求对我造成的大量伤害~~~

起因

最近服务器AI的工作刚刚阶段性完成,马上被策划拉过去做一个渲染的效果,需求是这样的:在游戏中被选中敌人是有一个红色描边的,同时会有一个感知箭头(一个UI提示图表),现在这两个都会显示在主角上面。现象如下

前面的这个怪物X假设为主角(原谅我只能拿以前项目的资源了,那公司黄了应该不会来找我吧~~),更远处的那个是怪物,白色格子是一个UI 图片,现在均可以渲染在主角上面,影响视觉感受。希望主角可以挡住描边以及特定UI。

这里要先提前说一下描边的实现,目前主要的描边实现方式有几种

(1)有的是渲染在角色上的,即对角色模型根据法线方向或者offset进行外扩,实现描边

(2) 类似于posteffect的方式,用一个摄像机单独渲染需要描边角色,然后对得到的rendertexture进行模糊放大,再cut off掉原图进而得到描边的rendertexture,然后合并到场景摄像机上面渲染即可。

(3) 根据模型法线方向以及view 方向进行计算,叠加颜色实现边缘光的效果。

项目现在的是第二种方法,后面代码部分会有展示,另外几种方式大家如果感兴趣可以自行google下,相关的帖子很多。

坑坑坑,biu 

于是乎~~这需求就是要某个3D角色可以盖住UI以及这个描边图呗。其实在最初的需求中是没有挡住描边的,所以我的第一个想法是利用Stencil Buffer。订制主角和UI的Shader,主角会写入特定的stencilValue,UI在这个值下不会通过stencil test,代码如下:

UI部分

	Stencil
	{
		Ref [_StencilValue]
		Comp NotEqual
		//Pass [_StencilOp] 
		//ReadMask [_StencilReadMask]
		//WriteMask [_StencilWriteMask]
	}

主角部分

	Stencil{
		Ref[_StencilValue]
		Comp Always
		Pass replace
	}

这样就应该是OK了!!(这里推荐一篇Stencil Buffer相关的博客:)在测试场景中,角色成功挡住了UI图标。然而,,在运行时,,并没有效果。。。Orz。。

经过测试,涉及stencil buffer的代码并没有问题。那么,只有一个可能是模板缓存被清掉。

谁偷走了我的Stencil Buffer?

上面提到过,我们的描边实现是posteffect的方式做的,在OnRenderImage中做了很多处理。在OnRenderImage中实现功能必然会使用到Graphics.Blits这个方法,类似代码:

void OnRenderImage(RenderTexture src, RenderTexture dest )
{
	Graphics.Blits(src,dest);
}
经过排查发现,注释掉上面代码之后效果恢复正常。

这是为什么呢!!!让我们看看官方的解释:



真是悲剧!描边兄给我挖了一个小坑。

解决方案

后续过程中,我把描边输出的RenderTexture输出到了Ugui中的一个Raw Image单独渲染,而不是在主摄像机中使用OnRenderImage方法把这张图渲染在摄像机中。这个描边图片同样使用UI订制的那个材质球,这样就会被主角挡住了。
下面会分享一个展示项目,包含了所有细节。
后续应该会优化描边中的blur shader,现在锯齿效果有点严重,可能会考虑下使用描边中第一种实现方式,那样效率应该会高上不少。
第一次分享博客哈,感觉写的丑的话大家就点赞鼓励下吧!

项目下载:http://pan.baidu.com/s/1bpiaqWv



推荐阅读
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • C#实现文件的压缩与解压
    2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ... [详细]
  • HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送www方式的数据。HTTP协议采用了请求响应模型。客服端向服务器发送一 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 微信小程序详解:概念、功能与优势
    微信公众平台近期向200位开发者发送了小程序的内测邀请。许多人对微信小程序的概念还不是很清楚。本文将详细介绍微信小程序的定义、功能及其独特优势。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 如何优化MySQL数据库性能以提升查询效率和系统稳定性 ... [详细]
author-avatar
mobiledu2502932447
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有