如何快速升级 Cocos Shader 版本,以简易水shader为例

news2024/11/25 4:21:54

背景

讲述如何 将一份 3.0.0 版本的水shader 升级至 Cocos Creator 3.6 。希望对大家有所帮助。

f6f51f56b21a7e94377f21c2cf934e2f.jpeg

环境

Cocos Creator 3.6.2

效果

25440d330bbf39ea4bc590b13570dad8.gif

此处是鱼🐟,介绍如何使用

在资源管理器中新建着色器(Effect)

35c6e3be499f0c5597bd3f0b4c95614c.jpeg

复制 文末的 mywater.effect 代码至当前文件

bb95b6470b410c2c9ae8daaf91b24ebf.png

在资源管理器中新建材质

414a9716649b58fecec87b8030602367.jpeg

选择材质的着色器

2127a80bdddefab1ef812b1809206024.jpeg

在场景中创建平面

01a1e83b91ab530793328eb4d770077d.jpeg

让平面使用水的材质

097c7ceacad582491601fab637940f40.jpeg

为材质上贴图

c2e1ace033153de0c84ffe834f1822a8.jpeg

调整材质参数

可以根据预览效果调整参数
796f420de6a3ba0bb56ee3d27b794c13.jpeg

此处是渔,介绍如何快速升级

https://www.bilibili.com/video/BV1WY4y1f7mS

前置准备

参考前面的步骤准备以下几个点:

1. 新建着色器(Effect), mywater.effect

2. 新建材质 mywater.mtl ,并使用 mywater.effect 材质

51824c5819dc6ca2fda57e9cdc7ccf60.jpeg

3. 在场景中创建平面,并使用mywater.mtl材质

f3525cdd5d2335e2836471435bcda494.jpeg

4.将参考的水放在工程中

9c837961c4cf4f9ce58e77aee9bb5887.png

确定入口

打开两份着色器代码,片元着色器的入口在 frag 变量下

80d38b16b28e6d49002df977e36f90d6.jpeg

入口在 water-fs:frag

7bd80266b827776df5896eb252f7346a.jpeg

从后往前抄

返回颜色

cc744b8d367e8afc7a207f2f236a0141.jpeg

将每个变量都移植过来
3447cecc99705e19b016eb674cdfb2df.jpeg

全局变量

拷贝 属性检查器 面板参数 properties

f9c8d347f56daa50f4de9f7d99c7be20.jpeg

拷贝UBO。引擎不支持离散声明的 uniform 变量,必须使用 UBO 并保持内存对齐,以避免 implicit padding。

ebf629d8ca2c822ac8ca41b8b80e6c71.jpeg

拷贝引用UBO

09c34183eabcd24df70ec14482a724af.jpeg

函数

拷贝颜色计算的部分

28005fcb07f6e36a4795ceee82ee4cad.jpeg

拷贝相关的全局变量

bacd38899b20524887fa05df28171d25.jpeg

拷贝UBO

8422954bc8b9fa39f037a16ac1100d84.jpeg

拷贝纹理声明 causticTexture

abde83f844918eae79da8fcca3e080ab.jpeg

拷贝函数

14b50faed4a080463c063b52516df5c4.jpeg

材质参数

在参考材质中搜索对应的纹理,找到使用的纹理文件

0e12e9b1897dbca8ffe6996cb82e1928.jpeg

拖入贴图

276a229d0745cd3b8096379eae1afd44.jpeg

为材质上贴图

dbd5e3484a624d5b982bc07eb88c1a75.jpeg

其他参数的拷贝

5797ee2ff6e0e15ceea2f4c00687b751.jpeg

效果

dfa491edadec97e818eb48958e5ca0a8.gif

此处是相关资源资料

贴图 Caustics

ac9a9bc7eb027eb6a186e93bbc26728b.png

mywater.effect

// Effect Syntax Guide: https://docs.cocos.com/creator/manual/zh/shader/index.html

CCEffect %{
  techniques:
  - name: opaque
    passes:
    - vert: legacy/main-functions/general-vs:vert # builtin header
      frag: unlit-fs:frag
      properties: &props
        shallowColor:   { value: [0.07843, 0.6667, 1, 1], editor: { type: color }  }
        causticStrength:    { value: 0.2,  target: causticParams1.x, editor: { parent: USE_CAUSTIC } }
        causticScale:       { value: 2.33,  target: causticParams1.y, editor: { parent: USE_CAUSTIC } }
        causticSpeed:       { value: 0.1,   target: causticParams1.z, editor: { parent: USE_CAUSTIC } }
        causticRGBSplit:    { value: 0.35,  target: causticParams1.w, editor: { parent: USE_CAUSTIC } }
        causticDepth:       { value: 1,  target: causticParams2.x, editor: { parent: USE_CAUSTIC } }
        causticColor:       { value: [0.01176, 0.4, 0.47451],   target: causticParams2.yzw, editor: { parent: USE_CAUSTIC, type: color } }
        causticTexture:     { value: white, editor: { parent: USE_CAUSTIC } }
  - name: transparent
    passes:
    - vert: general-vs:vert # builtin header
      frag: unlit-fs:frag
      blendState:
        targets:
        - blend: true
          blendSrc: src_alpha
          blendDst: one_minus_src_alpha
          blendSrcAlpha: src_alpha
          blendDstAlpha: one_minus_src_alpha
      properties: *props
}%

CCProgram shared-ubos %{
  #define pi 3.14

  uniform Water {
    vec4 shallowColor;
    vec4 causticParams1;
    vec4 causticParams2;
  };
}%

CCProgram unlit-fs %{
  precision highp float;
  #include <shared-ubos>
  #include <legacy/output>
  #include <legacy/fog-fs>

  #if USE_CAUSTIC
    uniform sampler2D causticTexture;
  #endif

  in vec2 v_uv;
  in vec3 v_position;

  #if USE_CAUSTIC
  vec2 panner(vec2 uv, float direction, float speed, vec2 offset, float tiling)
  {
      direction = direction * 2. - 1.;
      vec2 dir = normalize(vec2(cos(pi * direction), sin(pi * direction)));
      return  (dir * cc_time.x * speed) + offset + (uv * tiling);
  }

  vec3 rgbSplit(float split, sampler2D tex, vec2 uv)
  {
      vec2 UVR = uv + vec2(split, split);
      vec2 UVG = uv + vec2(split, -split);
      vec2 UVB = uv + vec2(-split, -split);

      float r = texture(tex, UVR).r;
      float g = texture(tex, UVG).g;
      float b = texture(tex, UVB).b;

      return vec3(r,g,b);
  }

  vec3 caustic()
  {
    vec2 uv = v_position.xz;

    float strength = causticParams1.x;
    float split = causticParams1.w * 0.01;
    float speed = causticParams1.z;
    float scale = causticParams1.y;

    vec3 texture1 = rgbSplit(split, causticTexture, panner(uv, 1., speed, vec2(0., 0.), 1./scale));
    vec3 texture2 = rgbSplit(split, causticTexture, panner(uv, 1., speed, vec2(0., 0.), -1./scale));
    vec3 textureCombined = min(texture1, texture2);

    return strength * 10. * textureCombined;
  }
  #endif

  vec4 frag () {
    vec4 waterColor = shallowColor;
    vec4 finalFoamColor = vec4(0.);
    // caustic
    vec4 finalCausticColor = vec4(0.);
    #if USE_CAUSTIC
      float causticDepth = causticParams2.x;
      vec3 causticColor = causticParams2.yzw;
      finalCausticColor.rgb = caustic() * causticColor;
    #endif

    vec4 finalColor = waterColor + finalFoamColor + finalCausticColor;
    CC_APPLY_FOG(finalColor, v_position);
    return CCFragOutput(finalColor);
  }
}%

// 欢迎关注【白玉无冰】 https://mp.weixin.qq.com/s/4WwCjWBtZNnONh8hZ7JVDA

工程

https://forum.cocos.org/uploads/short-url/5ytjWtYU1A4xNheA6nYxtBCs8h4.zip

mywater.zip (391.1 KB)

其他

整理了一份往期的游戏开发资料合集 👉 游戏开发资料合集,2022年版

9862e598ec4d5f57b3f6272904f6bb02.jpeg

阅读原文下载相关素材

https://forum.cocos.org/t/topic/144800

👇👇👇

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ai绘画生成软件哪个好用?这款AI作画的二次元太精致了

Ai绘画生成软件哪个好用呢&#xff1f;今天小编给大家推荐一款AI作画神器&#xff0c;用它生成的二次元真的是超级惊艳&#xff0c;每天每个手机号可以免费生成多张画作。 我们打开数画ai绘画&#xff0c;这是一款国产软件&#xff0c;使用的是自身研发的算法&#xff0c;目前…

Vue3+TypeScript系统学习(十五) - 详解Vue3 Composition API(二)

前面给大家分享了Options API语法中代码的复用、Options API编码的优缺点&#xff0c;以及setup函数&#xff0c;响应式API等&#xff0c;这次将给大家分享Vue3 Composition API中的计算属性&#xff0c;侦听器&#xff0c;生命周期函数&#xff0c;Provide和Inject等。 1.1 co…

商户绑卡银行卡流程设计优化

一、背景 历史商户系统&#xff0c;断断续续经过好多人开发&#xff0c;商户绑卡流程数据好多地方不同步。 商户绑卡会调用支付平台进行绑卡&#xff0c;但是历史平台将数据留存了一份&#xff0c;所以目前现状&#xff0c;商户平台维护一份数据&#xff0c;支付平台维护一份数…

吴恩达机器学习课程笔记:模型描述、假设函数、代价函数

1.吴恩达机器学习课程笔记&#xff1a;模型描述、假设函数、代价函数 吴恩达机器学习课程笔记&#xff1a;模型描述 吴恩达机器学习课程笔记&#xff1a;代价函数 仅作为个人学习笔记&#xff0c;若各位大佬发现错误请指正 什么是模型&#xff1f; 机器学习模型简单来说&#…

玩转数据结构前言

本章为数据结构学习前的一些学习方法建议 51刷题法 leetcode中文站点: https://leetcode-cn.com leetcode国际站点: https://leetcode.com 刷题方法 Round1 1.读题&#xff0c;思考&#xff0c;4-6分钟内有思路立马写&#xff0c;15分钟内写不出来直接放弃 有思路先别管算…

使用mongostat命令实现zabbix监控mongodb

zabbix监控mongodbmongostat命令监控脚本参考zabbix配置mongostat命令 mongostat是mongodb自带的状态检测工具&#xff0c;可以使用这个命令获取mongodb的当前运行状态&#xff0c;并输出。我们使用这个命令获取mongodb的状态。 本示例中是一个3节点的复制集群&#xff08;一…

调用方系统禁止依赖传递后如何排查本系统所缺少依赖

订单系统依赖了好多其他系统&#xff0c;但当其他系统的service-api的包里依赖项加入了禁止依赖后&#xff0c;订单系统启动就会报错&#xff0c;具体排查那些包被禁止依赖了&#xff0c;方案如下 举例&#xff1a;会员系统后个包加入了禁止依赖<optional>true</opti…

Java中set的基本操作

文章目录1、定义Set2、增删改操作&#xff08;1&#xff09;新增&#xff08;2&#xff09;删出&#xff08;3&#xff09;修改3、访问set4、遍历set&#xff08;1&#xff09;foreach遍历&#xff08;2&#xff09;iterator迭代器遍历5、set转换6、其他操作set是一个无序的集合…

深度解析源码之SpringMVC文件上传为什么要用POST请求还要设置请求头

深度解析源码之SpringMVC文件上传为什么要用POST请求还要设置请求头 从本篇文章开始&#xff0c;来逐步介绍里面每一步的细节处理流程。 首先看到doDispatch方法的第一个重要操作就是校验文件上传请求。代码如下&#xff1a; 这个方法是如何校验文件上传请求的呢&#xff1f;…

软件测试最常用的 SQL 命令 | 通过实例掌握基本查询、条件查询、聚合查询

本文为霍格沃兹测试学院优秀学员学习笔记&#xff0c;汇总了软件测试人员经常使用&#xff0c;必须掌握的 SQL 基础命令1、DML核心CRUD增删改查缩写全称和对应 SQL&#xff1a;* DML 数据操纵语言&#xff1a;Data Manipulation Language* Create 增加&#xff1a;insert* Ret…

工作和学习遇到的技术问题

写在前面 记录工作和学习遇到的技术问题,以求再次遇到可以快速解决。 1&#xff1a;Ubuntu TSL换源报错&#xff1a;Err:1 http://mirrors.aliyun.com/ubuntu focal InRelease 执行如下操作&#xff08;已经操作的则忽略&#xff09;&#xff0c;首先在文件/etc/apt/sources…

Vue.js 数据双向绑定的实现

前言 在我们使用vue的时候&#xff0c;当数据发生了改变&#xff0c;界面也会跟着更新&#xff0c;但这并不是理所当然的&#xff0c;我们修改数据的时候vue是如何监听数据的改变以及当数据发生改变的时候vue如何让界面刷新的&#xff1f; 当我们修改数据的时候vue是通过es5中…

DataGear 制作基于Vue2、Element UI弹窗效果的数据可视化看板

DataGear 在4.4.0版本新增了dg-chart-manual-render特性&#xff0c;用于手动控制看板内图表的渲染&#xff0c;而非在页面加载时自动渲染。利用这一特性&#xff0c;可以很方便制作具有弹窗效果的数据可视化看板。 本文以Vue2、Element UI 前端框架为例&#xff0c;介绍如何制…

【C语言】通讯录—静态版

前言: 刚学完结构体和枚举&#xff0c;在网上找了个通讯录的项目&#xff0c;用来练手 目标:该通讯录可存储千人个人信息 包括:姓名&#xff0c;年龄&#xff0c;性别&#xff0c;电话&#xff0c;地址 实现功能: 1.添加联系人 2.删除联系人 …

Web 安全漏洞之 XSS 攻击

什么是 XSS 攻击 XSS&#xff08;Cross-Site Scripting&#xff09;又称跨站脚本&#xff0c;XSS的重点不在于跨站点&#xff0c;而是在于脚本的执行。XSS是一种经常出现在 Web 应用程序中的计算机安全漏洞&#xff0c;是由于 Web 应用程序对用户的输入过滤不足而产生的。 常…

MyBatis -- 多表查询

MyBatis -- 多表查询一、准备工作二、多表查询属性名与字段名不匹配一、准备工作 博客系统场景。 创建库、表&#xff1a; -- 创建数据库 drop database if exists mycnblog; create database mycnblog DEFAULT CHARACTER SET utf8mb4;-- 使用数据数据 use mycnblog;-- 创建…

小程序样式和组件基础

小程序样式和组件基础小程序样式样式wxss简介响应式单位rpx其它css单位支持的单位内置组件简介image组件-基础组件介绍常用属性示例image组件-懒加载与基础库版本用法swiper组件组件介绍常用属性示例navigator组件-基础组件介绍常用属性示例navigator组件-页面栈页面栈返回按钮…

常用windows自带程序对应的命令

敲winr键&#xff0c;调出 运行 框&#xff1b; 输入命令回车&#xff0c;打开对应程序&#xff1b; 输入cmd&#xff0c;调出命令行窗口&#xff1b; gpedit&#xff0c;组策略编辑器&#xff0c; 有的电脑没有组策略编辑器&#xff1b; 资源管理器&#xff1b; dvdplay&…

【BP靶场portswigger-客户端15】基于DOM的漏洞-7个实验(全)

前言&#xff1a; 介绍&#xff1a; 博主&#xff1a;网络安全领域狂热爱好者&#xff08;承诺在CSDN永久无偿分享文章&#xff09;。 殊荣&#xff1a;CSDN网络安全领域优质创作者&#xff0c;2022年双十一业务安全保卫战-某厂第一名&#xff0c;某厂特邀数字业务安全研究员&…

使用PyTorch构建GAN生成对抗网络源码(详细步骤讲解+注释版)02 人脸识别 上

文章目录1 数据集描述2 GPU设置3 设置Dataset类4 设置辨别器类5 辅助函数与辅助类1 数据集描述 此项目使用的是著名的celebA&#xff08;CelebFaces Attribute&#xff09;数据集。其包含10,177个名人身份的202,599张人脸图片&#xff0c;每张图片都做好了特征标记&#xff0c…