Introduction

PRB 材质改变了人们对于引擎实时渲染画面的理解,让玩家在游戏中,也能够体验到锈蚀的金属,厚重的皮革,精细的纹理,感受更加真实的世界。在正式发布的 Cocos Creator 3D 中,真实感渲染和强大的材质系统成为开发者关注的一大重点。

为了给 Web 和小游戏平台带来更好的 3D 游戏表现,Cocos Creator 3D 首次真正将基于物理渲染全面带到了小游戏中,不仅支持 PBR 材质,还将光源系统和渲染统一升级为基于物理的度量衡和算法。

在 9 月份深圳技术分享会上,Cocos 3D 引擎开发工程师武云潇,为与会开发者带来了 Cocos Creator 3D 材质系统的分享,内容由浅及深,实机演示 3D 材质系统的工作流,并准备了具体的案例学习环节。

讲师,Cocos 武云潇

以下内容是演讲干货整理:

Definition

要了解材质系统,首先需要知道什么是材质。

要知道什么材质,首先需要明确什么不是材质。

下面我以头盔场景作为案例,为大家展示讲解。

对于这个头盔而言,材质系统到底在其中发挥了什么作用呢?

为了更直观地说明,我们不妨把所有材质系统的贡献全部剔除,看看还会剩下什么。

可以观察到,除了头盔的形状,所有的表面细节、对光照的反馈、颜色质感等信息都消失了。这些信息决定着一个几何体的材质,也是材质系统控制和提供定制化的最重要的内容。

而几何体的形状本身,是由模型数据决定的,如果我们把这部分最原始的数据可视化出来,可以看到,这一个个分散的三角形,才是游戏世界中所有模型的本来面貌。

如果把渲染看做画画,材质系统最重要也是最基础的功能,就是在已有线稿的基础上,控制如何给这里的每个三角形上色。

(当然更进阶的,也可以控制线稿本身的一些细节,甚至处理更为复杂的计算任务,如骨骼动画的蒙皮等)

Presentation

现在我们对课题有了基本的定义,就让我们来利用引擎内置的材质系统,一层层把颜色上回去,以熟悉一些基本的工作流

头盔模型使用的是标准材质,背后是目前业界普遍使用的基于物理的渲染模型(PBR),是一套很好地权衡了高效和美观的算法。

当算法框架足够合理时,视觉上的“美观”很大程度上就取决于“信息量”了,这个模型本身是专门为展示 PBR 各个层级特性而制作的,可以看到,随着每一层贴图信息的加入,它们共同融合成了一套统一和谐的效果。

当然材质系统的任务是提供方便的定制化,所以并不和某套渲染模型挂钩,在同样的系统下,我们可以很方便地提供比如卡通渲染的支持。

(致谢:卡渲框架设计受 UTS2 启发)

Deconstruction

这里要提一下,材质系统是 Cocos 针对 Creator 3D 架构设计的,但目前 Creator 2D 从 2.1.1 版本开始同步引入了材质系统,已在使用其中大部分的前端设计,并针对渲染后端做了适配和优化,所以今天分享的内容对两款产品均适用。

首先既然定位是小而精,那么需要明确,我们希望做到的,和我们没有打算做到的(至少现阶段而言)

我们希望做到:

  • 对 TA:全自动处理书写 shader 过程中琐碎易错细节的趁手有力的工具

  • 对 TA:任何内容与算法都应不受阻碍地完成

  • 对美术:以最便利、符合直觉的方法接收 TA 的产出,无缝连接下一步的创作

现阶段不打算做到:

  • 工业级别的 shader 语言转译/优化器

  • 使零程序基础的美术也能加入 shader 创作流程

我们希望在 TA 和美术各司其职,各自发挥优势的过程中,引擎和编辑器能够首先成为双方合作的坚实基础和便利桥梁。最终设计也是这点的直接映射,一个非常小巧高效的系统,各自有着明确的目标和能力:

  • EffectAsset 是由 TA 或图形程序设计制作,提供定制化的着色机制和数据接口

  • Material 是由美术创建,会被大量用在实际游戏场景中的资源实例,负责提供所有实际使用的数据

  • 所有 EffectAsset 层提供出的接口都会以最自然便利的方式在 Material 面板上呈现

这里举两个小细节,更多信息及接口文档参考 [3]

  • Shader 中所有 uniform 变量声明都会在资源导入时解析依赖宏,并直接映射到编辑器的材质 Inspector 上

TA 只需要按照标准 GLSL 语法完成目标逻辑,大部分繁琐易错的胶水代码可以全部通过固定解析流程自动对接。

  • 对于需要自定义这个过程的需求,有完善的 uniform 重定向,及类似 ccclass 的定制系统 [5]

比如这里红框内的四个属性,在 Shader 中其实是同一个 vec4 的不同分量(参考 [4] 关于 UBO 成员布局的考虑,为了达到最佳性能确实会出现类似需求),但为了使用起来更符合直觉和便于调整,在 Effect 中为每个分量单独增加了新的属性,使得它们可以被独立编辑,无论是在 Inspector 还是代码中直接调用。

现在我们清楚了材质使用层面的设计,让我们继续深入底层,来看看在 Effect 层面我们有哪些实用的设计。这是一份标准的 Cocos Effect 文件示例(也是引擎内置天空盒使用的 Effect):

在声明式语法的大框架下,已经可以看出一些有趣且实用的选择,它的主要特性有:

  • 统一的 Shader 语法(GLSL 300 ES)

  • 多 Technique 多 Pass 支持

  • 标准头文件库、Include 机制

  • 常规语法自动 Fallback GLSL 100

  • 进阶语法通过 __VERSION__ 宏手动 Fallback

  • 大量引擎、渲染管线、运行平台相关的类型检查

  • 定制化 Inspector 对接集成

这背后是一直在不断完善的 Cocos Effect 语法和编译器,从设计之初理念就忠于 C 语言设计哲学,我们致力于提供一套明确清晰的 Shader 书写工具集,使得每一个细节的控制都是透明可见/可推导的。更多 Effect 相关具体特性这里不再详细解析,可移步参考官方文档 [4]。

Demonstration

恭喜大家坚持到了现在,我们终于要进入今天的案例环节了。

今天的案例是头发高光的计算。无论在现实生活还是各类动漫游戏作品中,头发高光都是头发不可或缺的一项标志特性,也非常讨人喜爱。

素材来源于《Blue Reflection》,仅作学习交流使用

那么如何在游戏项目中实时计算这样的高光呢?

我们先来尝试简化问题,这里是一个使用标准卡通渲染的球体(下图),它的高光是按标准 Blinn-Phong 模型计算的,可以看到只在光源的理想反射方向可见,就是一个圆点。

但如果我们把这个球体近似地看成角色头发的话(如上图右下角示意),其中最显著的特征是,我们希望这个高光不是一个圆点,而是……一个圈。

我们今天案例解析的重点,就是如何从物理上理解,并实时近似计算这个高光圈。

参考学界的一些相关论文,这个问题的基本思路是把每根发丝近似地看成是一个个很小的半透明圆柱体,而可以证明 [1],在理想圆柱体上,对平行光而言,它的所有出射光线都在一个和理想反射方向倾角相同的圆锥上(如下图中间示意)

我们看到的头发上连成一圈的高光,就是因为这个特性而产生的。(联系下现实生活的话,其实是发质越好发丝越接近圆柱体,所以高光越明显)

所以有了基本的模型,我们来扩展一下基本的 Blinn-Phong 高光计算,让它从单一方向变成到整个圆锥,就应该能在这个球体上看到变化。

可以很快发现,这个圆锥中轴与发丝方向平行,圆锥大小只是由一个与发丝方向的夹角决定的,那如何取这个夹角呢?

这样的需求,一般会使用模型的切空间数据来辅助计算,我们先来看一下这个球体的切空间数据。

这里做了切空间数据的可视化,图中球体上黄色线段就是每个顶点的副切线,可以看出也是我们需要的“发丝方向”。

当然对于更一般的头发模型来说,这个方法会对模型的 uv 展开方式有要求,要求头发部分的 uv 纵轴应当与发丝方向基本一致;不过好在这种展开方式相对普遍,制作美术资源时也经常这样做,所以适用性还是较为普遍的。

我们在 shader 中可以很方便地把每个片段计算 BRDF 常用的向量(R、V、N、H、L)和副切线 (T) 取到,根据论文 [2] 中的思路,这里我们也直接用一个 gaussian 来做近似,那么可以基于 Phong 着色模型,写一个最符合直觉、易于理解的版本:

其中 mr 就是通过 gaussian 算出的连续的高光亮度,通过一个 step 函数切出卡渲效果的硬边。

在此基础上可以进一步尝试优化为 Blinn-Phong,写出来要比想象中更高效一些:

这里 3 和 6 其实都是用户可调参数,为了对接原有卡渲参数这里调整合适后硬编码进来,最后运行效果是这样:

这样我们就有了一个适用于发丝的卡渲 shader 了,调整一下还可以控制高光宽度和位移(想一想位移参数应该怎么加)。如果从背光面观察可以看到还是有一部分不太真实的反射,这是因为我们没有考虑方位角维度上的反射强度差异。并且像图中所示那样,我们其实只非常粗略地计算了完整发丝高光模型的主高光,即反射部分,还有更多的散射项没有考虑。这里不再深入介绍,感兴趣的同学,推荐阅读下面两篇参考论文 [1]、[2] 深入了解,并尝试自己实现更真实完整高光的效果。

复制链接至浏览器中打开,即可查看!

参考论文及文档

[1] [Marschner 03] 

Light Scattering from Human Hair Fibers

[2] [Sadeghi 10] 

An Artist Friendly Hair Shading System

[3] Material 文档 

https://github.com/cocos-creator/docs-3d/blob/master/zh/material-system/overview.md

[4] Effect 文档 

https://github.com/cocos-creator/docs-3d/blob/master/zh/material-system/effect-syntax.md

[5] Pass 中可定制化参数文档 

https://github.com/cocos-creator/docs-3d/blob/master/zh/material-system/pass-parameter-list.md

[6]完整工程下载链接(内含论文[1][2])

https://pan.baidu.com/s/1YojDdyWBTr108w-8a4R1pw

Conclusion

以上就是我今天带来的材质系统介绍,欢迎大家下载和使用 Cocos Creator 3D,关于材质系统及 3D 创作过程中的问题和经验,欢迎各位开发者在 Cocos 中文社区与我们交流!

Cocos Creator 3D 下载:

https://www.cocos.com/creator3d

Ccocos Creator 3D 文档:

https://docs.cocos.com/creator3d/manual/zh/

Cocos 中文社区:

https://forum.cocos.com/

Cocos Creator v2.2 正式发布

Cocos Creator 3D v1.0 正式发布

Cocos Creator 3D 物理模块介绍

Cocos 引擎 UI 全新升级:进一步提升编辑器体验

极限开发《TheCode》和《Shoot the F》创作笔记

Cocos Creator 2.1.3 正式发布

微信创意小游戏橙皮书发布

用 Cocos Creator 制作平台跳跃游戏

Cocos技术派|3D小游戏《快上车》技术分享

Cocos海外开发者专访:遗憾的是没早点开始做游戏

我的小游戏开发之路|腾讯TGideas周桂华(花叔)

Gameloft 如何打造 Facebook 小游戏玩转越南市场

我就知道你“在看”▼

小姐姐,你的发丝高光怎么用 Creator 3D 实现?相关推荐

  1. Cocos Creator 3D v1.0.2 正式发布,新增小游戏平台支持

    ​Hi,各位开发者,Cocos Creator 3D 为大家带来翘首以待的新平台和新功能支持,v1.0.2 已正式发布,欢迎大家移步官网下载使用! 升级之前请根据项目情况进行必要的技术评估和版本备份噢 ...

  2. 如何用 Cocos Creator 3D 如何实现小姐姐的发丝高光?

    Introduction PRB 材质改变了人们对于引擎实时渲染画面的理解,让玩家在游戏中,也能够体验到锈蚀的金属,厚重的皮革,精细的纹理,感受更加真实的世界.在正式发布的 Cocos Creator ...

  3. cocoscreator3d 模型透明_用 Cocos Creator 3D 实现小姐姐的发丝高光

    ​本文作者:武云潇 Cocos Creator 3D 引擎开发工程师 >>作者知乎:YunHsiao Wu >>作者其他文章:<It's not a bug, it's ...

  4. Creator 3D 实现小姐姐高光发丝,这帮引擎大佬真的是服了!

    Introduction PRB 材质改变了人们对于引擎实时渲染画面的理解,让玩家在游戏中,也能够体验到锈蚀的金属,厚重的皮革,精细的纹理,感受更加真实的世界.在正式发布的 Cocos Creator ...

  5. GitHub 热榜:歪果小姐姐教你用纯代码画画,真细腻!

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 转自量子位 HTML 不是编程语言,但这并不妨碍精通它的大佬玩出花来. 普通的前端,用 ...

  6. 打破校史!这位参与发表学校首篇Science的博士小姐姐,近日一作再发Nature

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要13分钟 Follow小博主,每天更新前沿干货 本文来源:科研大匠综合自西南交大新闻网.官微.扬华研究生新闻中心 转载自:募格学术 导读: 1 ...

  7. 代码变油画,精细到毛发,这个前端小姐姐只用HTML+CSS,让美术设计也惊叹丨GitHub热榜...

    晓查 郭一璞 发自 凹非寺  量子位 报道 | 公众号 QbitAI HTML不是编程语言,但这并不妨碍精通它的大佬玩出花来. 普通的前端,用HTML+CSS制作网页,元素简单,工具丰富. 大佬级前端 ...

  8. 小姐姐让我帮忙修照片

    关注下方公众号,分享硬核知识 作者 | 小K 出品 | 公众号:小K算法 (ID:xiaok365) 01 故事起源 小姐姐听说我是程序员... 02 分析 这是原图. 解决问题的第一步肯定是先找出问 ...

  9. 歪果小姐姐教你用代码画画,真大佬!

    转自:量子位(ID:QbitAI) 虽然 HTML 不是编程语言,但这并不妨碍精通它的大佬玩出花来. 普通的前端,用 HTML+CSS 制作网页,元素简单,工具丰富. 大佬级前端,用 HTML+CSS ...

最新文章

  1. EXCEL教程,包你一学就会
  2. 程序员只拿到5千工资吐槽无法生活,网友:别在意薪资
  3. Cookie简介及JSP处理Cookie的方法(转)
  4. jQuery与JS的区别,以及jQuery的基础语法
  5. WebBrowser中html元素如何触发winform事件
  6. error: unrecognized arguments: 不运行_JavaScript函数 arguments
  7. win10安装NET Framework 3.5提示0x800f0906原因及解决方法
  8. 1.微服务设计 --- 微服务
  9. 网吧版XP系统制作与优化终极版(转)
  10. qt调用simsimi api实现小黄鸡
  11. Word怎么转换成PDF?Speedpdf批量免费在线转换
  12. 木瓜移动创始人沈思专访——从平台到孵化器
  13. [HCIP]MPLS解决路由黑洞
  14. 自学python网站-杭州python自学网站
  15. 【精品】身份证操作工具类
  16. 自动化运维之架构设计六要点
  17. python排版word文档命令方法大全_简易常用Word文档使用技巧方法大全(超全).doc
  18. google GMS测试环境搭建详细教程
  19. 3分钟了解入门「机器学习」该学习什么?(上)
  20. 舒伯特小夜曲(钢琴版)

热门文章

  1. 女仆怎么画?裙子的阴影怎么画?
  2. 华为mate30什么时候能更新鸿蒙系统,华为mate30什么时候更新鸿蒙系统
  3. JS中for语句的循环的嵌套
  4. python 百度翻译api_Python如何通过百度翻译API实现翻译功能
  5. js访问对方手机文件夹_[求助]苹果手机想向访问的https网页注入本地JS文件,请问如何实现?...
  6. 新的征程:C语言学习
  7. jar包后台运行常用方法和命令
  8. css3有哪些新特性?有哪些改进
  9. Transfiguring Portraits论文阅读笔记
  10. bose solo5 蓝牙卡顿,内幕剖析BoseSolo5质量好不好?怎么样呢?全方位深度解析评测...