Cocos游戏开发中类似CS的贴花效果

点击上方亿元程序员+关注和★星标

引言

Cocos游戏开发中的贴花效果

不知道 小伙伴们有没有玩过CS这款游戏呢?笔者能回忆到的是和小伙伴们在网吧连坐B41B51对喷的画面。

在这款 经典的FPS游戏中,有一个比较有意思的系统,那就是喷漆 (贴花Decal)系统。它就是一个能够在墙、地面等等地方进行涂鸦喷涂的功能。

言归正传,这样有趣有意思的功能,在我们游戏开发中是怎么实现的呢?

今天 重点给大家介绍一下如何在Cocos游戏开发中实现贴花效果,感谢小伙伴们一直以来的支持阅读与分享。

本文源工程在文末获取,小伙伴们自行前往。

1. 实现贴花的方法有哪些?

贴花效果常用于游戏开发中的涂鸦、弹孔、纹身等等效果。

2D游戏不同,在3D游戏开发中,我们要实现3D贴花需要考虑物体的深度和透视效果。

这意味着在实现时需要考虑顶点的位置、法线方向等因素。

下面 是笔者想到的几种在3D游戏中实现贴花效果的方法:

  1. 基于面片:我们可以把图片制作成一个面片,在游戏场景中将面片放置到指定坐标调整旋转即可,它的缺点就是仅支持一些平面例如墙、地板。

  2. 通过动态创建网格实现 :我们可以利用射线和长方体去对模型的Mesh进行切割裁剪出来我们需要的Mesh信息,然后把我们贴花的纹理映射上去,在通过utils.MeshUtils.createMesh进行创建。

  3. 通过Shader实现:我们可以利用深度图重建世界坐标的方式,来实现我们基于屏幕空间的贴花效果。

本文重点给介绍一下屏幕空间贴花效果。

2. 屏幕空间贴花

基于屏幕空间的贴花效果,比较巧妙,但需要一定的时间去理解。

它的原理是,利用一个长方体对象,与场景中的模型进行相交,然后把贴花的纹理影射到场景模型的表面。

我们需要在片元着色器中,利用深度图计算出屏幕空间坐标对应在世界空间中的位置,最后再转回到模型空间去,进行长方体裁剪和映射纹理。

有了解过渲染原理的小伙伴可以知道,我们正常的渲染流程大概如下:

模型空间 中的顶点->通过变换矩阵M ->世界空间 ->通过变换矩阵V ->视图空间 ->通过变换矩阵P ->裁剪空间 ->通过透视除法 ->NDC ->通过屏幕映射 ->屏幕空间中的片元。

我们只要把上述过程反过来,就可以把屏幕空间的坐标转回模型坐标。

这里面的核心问题就是,如何通过深度图去重建世界坐标。

大家 可以通过玉兔Cocos深度图重建世界坐标Shader贴花Decal等关键词进行搜索对核心原理涉及的内容先了解一下,会更容易理解贴花实现的原理。

3. 一起来实现贴花效果

1.资源准备

我们先去找美术妹子要一些贴花的纹理和简洁的场景,关键是凹凸不平的地面,比较好展示贴花的效果。

  • 环境:CocosCreator

  • 版本:3.8.2

2.构建Shader

首先 我们复制一个builtin-unlit.effect快速创建并自定义我们的Shader

然后 在顶点着色器中添加一个v_screenPos,把坐标传到片元着色器中去处理。

接着 在片元着色器接收v_screenPos,并根据以下片段进行处理:

其中 depthTexture就是我们的深度图,因为没办法直接在Shader 中获取,我们需要额外操作一下在脚本中把深度图传入到Shader,这套流程比较繁琐。

3.深度图的获取

先把 场景和我们进行贴花的长方体划分层级,分别为SCENEVIEWBOX

主摄像机的可见性改成SCENEVIEWBOX

添加 一张RenderTexture用于接收摄像机渲染的深度图。

主摄像机下添加一个子摄像机,可见性改成仅SCENE并绑定RenderTexture,其他参数保持与主摄像机一致。

最后 编写一个简单的脚本,完成将深度图传入Shader

添加 脚本和材质。

4.注意事项

由于Shader 中没有直接获取cc_matWorld的逆矩阵的方法,我们需要自己计算一下。

深度图的学习中还会接触到线性深度与非线性深度,可以了解一下。

5.效果演示

这样我们就成功地将我们的贴花贴在不平的地面上啦。

由于效果不够直观,我们添加一个拖拽脚本和碰撞体,实现简单地拖拽。

这样我们的贴花就可以动起来啦。

各种各样的贴花。

结语

曾几何时,我们以为我们怀念的是只是那几个经典的游戏,后来我们才明白我们怀念的只不过是童年的自己,是与小伙伴们相处的那一段无忧无虑的时光,如今都已不在。

以上就是在Cocos游戏开发中实现贴花效果的全部介绍。

需要完整源码 的小伙伴可下方链接或者通过阅读原文获取,付费只为正反馈,原创不易,感谢大家的支持。

store.cocos.com/app/detail/...

我是"亿元程序员",一位有着8年游戏行业经验的主程。在游戏开发中,希望能给到您帮助, 也希望通过您能帮助到大家。

AD:笔者线上的小游戏《填色之旅》《方块掌机经典》《贪吃蛇掌机经典》《重力迷宫球》大家可以自行点击搜索体验。

实不相瞒,想要个在看 !请把该文章分享给你觉得有需要的其他小伙伴。谢谢!

推荐专栏:

你知道和不知道的微信小游戏常用API整理,赶紧收藏用起来~

100个Cocos实例

8年主程手把手打造Cocos独立游戏开发框架

和8年游戏主程一起学习设计模式

从零开始开发贪吃蛇小游戏到上线系列

知识付费专栏

相关推荐
小妖6669 分钟前
css 中 content: “\e6d0“ 怎么变成图标的?
前端·css
L耀早睡1 小时前
mapreduce打包运行
大数据·前端·spark·mapreduce
HouGISer1 小时前
副业小程序YUERGS,从开发到变现
前端·小程序
outstanding木槿1 小时前
react中安装依赖时的问题 【集合】
前端·javascript·react.js·node.js
霸王蟹2 小时前
React中useState中更新是同步的还是异步的?
前端·javascript·笔记·学习·react.js·前端框架
霸王蟹2 小时前
React Hooks 必须在组件最顶层调用的原因解析
前端·javascript·笔记·学习·react.js
专注VB编程开发20年2 小时前
asp.net IHttpHandler 对分块传输编码的支持,IIs web服务器后端技术
服务器·前端·asp.net
爱分享的程序员3 小时前
全栈项目搭建指南:Nuxt.js + Node.js + MongoDB
前端
隐含3 小时前
webpack打包,把png,jpg等文件按照在src目录结构下的存储方式打包出来。解决同一命名的图片资源在打包之后,重复命名的图片就剩下一个图片了。
前端·webpack·node.js
lightYouUp3 小时前
windows系统中下载好node无法使用npm
前端·npm·node.js