Cocos Creator 3.1 材质升级指南

本文将详细介绍 Cocos Creator 3.0 的材质升级到 v3.1 的注意事项。

1. 着色器升级与变化

1.1 内置头文件变化

原来 v3.0 的标准着色器头文件 shading-standard 在 v3.1 改成了 standard-surface-entry,可以使 effect 同时兼容 forward 渲染管线和 deferred 渲染管线。

原来 v3.0 的 cc-fog 头文件在 v3.1 改成了 cc-fog-vs/fs,拆分成了顶点着色器与片元着色器两个部分。

1.2 顶点着色器

  • gl_Position

    v3.0 的 VS 主函数名称 vert 在 v3.1 改成了 main,并且新增了宏 gl_Position,用于给返回值赋值。

    1. CCProgram standard-vs %{
    2. precision highp float;
    3. // include your headfile
    4. #include <cc-fog-vs> // 注意这里头文件名称的变化
    5. // fill in your data here
    6. void main () {
    7. // fill in your data here
    8. gl_Position = fill in your data result;
    9. }
    10. }%

1.3 片元着色器

  • CC_STANDARD_SURFACE_ENTRY()

    加载标准着色器头文件 standard-surface-entry,使用 v3.1 的标准着色器输出函数 CC_STANDARD_SURFACE_ENTRY() 替换原有 v3.0 着色器输出的函数 frag()

    1. CCProgram standard-fs %{
    2. // include your headfile
    3. #include <cc-fog-fs> // 注意这里头文件名称的变化
    4. #include <standard-surface-entry> // 注意这里标准着色器头文件的名称变化
    5. // fill in your data here
    6. void surf (out StandardSurface s) {
    7. // fill in your data here
    8. }
    9. CC_STANDARD_SURFACE_ENTRY() // 标准着色器输出函数
    10. }%

2. Deferred 渲染管线

2.1 Deferred Render Pipeline

v3.1 的材质系统与 v3.0 最大的区别在于 v3.1 支持了 deferred 渲染管线,引擎自带标准的 standard-surface-entry 头文件,可以同时支持 forward 渲染管线和 deferred 渲染管线,用法如下:

  1. CCEffect %{
  2. techniques:
  3. // fill in your data here
  4. - &deferred
  5. vert: // your Vertex shader
  6. frag: // your Fragment shader
  7. phase: deferred
  8. propertyIndex: 0
  9. blendState:
  10. targets: // 关闭混合
  11. - blend: false
  12. - blend: false
  13. - blend: false
  14. - blend: false
  15. properties: // your properties name
  16. // fill in your data here
  17. }%
  18. // fill in your data here
  19. CCProgram standard-fs %{
  20. precision highp float;
  21. #include <cc-global>
  22. #include <shared-ubos>
  23. #include <cc-fog-fs> // 注意这里头文件名称的变化。
  24. #include <standard-surface-entry> // 注意这里标准着色器头文件的名称变化
  25. // fill in your data here
  26. void surf (out StandardSurface s) {
  27. // fill in your data here
  28. }
  29. CC_STANDARD_SURFACE_ENTRY() // 标准着色器输出函数
  30. }%
  31. // fill in your data here

2.2 渲染管线判断

在头文件 standard-surface-entry 会判断选择了哪条渲染管线,光照计算在文件 shading-standard-additive

如果判断是 deferred 渲染管线,会先调用 deferred-lighting effect 文件,随后调用光照计算文件 shading-standard-additive

  1. #define CC_STANDARD_SURFACE_ENTRY()
  2. #if CC_FORWARD_ADD
  3. #include <shading-standard-additive>
  4. // fill in your data here
  5. #elif CC_PIPELINE_TYPE == CC_PIPELINE_TYPE_FORWARD // 判断是否为前向渲染管线
  6. // fill in your data here
  7. #elif CC_PIPELINE_TYPE == CC_PIPELINE_TYPE_DEFERRED // 判断是否为延迟渲染管线
  8. // fill in your data here
  9. #endif

3. 参数传输升级

v3.0 顶点着色器往片元着色器传递 shadow 参数的宏为 CCPassShadowParams,v3.1 则修改为 CC_TRANSFER_SHADOW

v3.1 顶点着色器往片元着色器传输 FOG 参数时,直接使用 CC_TRANSFER_FOG 宏。

版本对比:

  • v3.0

    1. v_fog_factor = CC_TRANSFER_FOG(pos);
    2. CCPassShadowParams(pos);
  • v3.1

    1. CC_TRANSFER_FOG(pos);
    2. CC_TRANSFER_SHADOW(pos);