Cocos Creator 3.8 后期效果 Shader 编写(1/2) 基础篇

news2024/10/7 4:32:34

原文链接:Cocos Creator 3.8 后期效果 Shader 编写(1/2) 基础篇
在 Cocos Creator 3.8 版本中,新增了不少实用的特性,其中我最喜欢的,就是它自带后期效果管线,并且还内置了许多高级效果。

有用来增强画面效果的 FSR, ColorGradingBloom

还有用来增强 3D 空间感的 HBAO。

以及用来抗锯齿的 TAA 和 FXAA。

可以说,在后期效果管线的加持下,整个画面效果有了质的飞越。

如何启用

今天的内容比较简单,就是教大家如何新写一个自己的后期效果。

在这之前,我们先来看看如何启用后期效果。

我们用这个经典的场景来做示范。

这个场景叫 Sponza,它包含了许多复杂的建筑结构,方便观察对比一些细节。所以,很多图形渲染相关的 DEMO 都用它来做示例。

大家可以从各类模型网站上下载到, 也可以在 Cocos Store 中搜索 Sponza,进行下载。

想要开启 Cocos Creator 3.8 中的后期管线,只需要简单的 3 步。

第一步,我们需要创建一个空节点

Cocos Creator 中的后期效果是以组件方式管理的,所以我们需要先创建一个空节点作为载体。

我们把它起名为, PostProcess,这样项目管理起来会更加直观。

选中它,在右边的属性面板中,点击添加组件按钮,找到 PostProcess,展开。

这里列出来的,就是引擎内置的所有后期效果了。

BlitScreen 的用法比较特殊,我们后面会用到,这里先跳过。

我们把除 BlitScreen 以外的所有效果都添加到这个节点上。

添加的顺序可以随意,因为每一个后效都有一个优先级,引擎内部在使用的时候会根据优先级进行排序,从而确保最后合成的效果是正确的。

我们可以看到,cc.PostProcess 组件会被自动添加到这个节点上,使这个节点成为一个后效节点。

第二步,打开摄像机上的开关

我们找到需要开启后效的摄像机,在这个场景中,就是 Main Camera 节点,选中它,然后在属性面板中勾选 Use Post Process,启用后效。

可以看到,在 Use Post Process 下还有一个 Post Process 参数。

我们可以把想要使用的后效节点拖动到这个属性上。这个特性非常管用,我们就可以根据项目需要,为不同的摄像机设定特定的后效处理流程。

我们也可以让它为空,引擎会自动使用全局后效节点。

那什么是全局后效节点呢? 我们来看看。

我们选中 PostProcess 节点,在 cc.PostProcess 组件里,可以看到, 它有一个 Global 属性。

如果它被勾选,表示它是一个全局后效。开启了 Use Post ProcessPost Process 参数为空的摄像机,会来使用它。

如果如果取消勾选,那么这个后效只会在引用它的摄像机上被使用。

需要注意的是,不管哪种情况,一个摄像机只会执行一个后效流程。 如果一个场景中有多个全局后效节点,摄像机会使用最选找到的那一个。

我们可以发现,还是没有效果。 这是因为在 Cocos Creator 3.8 中,内置管线还不支持后效,需要切换到自定义管线。

第三步,开启自定义管线

打开项目设置面板,切换到功能裁剪标签,启动自定义管线

然后选择宏配置,填写好自定义管线名称。 我们用的是默认的自定义管线,所以填 Custom 就可以了。

由于切换了管线,我们想要在 Cocos Creator 场景编辑器内看到效果的话,需要刷新一下 Cocos Creator。

我们可以关闭 Cocos Creator 再打开。也可以按下快捷键 CTRL + R 刷新 Cocos Creator。

可以看到,渲染窗口中的效果发生了变化。

我们调配置一些参数,让整个画面看起来更好些。

可以看到,当我们改动属性面板上的参数时,编辑器中就能实时看到对应的变化,非常方便。

值得说明的是,第三步只是当前版本需要,在后面的版本,比如 3.9 中,就不需要了。

关于每一个后期效果的属性介绍和使用方法,在 Cocos 引擎官方文档中都有解释。

并且呢,也有很多朋友分享了这方面的内容,大家可以去找找看,我们今天就不多说了。

接下来我们进入今天的主题:如何编写一个自己的后期效果 Shader。

后效 Shader 编写

后效 Shader 的编写,需要用到刚刚我们提到过的 BlitScreen 组件, BlitScreen 的作用就是将屏幕内容再绘制一次。

选中 Post Process 节点,在右边的属性面板中,我们给它添加一个 BlitScreen 后效。

可以看到,BlitScreen 上有一个材质参数。

这个材质就是决定绘制效果的关键。

接下来,我们只需要实现一个后效 Shader,并创建一个材质就可以了。

BlitScreen

Cocos Shader 编写,最快的方法就是从引擎提供的模板开始。

我们先找到引擎内置的后效 Shader。

在资源面板中,我们定位到 internal/effects/pipeline/post-process/

可以看到,引擎内置的后效 Shader 都在这里。 有兴趣的朋友可以自行去研究。

我们双击打开要用到的 BlitScreen

可以看到它非常简单,它的 vs 引用的是一个公共头文件,我们打开看看。

可以看到,它几乎什么都没有做,只是输出了用来绘制屏幕内容的位置信息以及我们在fs中需要用到的纹理坐标。

而在它的 fs 中,也只是将屏幕颜色原封不动地输出来。

接下来,我们就基于它来实现一个可以改变画面颜色的后效。

实现 Shader

我们选中 BlitScreen,右键选择 复制。

然后在 assets 目录下 右键选择 粘贴。
把它改名为 effect-post-color,双击打开。

这里的 include 的路径是不能用的,我们需要修改一下。 最简单的办法是直接把 vs 里的内容复制粘贴过来。

然后,我们添加一个 color 属性,用来设置目标颜色。

我们还需要定义一个对应的 uniform

找到 CCProgram fs 中的 UBO,在这里添加一个 vec4 color;

最后就是颜色合成了。 我们把 color.rgb 与原图颜色的乘积用来做目标颜色

再把 color.a 作为混合因子与原图插值。

我们的后效 Shader 就写好了。完整 Shader 代码如下,... 表示未做修改。

CCEffect %{
  techniques:
  - passes:
    ...
      properties:
        color: { value: [1.0,1.0,1.0,0.5], editor: { type: color } }
}%

CCProgram vs %{
  ...
}%

CCProgram fs %{
  ...
  uniform UBO {
    ...
    vec4 color;
  };
  ...
  void main () {
    fragColor = texture(inputTexture, v_uv);
    vec3 destColor = fragColor.rgb * color.rgb;
    fragColor.rgb = mix(fragColor.rgb, destColor, color.a);
  }
}%

现在我们来看看它的效果。

回到 Cocos Creator 中,新建一个材质,起名为 mat-post-color,然后把它的 effect 切换为刚刚写好的 effect-post-color

选中 Post-Process 节点,把它拖动到它的 Material 属性上。

调节参数,可以看到渲染效果跟着变化了。

我们的自定义后期效果 Shader 就完成了。

总结

需要注意的是,采用今天介绍的这种方法,只能实现单 Pass 的后期效果,比如 像变灰,蒙板 等等。

如果想要实现一些需要多 Pass 才能实现的效果,比如运动模糊,景深 等效果,就需要使用代码配合。我会在下一期文章中进行分享。

好啦,今天的内容就到这里,希望能够给大家带来帮助。

关注 麒麟子MrKylin,获得更多图形渲染和游戏开发知识。

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

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

相关文章

XUbuntu22.04之Linux剪切板和selection primary区域(一百八十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

二、Java框架基础02 XML

二、XML 2.1 XML 简介 XML 即可扩展标记语言,一种简单的数据存储语言,使用一系列简单的标记来描述结构化数据 XML 的特点 XML 与操作系统,编程语言的开发平台无关规范统一,实现不同系统之间的数据交互 2.1.1 XML 的文档结构 以下…

vulnhub靶场之CengBox3

1.信息收集 输入命令:netdiscover -i eth0 -r 192.168.239.0 ,发现181机器存活 输入命令nmap -p- -sV -O -Pn -A 192.168.239.181 ,进行端口探测,发现存在22、80、443端口,还发现存在域名ceng-company.vm。 将域名c…

【linux基础】05-linux文件系统

概述 在Linux中,文件系统是一种分层结构,它将文件和目录组织成树状结构。文件系统从“根”目录开始,该目录由单个正斜杠(“/”)表示。 如下图所示: Linux 支持多种类型的文件系统,包括: Ext4:这是大多数 Linux 发行版的默认文件系统。它是一个日志文件系统,提供良…

拉格朗日乘数法(Lagrange)的推导

同济版高数上,关于拉格朗日乘数法,以及好多知识点说的语焉不详、模棱两可,在阅读了知乎等博主的几篇文章后,才算勉强弄懂了该知识的原理。 首先说一下高数上隐函数求导。所谓的隐函数求导,就是在方程中多个变量之间的…

如何使用Java 实现excel模板导出---多sheet导出?

实现多个sheet的excel导出功能 效果展示&#xff1a; maven依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><dependency><groupId>or…

泛微E-Cology XXE漏洞复现(QVD-2023-16177)

0x01 产品简介 泛微协同管理应用平台E-Cology是一套兼具企业信息门户、知识文档管理、工作流程管理、人力资源管理、客户关系管理、项目管理、财务管理、资产管理、供应链管理、数据中心功能的企业大型协同管理平台。 0x02 漏洞概述 泛微e-cology某处功能点最初针对用户输入的…

STM32 点灯实现 7.18

嵌入式&#xff1a; 以应用为中心&#xff0c;以专用计算机为基础&#xff0c;软硬件可裁剪ARM A系列芯片&#xff1a;高端芯片&#xff0c;实现人机互动 R系列&#xff1a;实现时效性 M系列&#xff1a;低端芯片&#xff0c;控制硬件设备&#xff0c;灯&#xff0c;风扇....…

Springboot初识(一)

一.什么是Spring Boot Spring Boot是一个开源的、用于简化Spring应用程序开发的框架。它是Spring项目的一个子项目&#xff0c;旨在为Spring应用程序提供更快速、更便捷的开发体验。Spring Boot基于Spring框架&#xff0c;同时也整合了其他Spring项目和第三方库&#xff0c;使…

Unity-AssetBundle

一、AB 包介绍 ​ AB 包是特定于平台的资源压缩包&#xff0c;类似于压缩文件。其中资源可包括&#xff1a;模型、贴图、预设体、音效、材质球等等。 ​ 相较于 Resources 文件夹下的资源文件&#xff0c;AB 包能够更好管理资源&#xff1a; Resources 文件夹&#xff1a;打包…

【设计模式】23种设计模式——建造者模式Builder(原理讲解+应用场景介绍+案例介绍+Java代码实现)

介绍 建造者模式又叫生成器模式&#xff0c;是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别)&#xff0c;使这个抽象过程的不同实现方法可以构造出不同属性的对象建造者模式是一步一步创建一个复杂的对象&#xff0c;它允许用户只通过指定复杂对象的类型和…

【PHP面试题79】在Linux中如何设置MySQL和PHP服务开机启动

文章目录 &#x1f680;一、前言&#x1f680;二、设置MySQL服务开机启动&#x1f50e;2.1 打开终端&#x1f50e;2.2 编辑MySQL配置文件&#x1f50e;2.3 修改配置文件&#x1f50e;2.4 检查MySQL服务是否已启动&#x1f50e;2.5 设置MySQL服务开机启动 &#x1f680;三、设置…

C# Modbus通信从入门到精通(12)——Modbus ASCII协议原理

Modbus ASCII是串行链路上的协议,也就是说ModbusASCII是通过串口通信来实现的,它可以通过RS232、RS485物理层的接口来实现,同时它也是一个主从协议,在同一时间总线上只能有一个主站和一个或多个(最多247)个从站。Modbus通信总是由主站发起,从站没有接收到主站的请求时不…

NOAA国家强风暴实验室的天气雷达研究历史(1962年~2016年)

一、1962年-NSSP开始研究WSR-57 美国气象局国家严重风暴项目(NSSP)的一小群研究人员从堪萨斯城搬到俄克拉荷马州诺曼的天气雷达实验室,并开始研究最近安装的研究天气监视雷达-1957(WSR-57)。 二、1964年-NSSL开发的脉冲多普勒雷达技术 1956年,康奈尔航空实验室建造了一…

C++OpenCV(2):图像处理基础概念与操作

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 &#x1f506; OpenCV项目地址及源代码&#xff1a;点击这里 文章目录 图形读取与显示加载图片显示图片打印图片信息保存图片 色彩模型转换RGB颜色模型HSV颜色模型HLS模型LAB模型 图像像素读写操作像素算数运…

python机器学习(二)特征工程、K-近邻算法、KNN工作流程、scikit-learn实现K近邻算法、K值选择、距离计算、KD树

特征工程 把特征转换为机器容易识别的数据&#xff0c;把特征a转化为机器容易读懂、量化的语言 归一化Min-Max 将原始数据映射到[0,1]之间 X ′ x − m i n m a x − m i n X \frac{x-min}{max-min} X′max−minx−min​ 但是归一化是有弊端的&#xff0c;比如有一个值错误…

OJ练习第142题——路径总和 II

113. 路径总和 II 力扣链接&#xff1a;113. 路径总和 II 题目描述 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 Java代码&#xff08;深度优先搜…

基于linux下的高并发服务器开发(第三章)- 3.8 线程同步

sellticket.c /*使用多线程实现买票的案例。有3个窗口&#xff0c;一共是100张票。 */#include <stdio.h> #include <pthread.h> #include <unistd.h>// 全局变量&#xff0c;所有的线程都共享这一份资源。 int tickets 100;void * sellticket(void * arg)…

后处理材质球:黄金螺旋分割线和参考图

后处理材质球&#xff1a;黄金螺旋分割线和参考图 Begin Object Class/Script/UnrealEd.MaterialGraphNode Name"MaterialGraphNode_0"Begin Object Class/Script/Engine.MaterialExpressionLinearInterpolate Name"MaterialExpressionLinearInterpolate_1&qu…

(202307)wonderful-sql:初识数据库(task1)

学习知识 初识数据库 关系型数据库简介 特点是由行和列组成的二维表来管理数据&#xff0c;这种类型的 DBMS 称为关系数据库管理系统&#xff08;Relational Database Management System&#xff0c;RDBMS&#xff09;。本课程将向大家介绍使用 SQL 语言的数据库管理系统&am…