我已经升级了

###零、前言
这篇文章并非偶然,在之前就决定了,以后升级版本都会写一点升级相关的故事给大家。只是故事的发展和一开始想像的不太一样,本以为会波澜壮阔,谁曾想它会这般平淡无奇。麒麟子甚至都百度好了一些诸如“醉卧沙场君莫笑,古来征战几人回”这样的抒发豪情壮志的诗句来做开场气氛。然而像这种平淡到写这篇文章要靠凑字数的故事,哪还派得上用场(好累,强行把这句诗派上了用场)。
下面是麒麟子给大家记升级日记

2020年 10月5日,阴,成都
国庆假期去了一大半了,每天窝在家,除了刷了两本书,好像什么也没干。
看着朋友圈晒的晒,淋的淋,堵的堵。我内心毫无波澜,鬼使神差地打开了Cocos Creator 3D。
嗯???打开这东西干嘛?难道是要压压惊?

要不就升级吧!
突然想到9月29号Cocos Creator 3D发布了1.2版本。看Release Notes还不错,实时阴影,全局雾,内置预览,balabalabala
顺手翻开了从不明渠道搞来的版本前瞻图


注:打码部分你就算来问,也不会告诉你的

挽起袖子,说干就干。
###一、备份
升级前一定要记得备份,有用SVN、GIT等版本管理工具的朋友,记得提交完本地修改。

###二、在Cocos DashBoard中用1.2版本打开自己的项目

###三、修改报错
嗯?一个错都没有,甚至还运行起来了。
不是说了要去掉引擎组件的Component后缀吗?
我怀疑是用错了Cocos Creator 3D版本,所以关了编辑器,再次用1.2版本打开了一次。还是没有报错。
姜信姜疑!!!! 麒麟子全局替换了SpriteComponent为Sprite
这回对了,提示了一大堆node上没有width和height属性
这回我确定了,应该是用了别名吧SpriteComponent和Sprite都能用。
麒麟子的项目用的东西还是比较多的,常见的组件都有所涉及,边改边做了一个记录。

内置组件去掉Component后缀, 不改也行。但建议先改了。免得项目中需要处理的东西越积越多。
node.width node.height不再直接访问,需要先获取UITransformnode.getComponent(UITransform)
RenderTexture.PixelFormat移除了,请用Texture2D.PixelFormat或者GFXFormat.RGBA8,建议是后者。
RenderTexture.DepthStencilFormat.DEPTH_24_STENCIL_8移除了,请用GFXFormat.D24S8。
ModelComponent改名MeshRenderer
SkinningModelComponent改名SkinnedMeshRenderer。
RenderTexture去掉了setWrapMode函数,用下面的方法替代rt.getGFXSampler().state.addressU = GFXAddress.CLAMP;
rt.getGFXSampler().state.addressV = GFXAddress.CLAMP;
rt.getGFXSampler().state.addressW = GFXAddress.CLAMP;

RenderTexture新增resize函数,窗口改变时可直接使用此函数。

###四、材质变动
终于到材质这个部分了,对于材质,倒没什么好担心的,大不了就重写shader嘛。
翻了翻Release Notes,其中提到了,增加了ShadowMap阴影,全局雾效。还有材质相关的修改。我就预估到,材质应该是有整体上的调整。
用VSCODE打开builtin-standard.effects,麒麟子瞬间锁定了下面的变化


1、新增了phase字段和对应的shader
这个字段用于引擎管线渲染阶段。比如,1.2之前只有forward-add这个phase,现在新增了shadow-add这个phase。引擎在渲染阴影的时候,就会使用shadow-add这个phase的pass来渲染。对应的就是shadow-caster-vs:vert和shadow-caster-fs:frag。

这个phase配合自定义pipeline简直就是材质系统中的神器,你几乎可以实现任何你想要的效果。麒麟子头脑一热,想到两个最可能的应用。
如果想要渲染深度图再做后期处理。那我们只需要在引擎pipeline中添加一个深度渲染流程,并且为用到的shader添加phase:depth阶段的pass即可。
延迟渲染。

2、标准PBR通道在材质面板上不再可以选择
标准材质中删除 PBR 贴图自定义通道的功能,只接受 glTF 标准定义的通道排布,即 RGB 分别对应 occlusion、roughness、metallic。如有使用其他排布组合请升级贴图资源。
以前是可以指定occlusion、roughness、metallic分别用于哪个通道的。只是这样会有一个不好的地方,就是不同项目组的贴图资源可能采用的通道排布不一样。虽然通过材质设置不影响引擎显示,但会使美术团队管理出现混乱。就这样强硬一点我觉得挺好的。你看人家Golang,连{要不要换行,首字母要不要大小写都给你安排得明明白白的了。
不过,如果有人真要改呢?那就改这个宏定义吧

3、添加了FOG相关函数
在frag的末尾,材质添加了FOG相关的函数

为了以防万一,麒麟子用了BeyondCompare来升级材质,上面提到的就是beyond中显示的变化。

4、a_texCoord默认就有,不需要再定义
嗯?为毛还是编译失败了,仔细一看,说a_texCoord重定义了。shader都是抄的啊,为啥会有这个错?
对比了一下发现,a_texCoord默认就有定义。移除掉in vec2 a_texCoord后,一切正常了。

###五、试试雾效
雾效这么简单的东西,要是引擎都做不好,那岂不是要让人笑掉大牙。还好,经过验证,这东西用起来没大问题。

值得说明的就是LAYERED这个雾化类型,就是大家说的高度雾,高空俯视角跑酷类小游戏中这个用得可能会多些。

###六、内置预览
你们知道这两个月我是怎么过来的吗?
我导入了一堆FBX,然后为了看哪个FBX模型适合放到场景中。我需要先把FBX拖到场景,如果OK,就用。如果不OK,就删除掉,继续拖下一个FBX。
SO。。。对于这个功能的需求迫切度,麒麟子已经不能用语言来表达了。词穷的时候,我选择了用图。

试了试效果。终于不用一个个拖到场景里试探了。

###七、其他
这次更新还有物理,编辑器插件等接口开放。
目前项目中没有用到这些高级货,就没有去看了。
还有一个小秘书,我没有找到入口

###八、总结
Cocos Creator 1.2版本补齐了ShadowMap光影和雾效两个常规需求,可以很好地做出场景氛围了。
材质系统中添加了phase标记,这是自定义渲染流程的基础,可以做出很多花里胡哨的效果了。
和U3D比较接近的编辑器扩展(具体是不是我还没用),看起来就令人激动。
Sprite和Terrain可以指定自己的effect shader,这就是说,锅给大家了。效果好不好,就看你手上功夫硬不硬。(顺便说一下,目前地形不支持Shadow Map,不知道通过修改effect能不能实现。)

###九、再整两句
停更了一个月多的公众号,没有太多解释,就是手上在做Cocos Creator 3D相关的项目,沉迷了。
这个真不是开玩笑的,麒麟子之前就说过,计算机三大优雅(操作系统,编译原理,计算机图形)不要随意碰,碰上了毁一生。反正我是控制不住要去折腾渲染。
项目差不多结束了,接下来就是一个集中的输出时间。
之前说的Shader教程即将兑现。

欢迎大家关注、在看、转发一波带走

打个广告
QQ群:Cocos Creator 3D研究院<727901932>
人数:1960/2000
没上车的机会不多了。
由于 3000人群要额外付费,短时间内可能不会升级。

哪怕你只是为了来加管理员们的好友,也不亏的。

请问 metallic 这个参数,在模型导出有默认值吗?我们材质导入后,IDE 里看有默认的是 0.4,效果和设计师那边不一致