还在用贴片做阴影?Cocos Creator 带你通过一维纹理绘制 2D 实时阴影

Cocos 的布道师正在论坛陆续更新 Cocos Creator 3.x 游戏常用效果技术实现 Demo,Demo 将随着 Cocos Creator 更新迭代,确保在最新版本中可以运行。点击文末【阅读原文】直达论坛专贴,各位开发者有什么想要实现的效果,欢迎留言告诉我们。

c0f555e821e87d716f094efd8628dfb3.jpeg

阴影对于提升场景的真实感和质感有至关重要的作用。Cocos Creator 支持两种 3D 阴影的实现方式:Planar 和 ShadowMap。

  • Planer:通过将阴影生成体投射到阴影接受体的平面来制作阴影;

  • ShadowMap:通过对在光源位置放置相机拍摄 ShadowMap(阴影贴图)来实现的。

这两种方式不仅操作简单,而且实现效果很好。但是对于 2D 游戏,就不那么适用了。很多 2D 游戏的阴影都是通过贴片来实现的。但今天,我们要基于 Cocos Creator 3.3.2 来介绍另一种实现方案:通过一维纹理生成 2D 实时阴影。

7a3ac0f43b9f485223bd0e2beea37342.gif

Demo 效果预览

Demo 实现了基于 2D 点光源的动态阴影,且对于 Demo 内所有不透明的像素都做了阴影处理,光源和阴影的边缘也做了柔和处理,符合我们对阴影的观察。

接下来我将为大家拆解实现步骤、并深入了解一下实现原理,开发者可选择对应的部分观看。

章节目录

PART 1. 使用方法

PART 2. 实现原理

PART 3. Shader 渲染解析

PART 4. 性能影响

PART 5. 资源链接

PART 1

使用方法

1、创建层级:1dmap

0b7c481a04795b3713dad3abac328b40.png

2、创建 render texture:rt_1dmap 和 rt_picture

325cbf67399a971690a3a2cd5aa0a26e.png

3、创建3个相机:

5166ab726eb2149be33b4c2984f3b9b7.png

  • CameraPicture:使用 rt_picture 作 TargetTexture

9e57f1d11061da5f0ab85572ec6a6f36.png

  • CameraShadow:使用 rt_1dmap 作为 TargetTexture

7e25d345463bbe82fff78deb7bef038a.png

  • Camera:作为 Cocos Creator 创建 UI 时的默认相机

a2d7e856627e068ae81138b4a1b5c1fb.png

4、创建场景

创建渲染到阴影贴图的场景 sprite:shadow_1dmap

注意:其 Layer 必须是 1dmap, 这个作用是用于渲染场景到阴影贴图,具体的原理我们会在后文解释。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cocos Creator 3.x 版本中,cc.Line 组件已经被废弃,可以使用 Graphics 组件来绘制随机闪电。具体实现步骤如下: 1. 在场景编辑器中创建一个节点,添加 Graphics 组件。 2. 编写脚本,获取 Graphics 组件,在 onEnable 生命周期回调函数中调用绘制随机闪电的方法。具体实现方法如下: ``` cc.Class({ extends: cc.Component, properties: { duration: 0.2, // 闪电持续时间 offset: 10, // 闪电偏移量 boltWidth: 5, // 闪电宽度 color: cc.Color.WHITE // 闪电颜色 }, onEnable: function () { this.schedule(this.drawBolt, this.duration); }, onDisable: function () { this.unschedule(this.drawBolt); }, drawBolt: function () { var g = this.getComponent(cc.Graphics); g.clear(); var startPos = cc.v2(0, 0); // 起点坐标 var endPos = cc.v2(cc.winSize.width, cc.winSize.height); // 终点坐标 var midPos = cc.v2(startPos.x + (endPos.x - startPos.x) / 2, startPos.y + (endPos.y - startPos.y) / 2); // 中点坐标 // 生成随机偏移量 var offset1 = cc.v2(Math.random() * this.offset - this.offset / 2, Math.random() * this.offset - this.offset / 2); var offset2 = cc.v2(Math.random() * this.offset - this.offset / 2, Math.random() * this.offset - this.offset / 2); // 绘制闪电 g.strokeColor = this.color; g.lineWidth = this.boltWidth; g.moveTo(startPos.x, startPos.y); g.lineTo(midPos.x + offset1.x, midPos.y + offset1.y); g.lineTo(endPos.x + offset2.x, endPos.y + offset2.y); g.stroke(); } }); ``` 这段代码将在节点上使用 Graphics 组件绘制随机闪电,每隔一定时间刷新一次。可以根据需要调整闪电的持续时间、偏移量、宽度和颜色等参数。需要注意的是,随机闪电的绘制效果可能会受到屏幕分辨率的影响,可以根据需要调整起点和终点坐标来适配不同的屏幕大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值