Cocos Creator Shader入门实战(三):CCEffect参数配置讲解

引擎版本:3.8.5

您好,我是鹤九日!



回顾


稍微回顾下前面两篇博客讲解的内容:

一、Cocos渲染效果的实现需要Material材质和Effect资源的互相配合。

二、Effect资源负责Shader片段的编写和属性配置,Material材质负责对Effect资源的包装和可视化调整。

三、官方引擎使用的是OpenGL ES渲染,语言是类C语言的GLSL。

四、在可编程渲染管线中用户只需关注顶点着色器和片段着色器的编写,顶点着色器用于坐标转换,片段着色器用于着色。

学习Shader,我们需要做到:遵循引擎设定规则,按照官方要求规范,才能更好的理解、使用Shader。



简介


上篇文章中,我们介绍了下OpenGL的渲染流程和GLSL的一些语法,主要为了能够理解着色器的一些流程原理。

但是这些内容,在引擎的设定规则中:Shader着色器代码相关,仅属于Effect资源配置的一部分。

Effect资源,结构主要有两部分:

一、借助 GLSL 类C语言,实现顶点、片段着色器的部分代码编写,通过CCProgram来配置。

二、借助 YAML 类Json语言,声明的渲染流程的一些属性参数,通过CCEffect来配置。

两部分内容互相补充,才能共同构建一个完整的渲染流程描述,这样的描述才能被Material材质资源使用。

Effect资源的大概结构如下:

CCEffect %{// 渲染技术、过程、状态、材质和属性参数的配置
}CCProgram sprite-vs %{// 顶点着色器的片段代码
}%CCProgram sprite-fs %{// 片段着色器的片段代码
}%
  • CCEffect %{}% 实现渲染参数配置相关
  • CCProgram %{}% 实现着色器片段代码逻辑

今天的内容,讲解关于Effect资源下的流程配置参数,即CCEffect

理解了它,再结合着色器片段代码,我们便理解:Material材质对Effect包装后,通过属性检查器的一些属性展示,以及后续如何通过代码来配置自定义的属性参数。

注:能力有限,理解可能有误,期待您的谅解,并欢迎您的指出,感谢。



YAML


CCEffect的配置是通过YAML实现的,它是一种数据序列化格式,主要用于配置文件、数据交换等。

特点:简洁易读、层次结构清晰,支持多种数据类型,兼容性强,可转换为Json、XML、CSV等。

刚开始学习的阶段,YAML语言看似对初学者是不友好的。

还好,官方的引擎采用的是YAML 1.2标准的解析器,我们也能使用JSON进行配置,只是JSON的配置难免会繁琐些。

builtin-sprite.effect为例,看下官方内置的Effect属性配置。

路径:../internal/effects/builtin-sprite.effect

CCEffect %{techniques:- passes:- vert: sprite-vs:vertfrag: sprite-fs:fragdepthStencilState:depthTest: falsedepthWrite: falseblendState:targets:- blend: trueblendSrc: src_alphablendDst: one_minus_src_alphablendDstAlpha: one_minus_src_alpharasterizerState:cullMode: noneproperties:alphaThreshold: { value: 0.5 }
}%

将它转换为Json内容:
请添加图片描述
这样的对比,是否能看清晰的看到YAML和JSON的区别呢。工具相关

https://www.lddgo.net/convert/yaml-to-json : 没有广告,但不支持XML、CSV的转换

https://codebeautify.org/yaml-to-json-xml-csv:功能强大,但有广告


特性

YAML语言,真正的强大不是简洁,而是是引用继承

先以官方文档的示例演示下:

  • 引用的主要结构是: &name*name
    请添加图片描述

  • 继承的主要结构是:&name<<: *name
    请添加图片描述

再以builtin-unit.effect的部分配置为例:

路径:../internal/effects/builtin-unit.effect
请添加图片描述

注: 右侧便是最下面引用的数据字段

引用和继承,这两个特性是可以实现对配置的复用的。


语法

YAML的语法,没有想象中的那么难,只是新的东西,恐惧让我们畏难而已。

注意:千万不要将CCEffect的参数设置认定为语法的组成部分,我当时就是这么想的,愁坏我了…

语法相关,主要内容相关如下:

一、行首的空格代表数据的层级

二、所有的引号、逗号都可以省略,但空格和冒号不可省略

三、以减号加空格开头的,表示数组元素

四、引用的主要结构是: &name*name

五、继承的主要结构是:&name<<: *name

这就够用了。



属性结构


YAML语法的使用,主要是用于配置渲染的属性参数,这些参数类型可以这样划分:

一、以techniques命名的渲染技术, CocosShader定义的重要概念

二、以passes命名的渲染过程, CocosShader定义的重要概念

每个渲染过程 pass 主要包括的参数有:

  1. 必备参数:顶点、片段着色器的名字配置

  2. 可选参数:着色器不同状态的设置,比如深度、模板、混合模式、光栅化等

  3. 可选参数:自定义属性参数的配置,主要用于uniform或材质中属性的调整

简单的理解:渲染技术用于实现不同的渲染模式,渲染过程用于配置不同渲染模式下的参数和属性。

渲染技术可定义多个,每个渲染技术可包含多个渲染过程,每个渲染过程必须带有顶点和片段着色器的配置。

这就是YAML配置下的整体CCEffect的结构。

bultin-sprite.effect为例, 配置属性如下:

注:如果渲染技术只有一个,name名字可忽略

CCEffect %{# 声明渲染技术techniques:# 声明渲染流程- passes:# 声明顶点、片段着色器名和入口名  - vert: sprite-vs:vertfrag: sprite-fs:frag# 设置深度、模板测试的状态depthStencilState:depthTest: falsedepthWrite: false# 设置混合模式blendState:targets:- blend: trueblendSrc: src_alphablendDst: one_minus_src_alphablendDstAlpha: one_minus_src_alpha# 设置光栅化状态rasterizerState:cullMode: none# 自定义属性properties:alphaThreshold: { value: 0.5 }
}%

注:在学习2D shader的过程中,此属性结构除了properties自定义属性外,大多为通用性配置。

接下来,我们简要说明下每块的属性相关。

渲染技术(Technique)

渲染技术是Cocos Shader定义的一个重要概念,用于描述渲染过程(pass)的整体结构和配置。

多个渲染技术存在的情况下,每个渲染技术都必须特定的名称(name),用于标记渲染技术的用途,CCEffect配置支持定义多个,但实际的应用只能有一个。

Cocos引擎,这样的设计目的可能是:

一、通过定义多个不同技术,用于实现不同的渲染模式。就如builtin-unlit.effect 中包含四种技术:

  • opaque 用于渲染不透明物体
  • transparent 用于渲染半透明物体
  • add 采用加法混合模式,渲染半透明物体
  • alpha-blend 采用透明混合模式,渲染半透明物体

二、满足不同场景的需求,优化性能,避免不必要的计算和渲染开销。

三、作为跨平台引擎,用于满足不同平台的特性

在Material材质的属性检查器中,通过Technique 便可选择不同类型的渲染技术。
请添加图片描述

渲染过程(Pass)

它同样是Cocos Shader定义的一个重要概念,它主要用于定义和配置对象的渲染状态和属性。

每一个Pass都是一个独立的渲染指令集合,在每个渲染技术(technique)中,可包含多个。

每个渲染过程(pass)都必须配置vertfrag的名字和入口参数,其它都是可选。

注:名字和入口,可以是文件中CCProgram声明的,也可以是引擎提供的标准头文件相关

比如:我们创建的无光照effect文件,它的顶点着色器就是引用的引擎提供的:

techniques:- name: opaquepasses:# 引擎提供的通用性片段相关,在引擎中这些封装被称为Chunks- vert: legacy/main-functions/general-vs:vert # builtin header]# Effect资源配置文件下的内部定义frag: unlit-fs:frag...

注:自定义的着色器入口名不要使用main,因为引擎编译的时候会自动添加main作为渲染的入口

在CocosShader的渲染中,渲染过程是按照顺序依次执行的,组合起来便是复杂的渲染效果。

builtin-unlit.effect的opaque渲染技术为例:
请添加图片描述

  • Pass 0: 基础渲染,用于渲染不透明物体的主体部分
  • Pass 1: 平面阴影渲染,用于在场景中添加简单的阴影效果。
  • Pass 2: 延迟前向渲染

渲染管线状态

渲染过程(pass)中配置一些参数,比如:光栅化、混合模式、深度和模版测试等,这些又被官方称为PipelineStates

更多的参数说明可参考官方文档:PipelineStates

这里简单罗列三个:

一、DepthStencilState 光栅化时的可选渲染状态

二、RasterizerState 深度和模板缓存的测试与状态

三、BlendState 材质混合状态

 # 配置深度、模板测试depthStencilState:# 禁用深度测试,它用于判断一个像素是否被其他像素遮挡depthTest: false# 禁用深度写入depthWrite: false# 配置透明混合状态blendState:targets:# 启用混合模式# 这种混合模式是最常见的 透明度混合模式,公式为:# Final Color = SrcColor * SrcAlpha + DstColor * (1 - SrcAlpha)# 它适用于常见的半透明效果,例如透明纹理、UI元素等。- blend: true# 源因子设置为 src_alpha,表示使用片段颜色的 alpha 值作为混合因子blendSrc: src_alpha# 目标因子设置为 one_minus_src_alpha,表示使用 1 - src_alpha 作为混合因子blendDst: one_minus_src_alphablendDstAlpha: one_minus_src_alpha# 配置光栅器状态rasterizerState:# 禁用面剔除,常见参数有:front, back, nonecullMode: none

注:能力有限,后续的学习再逐渐的补充原理相关…


属性参数(properties)

属性参数在CCEffect配置中,简单可理解为:

一、定义着色器中的unifrom变量,用于处理着色器的实现逻辑。

二、在Material的属性检查器中显示,用于Shader效果的可视化调整。

虽然是自定义,但毕竟涉及到Shader的实现和可视化。除了通用的属性值:value 以外,我们可以将其分为两部分:

注:更多参数可参考:Property 参数列表

一、samples 纹理相关

请添加图片描述

二、editor参数

主要应用于编译器的属性检查器中, 主要属性有:
请添加图片描述

简单的示例:

lightCenterPoint: { value: [0.2, 0.2], editor: { tooltip: "光束中心点坐标" }}
lightAngle: { value: 36.0, editor: { tooltip: "光束倾斜角度" }}


最后


今天的文章内容大概就说到这里了,内容相关部分参考了官方文档的一些说明,主要有:

着色器语法 :文档内容主要讲解的是Effect资源的配置结构

Pass可选配置参数: 文档内容主要对Pass渲染中的参数进行了详细的说明

YAML 语法:主要说明了YAML语法的使用

不瞒您说,Shader的基础理论的确枯燥无味,然而又不得不懂,学习的过程中,好奇是虽然都存在的,我们都一样。

就看能不能熬下去了,这里想说两点:

一、为自己的能力不足,不能为您深入讲解感到抱歉

二、期待与您一起在学习的路上变的强大

我是鹤九日,祝您生活愉快!

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

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

相关文章

AI日报 - 2025年3月10日

AI日报 - 2025年3月10日 &#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; AGI突破 | Anthropic CEO预测强AI最早2026年到来 &#x1f52c; SAGE框架提升问答质量61.25%&#xff0c;Reflexion框架将GPT-4成功率提至91% ▎&#x1f4bc; 商业动向 | xA…

【SegRNN 源码理解】【今天不水文系列】编码器部分理解

我来小小的理解一下&#xff1a; 首先&#xff0c;16 batchsize&#xff0c;60sequendcelength&#xff0c;7 个特征的通俗解释 16 个独立的样本&#xff0c;每个样本有 60 个连续的时间步及对应的标签值&#xff0c;每个时间步有 60 个特征 所以就是因为样本是随机从训练集…

加速科技Flex10K-L测试机:以硬核创新重塑显示驱动芯片测试新标杆!

在2024年召开的世界显示产业创新发展大会上&#xff0c;加速科技自主研发的高密度显示驱动芯片测试设备Flex10K-L凭借其突破性技术创新&#xff0c;成功入选"十大创新技术&#xff08;产品&#xff09;"。作为国内显示驱动芯片测试领域的标杆性设备&#xff0c;Flex1…

Docker 部署 Vaultwarden

一、前言 1. 官网 1.1 Vaultwarden https://github.com/dani-garcia/vaultwarden https://github.com/wcjxixi/Vaultwarden-Wiki-Chn https://hub.docker.com/r/vaultwarden/server https://rs.ppgg.in/ # Vaultwarden Wiki 中文版 https://geekdaxue.co/read/Vaultward…

如何下载和使用Git:初学者指南

&#x1f31f; 如何下载和使用Git&#xff1a;初学者指南 在当今的软件开发中&#xff0c;Git已经成为不可或缺的版本控制系统。无论你是独立开发者还是团队成员&#xff0c;掌握Git的基本操作都能帮助你更高效地管理代码。今天&#xff0c;我将详细介绍如何下载和使用Git&…

doris: SQL Server

Doris JDBC Catalog 支持通过标准 JDBC 接口连接 SQL Server 数据库。本文档介绍如何配置 SQL Server 数据库连接。 使用须知​ 要连接到 SQL Server 数据库&#xff0c;您需要 SQL Server 2012 或更高版本&#xff0c;或 Azure SQL 数据库。 SQL Server 数据库的 JDBC 驱动…

Leetcode 刷题记录 05 —— 普通数组

本系列为笔者的 Leetcode 刷题记录&#xff0c;顺序为 Hot 100 题官方顺序&#xff0c;根据标签命名&#xff0c;记录笔者总结的做题思路&#xff0c;附部分代码解释和疑问解答。 目录 01 最大子数组和 方法一&#xff1a;动态规划&#xff08;卡达尼算法&#xff09; 方法…

《DataWorks 深度洞察:量子机器学习重塑深度学习架构,决胜复杂数据战场》

在数字化浪潮汹涌澎湃的当下&#xff0c;大数据已然成为推动各行业发展的核心动力。身处这一时代洪流&#xff0c;企业对数据的处理与分析能力&#xff0c;直接关乎其竞争力的高低。阿里巴巴的DataWorks作为大数据领域的扛鼎之作&#xff0c;凭借强大的数据处理与分析能力&…

wordpress自定the_category的输出结构

通过WordPress的过滤器the_category来自定义输出内容。方法很简单&#xff0c;但是很实用。以下是一个示例代码&#xff1a; function custom_the_category($thelist, $separator , $parents ) {// 获取当前文章的所有分类$categories get_the_category();if (empty($categ…

2025牛客寒假算法基础集训营6

A.复制鸡 思路&#xff1a;比较简单&#xff0c;略。 void solve() {int n, m, k;cin >> n;int last -1, ans 0;for (int i 0; i<n; i){int x;cin >> x;if (x ! last){ans;}last x;}cout << ans << endl; } B.好伙计猜拳 思路&#xff1a;这…

【C#】详解C#中的内存管理机制

文章目录 前言一、C#内存管理的基本机制&#xff08;1&#xff09;托管堆&#xff08;Managed Heap&#xff09;&#xff08;2&#xff09;垃圾回收&#xff08;Garbage Collection&#xff09;&#xff08;3&#xff09;栈内存 二、 开发者需要主动管理的场景&#xff08;1&am…

ROS云课基础题库-01C++案例-甜甜圈

效率是核心&#xff0c;但效率高的教程会忽略掉非常多的细节。 解决问题的思路和细节对于一个问题的有效求解至关重要。 资料 云课五分钟-02第一个代码复现-终端甜甜圈C-CSDN博客 从云课五分钟到五秒钟焦虑的甜甜圈向前冲-CSDN博客 说明 复现重要性没有那么大&#xff0c;…

C/S架构与B/S架构

一、定义与核心区别 C/S架构&#xff08;Client/Server&#xff0c;客户端/服务器&#xff09; 客户端需安装专用软件&#xff08;如QQ、企业ERP系统&#xff09;&#xff0c;直接与服务器通信。服务器端通常包括数据库和业务逻辑处理1。特点&#xff1a;客户端承担部分计算任务…

【汇编语言】单片机程序执行过程

一、任务需求 指示灯LED4闪烁&#xff0c;亮0.5秒&#xff0c;灭0.5秒&#xff0c;无限循环 二、针对硬件的编程 1、确定原理图2、确定硬件的物理关系 三、设计步骤 1.用自己的语言描述工作流程 1.1指示灯LED4亮1.2延时0.5秒1.3指示灯LED4灭1.4延时0.5秒1.5跳转到1.1步 …

openharmony 富对富 WiFi投屏设计

castengine_wifi_display部件别名Sharing&#xff0c;媒体分享之意。拥有流媒体协议接入、媒体预览、媒体转分发能力&#xff0c;受投播管理服务管理和调用&#xff0c;是音视频投播子系统重要的流媒体能力部件。提供一套简单的Native C的接口&#xff0c;主要业务是Miracast投…

Android项目优化同步速度

最近项目需要使用ffmpeg&#xff0c;需要gradle配置引入ffmpeg库&#xff0c;发现原来通过google官方的代码仓&#xff0c;下载太慢了&#xff0c;每秒KB级别的速度。&#xff08;之前下gradle/gradle plugin都不至于这么慢&#xff09;&#xff0c;于是想到配置国内镜像源来提…

Git 如何配置多个远程仓库和免密登录?

自我简介&#xff1a;4年导游&#xff0c;10年程序员&#xff0c;最近6年一直深耕低代码领域&#xff0c;分享低代码和AI领域见解。 通用后台管理系统 代号&#xff1a;虎鲸 缘由 每次开发后台界面都会有很多相同模块&#xff0c;尝试抽离出公共模块作为快速开发的基座。 目标…

JVM组成面试题及原理

Java Virtual Machine&#xff08;JVM&#xff09;是Java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收机制 JVM由哪些部分组成&#xff0c;运行流程是什么&#xff1f;…

江科大51单片机笔记【11】AT24C02数据存储秒表

一、数据存储 先把需要的模块导入做个测试 //main.c#include <REGX52.H> #include " LCD1602.h" #include " Key.h"void main() {LCD_Init();LCD_ShowString(1,1,"Hello");while(1){}} 代码思路 分成两块写&#xff0c;一块写I2C.c&am…

Hadoop的运行模式

Hadoop的运行模式 1、本地运行模式2、伪分布式运行模式3、完全分布式运行模式4、区别与总结 Hadoop有三种可以运行的模式&#xff1a;本地运行模式、伪分布式运行模式和完全分布式运行模式 1、本地运行模式 本地运行模式无需任何守护进程&#xff0c;单机运行&#xff0c;所有…