当前位置: 首页 > article >正文

Cocos Creator Shader入门实战(一):材质和Effect的了解

引擎版本:3.8.5

环境: Windows


简介


在Cocos Creator中,游戏炫彩缤纷的效果是借助着色器(Shader)来实现的。

Cocos主要基于OpenGL ES,而Shader的编写则是在可编程渲染管线中基于修改:顶点着色器(Vertex)片段着色器(Fragment) 完成的。

Cocos官方,为了简化着色器的复杂配置,更多灵活性,以及能够通过编译器进行可视化管理等等,在Cocos Creator中,实现Shader主要借助两个文件:EffectAssetMaterial材质

两者都属于资源文件,简单的理解:

一、EffectAsset 负责Shader的编写、配置和各种属性定义等

二、Material材质 负责对EffectAsset的数据包装,并将一些属性数据可视化显示在属性检查器中,方便用户管理和操作。

可以认为:在Cocos Creator中,想实现各种不同的渲染效果;需要通过Effect配置属性和着色器编写,通过材质来实现对Effect的包装,进而显示出不同的效果。

两者是相辅相成的,缺一不可的。


学习的困惑


初次接触材质和Effect的时候,我一脸的茫然。

毕竟从事游戏开发,像OpenGL、渲染、Shader等这些专业的术语,即使不曾使用,在面试中也是无法摆脱的。

当我第一次看到Material材质的属性配置:
请添加图片描述

第一次看到Effect的属性配置:
请添加图片描述

即使有着官方文档的加持,我也是一脸的茫然,不知道这些到底代表着什么,以及如何使用。

再到后来,慢慢的明白:看似好像没有接触使用过它们,但实际上它们就像是空气一样,在你的周围弥漫。

因为不管怎样,游戏客户端中所展现的任何可视性的效果都是渲染。

如果从细节上来说,比如:

在Creator 2.4.x版本中,关于某个Sprite的属性显示:

请添加图片描述

在Creator 3.8.x版本中,关于某个Sprite的属性显示:
请添加图片描述

这些都是官方对渲染组件的默认配置,前者展示了默认的材质配置,而后者虽然没有显示出来,但依然会默认配置。

稍微延伸下,为什么CocosCreator针对于组件的设定,分为UI组件和渲染组件呢,原因也在这里。

困惑、畏难这些都是难免的,早晚都需要经历和学习,这里提前预祝您的成功。

注:当你慢慢开始学习的时候,你可能会想我一样:哦,原来是这样子!


编译器创建


接下来,我们继续说明材质Material和EffectAsset。在编译器中,它们都是支持编译器创建的。


材质的构建

主要有两种:

一、物理材质:Physics Material,主要用于记录物体的物理属性相关,被用于碰撞系统。

二、普通材质: Material,主要被用于管理Effect资源,并控制着色效果的展示。

请添加图片描述

以普通材质Material为例,创建后的属性如下图所示:

请添加图片描述

主要属性有:

  • sphere: 材质的预览效果,可选择box、sphere、capsule等进行预览
  • Light: 指的是是否启用光照效果
  • Effect: 指的是材质当前使用的着色器,可通过下拉框进行选择
  • Technique: 指的是材质使用着色器中的哪种技术
  • Pass… 指的是Effect中Technique所包含的Pass流程,每种Technique可以包含多个Pass
  • USE INSTANCING 指的是Effect中宏定义的开关

针对于Technique、Pass和宏定义这三个参数,是在Effect中使用 YAML语言配置的参数属性。


EffectAsset的构建

着色器资源的创建,编译器同样支持两种:

一、传统无光照着色器: Effect,同文字描述所言,没有光照效果的实现。

二、表面着色器:Surface Effect, 基于PBR的着色器。

PBR全称:Physically Based Rendering 基于物理的光照模型

CocosCreator 从 v3.0 开始提供了基于物理渲染(PBR)的光照着色器:builtin-standard.effect

它可根据现实中光线传播原理和能量守恒定律,模拟出近似于真实物理光照的效果,主要用于3D。

请添加图片描述

这里以构建无光照的着色器为例,创建后的属性如下:

请添加图片描述

主要属性部分有:

  • shaders : 当前的着色器名称相关
  • Precompile Combinations 预处理宏定义组合相关,通过on/off的开关来决定是否是否启用
  • GLSL 300 ES/100 Output 着色器的输出模式和预览

这里要说明下:

一、宏定义的组合可以更灵活的实现不同着色器效果的实现,并实现复用性。

二、300 ES 和 100 是引擎主要用于适配不同的WebGL版本和硬件支持。

前者基于WebGL 2.0标准,支持更多的图形功能、更复杂着色器功能实现和更高的性能化;而后者主要基于WebGL 1.0标准,功能有限,主要用于向下兼容旧的硬件和浏览器。

三、输出的代码是引擎根据Effect提供的配置参数,解析后生成的。

在实际的编写中,我们只需关注:

  • CCEffect属性的配置

  • CCProgram着色器片段的编写


写到最后

今天的文章暂且就告一段落,因为贪多嚼不烂。

另外,总结了几个小小的想法或者说是建议,主要有这么几点:

一、Shader的使用,由于游戏引擎的封装的便利性,很可能导致我们认为这是一门很遥远的技术,不是不用,而是没有关注过。

二、请不要过于的追求极致性,还有真正的了解,便开始了各种底层的学习,先模仿再创造,先完成再完美。

三、CocosShader效果的实现需要借助Material来,我们通过代码实现Effect效果也是通过获取材质来设置属性。

四、Effect的实现主要两部分: 一是通过CCEffect配置属性 二是通过CCProgram编写着色器片段。

理解可能有误,但依然希望能够帮助到您,感谢!


http://www.kler.cn/a/559377.html

相关文章:

  • docker容器网络配置及常用操作
  • 如果二者隔离级别不一致,以哪个为主。例如@Transactional 隔离级别是RC,mysql是RR
  • FunAudioLLM:用语音大模型解锁智能语音交互的无限可能
  • 第六届全球数据库大赛:PolarDB TPC-C性能优化挑战赛方案分享(一)--参数调优
  • Linux相关概念和易错知识点(30)(线程互斥、线程同步)
  • SQLMesh 系列教程8- 详解 seed 模型
  • C#贪心算法
  • 第六次作业
  • HTTP实验(ENSP模拟器实现)
  • C语言基础之【函数】
  • docker下安装 es 设置账号密码
  • 使用 Grafana 监控 Spring Boot 应用
  • 离子阱量子计算机的原理与应用:开辟量子计算的新天地
  • 分布式服务注册与发现
  • Maxscript血管网络分形的算法实现
  • Golang学习笔记_36——装饰器模式
  • DeepSeek本地搭建 和 Android
  • 后门慈善家
  • Leetcode 3464. Maximize the Distance Between Points on a Square
  • C#素数判定算法