关于Cocos Creator 3D的一些初步使用后的一些建议

最近希望移植一些项目到Cocos,所以研究了下Cocos Creator 3D v1.1.1,相比之前的版本给我带来很大的惊喜。
这里不说优点,也不说Bug,只说一些个人建议改进的地方:

  1. 默认界面建议多用Silder,而不是Input,Input是填空题,而Silder是选择题,调试,预览效率高
  2. Input可以考虑类似Unity那种左右滑动快速改变数值,同样为了预览效率
  3. Editor扩展文档没找到,:stuck_out_tongue:
  4. 基于物理的摄像机和灯光很好。不过需要上手成本,UE用户应该稍微容易点。是否可以考虑一些preset在UI里让用户选择或参考?
  5. 目前材质编辑器刷新有一定延迟,咨询Panda哥得知Cocos当前使用多进程模型,每个view间通过IPC通信,延迟是为了IPC的通信效率和带宽考虑。IPC应该问题不大,其实从场景编辑器中修改的东西,属性编辑器可以快速刷新,反过来应该不难。
  6. 摄像机预览中不能预览UI,想看整体效果只能运行,效率低
  7. 目前资源管理形式很好,对书写shader特别友好, 但还是建议可以实现shader graph
  8. 建议在公开文档记录Mesh的layout,当前可以在Shader Chunk中看到一些,但不全面
  9. 动画编辑器十分好用,个人认为比unity 的timeline不相上下
  10. 建议参考实现unity的cinemachine,摄像机控制可以为游戏转场或角色控制增色不少
  11. 程序化天空盒,需要考虑IBL
  12. 后处理咋实现没找到……
  13. 如何和Native通信也没找到……
  14. 动画编辑器建议增加IK编辑功能,可以参考Unity插件Final IK和Dynamic Bones
  15. Light Probe和Reflection Probe,后续可以考虑实现
  16. 场景编辑器建议可以显示网格
  17. Compute Shader的支持建议加入
  18. 抗锯齿没找到
  19. 据说下个版本实现Shadow Mapping,不知道实现Shadow Cascade有无计划?

目前cocos的印象偏低端,但从整体代码结构和编辑器架构来看,潜力巨大。足够开放,希望vulkan版本能带来更多惊喜。

4赞

感谢宝贵的建议,我们会尽可能吸收优化

天空盒是可以启用 IBL 的噢,都在场景节点的编辑面板上;

后处理得等 render pipeline 这边的重构完成,但在新的正式系统上线之前,其实始终可以通过往 camera 组件上挂 render texture 来往 RT 上画东西,然后在材质里直接采样这个 render texture,自己画个全屏的 quad 就好了~

是指显示模型的网格吗?在1.2中会提供~

嗯嗯,这里说的是程序化天空盒
已经跟Panda哥和相关的同学提了一下。
程序化天空盒有个问题,在代码改变天空盒环境的时候,可能需要动态更新IBL(辐照图和预处理反射图),这部分的开销比较大,(其实可以通过Compute Shader解决,上面还忘写了Compute Shader的支持)

又补了几条,除了Compute Shader外,还包含抗锯齿和Shadow Map(Cascade)

再补一条,天空盒目前只支持Cubemap,建议支持Panoramic Map

Compute Shader的支持建议加入

嗯嗯,目前上线的版本因为只有 WebGL 后端,所以其实可用工具还是很受限,后面原生版本接入更多后端后这就是必备基础设施了~

抗锯齿没找到

目前是直接走屏幕缓冲的默认 MSAA(对应 WebGL context 初始化时的那个参数),后面也是会在 render pipeline 里有统一的解决方案

天空盒目前只支持Cubemap,建议支持Panoramic Map

经纬图是支持的噢,只需要在导入时将资源类型选为 texture cube 即可

程序化天空盒有个问题,在代码改变天空盒环境的时候,可能需要动态更新IBL(辐照图和预处理反射图),这部分的开销比较大,(其实可以通过Compute Shader解决,上面还忘写了Compute Shader的支持)

如果你是指纯程序生成的天空盒的话,的确会比较费,但同样在 WebGL 环境下这个其实也没有太好的办法,如果是动态切换 cubemap 资源的话,现在的机制都是完整的,可以直接换(反射图根据粗糙度的预采样没有直接内置到引擎,但在展示例中就有 运行时动态生成的示例

在 1.2 会开放一些编辑器插件功能,文档也会补上。
后续也会持续开放更多的能力以及可能~

我前几天才尝试了代码动态替换天空盒,没有引擎组这么复杂,仅仅只是像这样

loader.loadRes(path, TextureCube, (err, tc) => {
if (!err) {
director.getRunningScene().renderScene.skybox.envmap = tc
}
})
}

确实,非常粗暴,所幸加载后没有发现明显的问题,请问这样有什么隐患?应该怎么来解决,可以直接用这里声明的filter 方法处理一下再赋值吗

你的第10个建议cinemachine,有人2017年就提出了


四年过去了依然没有计划,哈哈,不过可以看cinemachine源码自己参考着重新造轮子吧

你好,我想问一下如何在材质里直接采样render texture