# 后处理资源

# 简要介绍

考虑到手写后处理管线比较复杂,为了方便开发者使用,小游戏框架内置了一些后处理效果,以及能简单使用它们的后处理资源

# 重要属性与方法

属性名称 描述
hdr 后处理过程中是否采用高动态范围。
方法名称 描述
addFXAA 在最后一步添加快速近似抗锯齿。
addBloom 在最后一步添加泛光效果。
addToneMapping 在最后一步添加色调映射。
addGaussianBlur 在最后一步添加高斯模糊。
addCustomEffect 在最后一步添加自定义后处理。(*详见自定义效果)
remove 删除指定的后处理效果。

内置后处理效果均使用内置后处理节点,详细内容可参考内置后处理节点

# 使用方法

后处理资源目前无法通过工具来创建,只能通过脚本来创建,并附加在相机上。

  1. 新建脚本,并添加到场景主相机上。

  2. 修改脚本内容,在 onAwake 阶段创建后处理资源

     import engine from "engine";
     @engine.decorators.serialize("postprocess")
     export default class postprocess extends engine.Script {
         public onAwake() {
             const pp =  new engine.PostProcessAsset();
             pp.addBloom();
             pp.addToneMapping("", 0.5);
             this.entity.getComponent<engine.Camera>(engine.Camera).postProcess = pp;
         }
     }
    
  3. 播放场景,观察在泛光色调映射后,场景是否有相应效果。

# HDR

后处理资源上的 hdr 开关可以决定后处理过程是否使用高动态范围。
*IOS平台目前不支持开启该选项。

在以下情况下,应该开启 hdr 开关:

  1. 如果相机的输出颜色是高动态范围的,那么后处理资源上也应开启hdr;
  2. 如果后处理资源包括泛光效果,那么开启 hdr 会获得更好的效果。

# 开启 hdr 前后对比:

无后处理 开启泛光,关闭hdr
开启前 无hdr
开启泛光,打开hdr 开启泛光色调映射,打开hdr
有 hdr 无tonemapping 有 hdr 有tonemapping

# 注意事项

  1. 请使用后处理资源暴露出来的接口来对后处理效果进行改变。如果直接修改内部的数据,可能会没有效果。
  2. 在 addXXX 添加后处理效果时,在第一个参数传入名称。之后可以根据这个名称来对其进行修改(addXXX传入同一个名称来替换,remove传入同一个名称来删除)。
    const pp = new engine.PostProcessAsset();
    pp.addBloom("bloom", 20/*radius*/);
    
    // 想要修改泛光的范围
    pp.addBloom("bloom", 15);
    
    // 想要删除泛光效果
    pp.remove("bloom");
    

# 自定义效果

可以通过后处理资源来添加自定义后处理效果。

  1. 编写自定义后处理效果的渲染节点,记录下节点的序列化名称
    编写方法参考后处理节点文档。 记录下类装饰器里的自定义名称,这里以MyEffect为例:

    @engine.RGPostProcessNode.serialize('MyEffect')
    export class RGMyEffectPostProcessNode ... { ... }
    
  2. 在后处理资源内使用addCustomEffect接口来添加自定义效果。
    想要在最后一步添加MyEffect效果的话:

    const pp = new engine.PostProcessAsset();
    pp.addCustomEffect(
        "id0",  // 和其他 addXXX 接口一样,需要为该步骤提供一个ID,任意即可
        "MyEffect", // 在这里填入记录下的序列化名称
        {
            ... // 这里填入自定义效果所需要的参数
        }
    );