Cocos Creator 3.8 开发2D水面波纹Shader

使用cocos Creator 3.8做了一个游戏开中常用的2D的波浪水面,把技术点给记录一下,并提供完整的Shader代码。先上效果:

添加图片注释,不超过 140 字(可选)

2D 波浪的基本技术原理

2D 水面波纹的主要原理就是给定一个正选波的边界,在范围内的片元uv就显示,在范围外的片元uv就不显示。同时利用正弦波表达式:

y = A * sin(w * t+offset)

将片元的uv坐标uv.x 带入上面的公式offset,算出y0值。Cocos 的uv 左上角为(0, 0),我们要在图片的上方做水波纹,那么片元的uv.y < y0的片元就丢弃, uv.y >= y0的就正常显示。

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

添加图片注释,不超过 140 字(可选)

为了让水波能动起来,我们就要不断的改变同一个位置offset, 对应的y0的值,那么我们加一个 w * t, 角速度*时间。这样随着时间的推移同一个uv(x, y),会得到不同的y0的值。有了不同的边界,这样就会决定不同的片元的显示和丢弃。

具体编写Shader

第001步: 新建一个标准2D Shader 模板,能正常显示图片

Cocos Creator的版本不一样,可能导致以前编写的Shader无法正常运行,这种其实很好解决,我们在开发Shader的时候,基于现在Cocos Creator的版本先创建一个现有的模板出来,然后再将关键代码移植过去。我们做一个2D的Shader,所以复制一个buildin-sprite的Shader模板。然后创建一个材质选好我们新创建的Shader文件,将材质设置到Sprite组件上,能正常显示图片。

添加图片注释,不超过 140 字(可选)

第002步: 定义好uniform给用户的控制参数:

baseLine: 基准线,该参数用于控制波浪在图片的位置(波形的基准线);

A: 振幅,该参数用于控制波浪线的高度;

wSpeed:角速度,该参数用来控制一个波形的长度;

添加图片注释,不超过 140 字(可选)

第003步: 修改Frag片元着色的Shader代码

完成基准线功能,编写代码基准线以上的片元直接丢弃,基准线一下的片元保留,代码如下:

 
 

float value = 0;

 

if(uv0.y < baseLine + value) {

 

discard;

 

}

这样基准线baseLine以上的,就不显示,baseLine以下的显示。

第004步:基于A*sin(offset)来将基准线做正弦波处理

基准线确定好后,还需给基准线加上正弦波,offset为uv.x, value = A*sin(offset), baseLine + value, 这样就把baseLine做成了正弦波的分界线。

 
 

float value = A * sin(uv0.x * 30.0);

 

if(uv0.y < baseLine + value) {

 

discard;

 

}

第005步:让正弦波动起来

为了让正弦波动起来,我们在sin加上w*t, 在cocos ccreator里面cc_time是一个vec4的向量, cc_time.x是从启动后到现在的时间,随着时间不断地变化,value = A * sin(uv0.x * 30.0 + wSpeed * cc_time.x); value地值也成周期变化,这样波形就动起来了。

 
 

float value = A * sin(uv0.x * 30.0 + wSpeed * cc_time.x);

 

if(uv0.y < baseLine + value) {

 

discard;

 

}

完整Shader代码

最后上代码(Cocos Creator 3.8.0):

 
 

// Copyright (c) 2017-2020 Xiamen Yaji Software Co., Ltd.

 

CCEffect %{

 

techniques:

 

- passes:

 

- vert: sprite-vs:vert

 

frag: sprite-fs:frag

 

depthStencilState:

 

depthTest: false

 

depthWrite: false

 

blendState:

 

targets:

 

- blend: true

 

blendSrc: src_alpha

 

blendDst: one_minus_src_alpha

 

blendDstAlpha: one_minus_src_alpha

 

rasterizerState:

 

cullMode: none

 

properties:

 

alphaThreshold: { value: 0.5 }

 

baseLine: { value: 0.5}

 

wSpeed: { value: 10.0 }

 

A: { value: 0.01}

 

}%

 

CCProgram sprite-vs %{

 

precision highp float;

 

#include <builtin/uniforms/cc-global>

 

#if USE_LOCAL

 

#include <builtin/uniforms/cc-local>

 

#endif

 

#if SAMPLE_FROM_RT

 

#include <common/common-define>

 

#endif

 

in vec3 a_position;

 

in vec2 a_texCoord;

 

in vec4 a_color;

 

out vec4 color;

 

out vec2 uv0;

 

vec4 vert () {

 

vec4 pos = vec4(a_position, 1);

 

#if USE_LOCAL

 

pos = cc_matWorld * pos;

 

#endif

 

#if USE_PIXEL_ALIGNMENT

 

pos = cc_matView * pos;

 

pos.xyz = floor(pos.xyz);

 

pos = cc_matProj * pos;

 

#else

 

pos = cc_matViewProj * pos;

 

#endif

 

uv0 = a_texCoord;

 

#if SAMPLE_FROM_RT

 

CC_HANDLE_RT_SAMPLE_FLIP(uv0);

 

#endif

 

color = a_color;

 

return pos;

 

}

 

}%

 

CCProgram sprite-fs %{

 

precision highp float;

 

#include <builtin/uniforms/cc-global>

 

#include <builtin/internal/embedded-alpha>

 

#include <builtin/internal/alpha-test>

 

in vec4 color;

 

#if USE_TEXTURE

 

in vec2 uv0;

 

#pragma builtin(local)

 

layout(set = 2, binding = 12) uniform sampler2D cc_spriteTexture;

 

#endif

 

uniform MyUniform {

 

float baseLine;

 

float wSpeed;

 

float A;

 

};

 

vec4 frag () {

 

vec4 o = vec4(1, 1, 1, 1);

 

#if USE_TEXTURE

 

o *= CCSampleWithAlphaSeparated(cc_spriteTexture, uv0);

 

#endif

 

float value = A * sin(uv0.x * 30.0 + wSpeed * cc_time.x);

 

if(uv0.y < baseLine + value) {

 

discard;

 

}

 

o *= color;

 

return o;

 

}

 

}%

关注我们,可以获取这个项目工程地源码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/302056.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1.框架介绍项目环境配置与项目启动!

目录 1.框架开发方向:2.项目启动与环境搭建 1.框架开发方向: 1.前后端分离项目 2.纯后端项目 3.移动端开发uni-app(ios、Android、H5、微信小程序) 4.内容管理系统2.项目启动与环境搭建 1.安装node.js 下载地址可以用nvm安装 便于运行前端项目https://blog.csdn.net/qq_58647…

Android Studio安卓读写NFC Ntag标签源码

本示例使用的发卡器&#xff1a; https://item.taobao.com/item.htm?spma1z10.5-c-s.w4002-21818769070.11.3513789erHXVGx&id615391857885 <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout x…

数仓建设学习路线(二)模型建设(1)

OLTP VS OLAP OLTP 概念 全称OnLine Transaction Processing&#xff0c;中文名联机事务处理系统&#xff0c;主要是执行基本日常的事务处理&#xff0c;比如数据库记录的增删查改,例如mysql、oracle。 OLAP 概念 全称OnLine Analytical Processing&#xff0c;中文名联机…

【C语言】一种状态超时阻塞循环查询的办法

【C语言】一种状态超时阻塞循环查询的办法 文章目录 【C语言】一种状态超时阻塞循环查询的办法1.方法12.方法21.方法1 static void wait_notify_async(notify_type_t notify_type) {static rt_tick_t exit_tick;exit_tick = rt_time_get_msec();lb_int32 notify_success = RT_F…

有没有比较好的制造业工单管理系统?

制造业公司由于要处理大量的售前售后工作&#xff0c;常常会使用不同的管理系统来协助管理&#xff0c;比如客户管理用的crm系统&#xff0c;人事管理的HR系统&#xff0c;设备管理和报修管理的工单系统等等。不同类型的系统&#xff0c;都有做得比较好的行业佼佼者&#xff0c…

哈夫曼编码理解

今天学到了哈夫曼编码&#xff0c;简单理解记忆一下。 举个例子: 这里有个文本 aaaabbbcce其中a出现的概率为0.4&#xff0c;b为0.3&#xff0c;c为0.2&#xff0c;d为0.1 首先我们先定义两个规则&#xff1a; 1.上支路为0&#xff0c;下支路为1 2.概率相等时&#xff0c;合并…

请问下大家PMP证书值得考嘛?

做项目的去考&#xff0c;项目经理、产品经理这些&#xff0c;或者有往项目管理领域发展的去考。其他行业有空可以学习下 不一定要考证了。 PMP证书更多的是“敲门砖”作用&#xff0c;大部分公司招聘的门槛都要去了这个证书。 当然现在PMP管理模式也很热门&#xff0c;各大企…

2019数据结构----单链表真题

思路&#xff1a; (1)找到中间节点,将原链表一分为二 (2)后半段链表原地逆置 (3)合并链表 #include <stdio.h> #include <stdlib.h>//定义节点类型 typedef struct LNode {int data;//数据域struct LNode *next;//指针域 } LNode, *LinkList;void tailList(Link…

Mysql 下载与安装教程(详细介绍与总结)

一&#xff1a;版本介绍 首先&#xff0c;我们需要先进入官网进行下载&#xff0c;在官网中有好几个版本&#xff0c;那么这里我分别简述一下MySQL各个版本区别&#xff1a; 1&#xff1a;企业版&#xff0c;MySQL Enterprise Edition 需要付费的&#xff0c;可以免费试用30天…

安全典型配置(六)配置IPSG限制非法主机访问内网案例(静态绑定)

相关文章学习&#xff1a; 安全典型配置&#xff08;一&#xff09;使用ACL限制FTP访问权限案例 安全典型配置&#xff08;二&#xff09;使用ACL限制用户在特定时间访问特定服务器的权限案例 安全典型配置&#xff08;三&#xff09;使用ACL禁止特定用户上网案例安全典型配置…

【REST2SQL】06 GO 跨包接口重构代码

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 对所有关系数据的操作都只有CRUD&#xff0c;采用Go 的接口interface{}重构代码…

特斯拉难挽倒退?比亚迪为中国汽车市场改写历史

对于电动汽车这个新兴产业&#xff0c;特斯拉长期以来一直处于领头羊的位置&#xff0c;近年来也面临诸多测试。去年底欧洲报道特斯拉在瑞典遭遇罢工冲击&#xff0c;运营陷入诸多困扰&#xff0c;实在出人意料。更让人讶异的是&#xff0c;年终宣布新王者比亚迪在全球销量首次…

C语言——结构体类型(一)【结构体定义,创建,初始化和引用】

&#x1f4dd;前言&#xff1a; 在实际编程过程中&#xff0c;我们可能会希望把一些关联的数据存放在一起&#xff0c;这样方便我们使用。但是这些数据的类型有时候并不一致&#xff0c;例如一个学生的信息&#xff1a;有名字&#xff08;字符串&#xff09;&#xff0c;有年龄…

各大厂急招鸿蒙开发员,争抢鸿蒙工程师

去年9月&#xff0c;余承东宣布鸿蒙原生应用全面启动&#xff0c;华为开始了全面抛弃安卓的进程。 多家互联网公司也发布了鸿蒙OS的App开发工程师的岗位&#xff0c;开启了抢人大战。 有的企业开出了近百万的年薪招聘鸿蒙OS工程师&#xff0c;而华为甚至为鸿蒙OS资深架构师开…

python 各级目录文件读取

目录结构 import pytestdef test_01():# 同级文件with open(1.txt, r, encodingutf-8) as file:content file.read()print(content)def test_02():# 同级目录的下的文件with open(rupfile/2.txt, r, encodingutf-8) as file:content file.read()print(content)def test_03():…

大数据StarRocks(四) :常用命令

这次主要介绍生产工作中使用Starrocks时的常用命令 4.1 连接StarRocks 4.1.1 Linux命令行连接 [roothadoop1011 fe]# yum install mysql -y [roothadoop1011 fe]# mysql -h hadoop101 -uroot -P9030 -p4.1.2 Windows客户端 DBeaver 连接 4.2 常用命令 4.2.1 查看状态 1. 查…

低代码快速构建管理系统的实践思路

目录 一、前言 二、创建数据表 三、添加数据表属性 四、配置功能 五、数据筛选 六、数据集显示&功能发布 一、前言 很多时候&#xff0c;市场上的管理软件鱼龙混杂&#xff0c;找一些外包团队在实际应用中效果并不理想&#xff0c;项目中存在的问题也比较棘手。后面了…

视频如何制作微信表情?仅需一招在线制作

Gif动画表情包是当下一种非常流行的图片展示格式&#xff0c;能够通过gif格式的图片来调节聊天氛围或是传递信息&#xff0c;非常有趣。而gif动图现在也被各行各业的商家用作宣传使用&#xff0c;很吸引大众的目光。 那么&#xff0c;这种非常吸引人的gif动图是怎么制作的呢&a…

民营企业合规管理建设,重点有哪些?

民营企业在当前经济发展中占据着重要地位&#xff0c;但随之而来的是更多的法律法规和监管要求。因此&#xff0c;民营企业合规建设成为保障企业合法运营、稳定发展的关键。 首先&#xff0c;民营企业应重视法律遵从。确保企业各项经营活动符合国家法律法规和相关政策要求&…

rhel8安装

1. 2. 3. 4. 5. 6.默认 7.默认 8. 9.默认 10. 11. 12. 13.默认 14.默认 15.添加镜像 16.双击后&#xff0c;通过上下键选择第一个 &#xff08;第二个是测试镜像并安装&#xff0c;就是比较慢&#xff0c;建议选择第一个&#xff09; 17. 18. 19.让他自动分区就行了 20.开始安…