引言哈喽大家好我是亿元程序员一位有着8年游戏行业经验的主程。前几天在群里看到一条消息“有没有大佬有放大镜效果。”字越少需求越大。看到这句话我脑子里的第一反应也是上Shader。刚想回复我突然想到一个问题放大镜明明可以用RenderTexture去实现为什么第一反应是Shader其实不仅仅是放大镜。水波用Shader。溶解用Shader。流光用Shader。角色受击闪白也用Shader。仿佛游戏开发里只要效果稍微神秘一点最后都会收到同一张病历单建议Shader早晚各一次写完真机观察。所以本期文章笔者不打算只给大家扔一份放大镜代码。扔两份哈哈我们会在Cocos游戏开发中分别用RenderTexture和Shader实现同一个效果再顺便回答标题里的问题为什么大家都那么喜欢用Shader它是真的香还是看起来比较像大佬本文示例工程在文末获取小伙伴们自行前往。RenderTextureShader先别急着写代码Shader到底是什么很多人第一次听到Shader脑子里出现的是绿色代码雨、复杂公式以及一位凌晨两点还在调颜色的程序猿。其实可以先把它理解得粗暴一点Shader是运行在GPU上的一段小程序负责告诉GPU顶点放在哪里、像素最终是什么颜色。在普通业务代码里我们经常按对象处理这个按钮隐藏那个角色移动这个弹窗打开。Shader的思路不太一样。它更像是在说“所有经过这里的像素都按这套规则处理。”这也是大家喜欢Shader的原因之一。接下来直接实战。实战一RenderTexture用相机拍先看不写Shader的方案。正常情况下Camera把画面渲染到屏幕。但我们也可以让第二台Camera把结果渲染到一张纹理这张纹理就是RenderTexture。再把RenderTexture放进一个圆形Mask链路就变成1.为什么要准备隐藏副本捕获相机应该只看到需要放大的内容不能看见放大镜自己。否则镜片捕获镜片镜片里又出现镜片最后得到一个无限套娃效果。所以示例中准备了Artwork主相机正常显示的图片。CaptureArtwork放在独立Layer只让捕获相机看到。Lens圆形Mask、RenderTexture内容和镜框。2.创建 RenderTexture这里做了三件事1.创建一张256 x 256的纹理。2.让捕获相机把结果画进去。3.把纹理交给镜片Sprite显示。3.如何控制放大倍数orthoHeight越小相机看到的范围越少。假设镜片直径是220放大倍数是2相机只捕获约110高度的内容再把它铺满220的镜片就得到了2倍放大。4. 让相机跟随手指先把触摸点转换到图片内部再映射到隐藏副本的世界坐标捕获相机就能找到对应位置。手指松开后我们同时隐藏镜片并停用捕获相机。实战二Shader让像素自己走过来RenderTexture很万能但为了放大一张静态Sprite我们增加了副本、Camera、Layer、RenderTexture和Mask。也不是不能用只是有点像为了挖一根葱认真采购了一台挖掘机。然而Shader版只需要原来的Sprite。一个Material。一段跟随触摸点更新参数的脚本。这也是Shader受欢迎的另一个原因当效果能用像素规则描述时它往往可以减少额外的操作。1. UV 是什么UV可以理解为图片内部的坐标范围通常是0~1。U表示水平方向通常从左侧的0到右侧的1。V表示垂直方向也在0~1范围内具体上下方向可能因纹理来源而不同。正常情况下当前像素在什么UV就去纹理的对应位置取颜色。放大镜要做的是让镜片里的UV向圆心靠近假设zoom 2原来距离圆心0.2的采样点现在只去距离圆心0.1的位置取颜色。更小的纹理范围被铺进同样大的圆里视觉上自然就放大了。2. 判断当前像素在不在镜片里计算当前UV到镜片中心的距离小于半径显示放大画面。大于半径显示原画面。3. 把原图和放大图混起来圆外使用baseColor圆内使用magnifiedColor。再判断像素是否位于圆的边缘混入一层金色就有了镜框。**至于镜柄本示例没有做。**实战最重要的是讲清原理不是让美术妹子看完以后顺手再提三个优化意见。4. 脚本只负责传参数四个数字分别是镜片中心x、中心y、半径和放大倍数。触摸移动时更新圆心Shader就会在新的位置重新计算。所以Shader一定比RenderTexture 好吗当然不是。其实在放大镜这个效果中Shader反而没有RenderTexture灵活。我们需要根据具体游戏需求去选择用什么样的技术栈优先选择 Shader放大单张图片、立绘或静态地图。效果主要是局部变色、扭曲、渐变或纹理采样变化。希望减少额外节点和相机。优先选择 RenderTexture镜片里包含多个节点。需要看到角色动画、粒子、地图单位等动态内容。放大对象不是一张简单纹理。最后再回答文章标题为什么大家都那么喜欢用Shader笔者认为Shader在特定情况能更好地优化效果。Shader在特定情况能更好地优化性能。Shader在特定情况能更好地展示你的能力。会用Shader很帅但知道什么时候不用更帅。结语问题来了小伙伴们关于**“为什么大家都那么喜欢用Shader”**有不同的见解吗欢迎在评论区探讨一下。本文实例工程可通过私信发送“放大镜”获取。我是亿元程序员一位有着8年游戏行业经验的主程。在游戏开发中希望能给到您帮助也希望通过您能帮助到大家。实不相瞒想要个赞和爱心请把该文章分享给你觉得有需要的其他小伙伴。谢谢推荐文章亿元Cocos小游戏实战合集2.0亿元Cocos小游戏实战合集1.0老板说最近这款游戏很火让我抄可是我连玩都玩不明白…这款值68亿的游戏你不实战一下吗安排小伙伴说我的拼图游戏用Mask不能合批…俄罗斯方块谁不会做…啊流沙版最近很火的一个拼图游戏老板让我用Cocos3.8做一个…老板说拼图游戏太卷了让我用Cocos做个3d版本的…敢不敢挑战用Cocos3.8复刻曾经很火的割绳子游戏