AEJoy —— AE 插件开发中的 迭代套件

596 阅读2分钟

迭代套件

效果通常在图像中的所有像素上进行迭代,过滤每个像素。通过利用 After Effects 的迭代套件,您可以让 After Effects 将任务分配给尽可能多的处理器,利用硬件特定的加速。

After Effects 还将自动管理进度报告和用户的取消操作。

使用这些套件! 确保传递给这些迭代器回调的像素处理函数是可重入的(re-entrant)

2021 年 10 月 SDK 更新将并发迭代线程的数量增加到可用的系统 CPU 核数,而不是之前硬编码限制的 32 个。

PF_Iterate8Suite1, PF_Iterate16Suite1, PF_IterateFloatSuite1

iterate

遍历源图像的像素,修改它们,并填充目标图像。

您可以指定一个矩形区域的像素进行迭代; 如果你不这样做,After Effects 将迭代每个重叠像素。给出一个 refcon,函数将使用该 refcon 调用,再加上当前像素的 xy 坐标,再加上源图像和目标图像中该像素的指针。如果传递一个 NULL 源,它将遍历 dst 。这个功能与质量无关。

不要依赖于以任何特定顺序遍历的像素。图像可能(被分为)是不同 CPU 的子集,所以在 After Effects 处理时,考虑所有参数(除了 dst )都是只读的。这个回调自动包括进度(progress)和中止(abort)检查,所以不要在你的像素函数中这样做。

iterate(
  PF_InData       *in_data,
  A_long          progress_base,
  A_long          progress_final,
  PF_EffectWorld  *src,
  const PF_Rect   *area,
  void            *refcon,
  PF_Err (*pix_fn)(
    void      *refcon,
    A_long    x,
    A_long    y,
    PF_Pixel  *in,
    PF_Pixel  *out),
  PF_EffectWorld  *dst);

iterate_origin

允许您指定从输入到输出的偏移量。例如,如果你的输出缓冲区小于你的输入缓冲区,传递 (in_data>output_origin_x, in_data>output_origin_y) 作为 origin,并将 NULL 作为 area,这个函数将为你的像素函数(pix_fn)适当地偏移 src 像素指针。

iterate_origin(
  PF_InData       *in_data,
  A_long          progress_base,
  A_long          progress_final,
  PF_EffectWorld  *src,
  const PF_Rect   *area,
  const PF_Point  *origin,
  void            *refcon,
  PF_Err (*pix_fn)(
    void      *refcon,
    A_long    x,
    A_long    y,
    PF_Pixel  *in,
    PF_Pixel  *out),
  PF_EffectWorld  *dst);

iterate_lut

仅限 PF_Iterate8Suite。允许通过查找表(LUT)进行迭代; 您可以为每个颜色通道传递相同或不同的 LUT 。如果没有传递 LUT ,则使用单位阵(Identity) LUT 。

iterate_lut(
  PF_InData       *in_data,
  A_long          prog_base,
  A_long          prog_final,
  PF_EffectWorld  *src,
  const PF_Rect   *area,
  A_u_char        *a_lut0,
  A_u_char        *r_lut0,
  A_u_char        *g_lut0,
  A_u_char        *b_lut0,
  PF_EffectWorld  *dst);

iterate_origin_non_clip_src

允许在源和目标层交集之外的像素上进行迭代。对于这些像素,你会被传递一个值为 {0,0,0,0}PF_Pixel

iterate_origin_non_clip_src(
  PF_InData       *in_data,
  A_long          progress_base,
  A_long          progress_final,
  PF_EffectWorld  *src,
  const PF_Rect   *area,
  const PF_Point  *origin,
  void            *refcon,
  PF_Err (*pix_fn)(
    void      *refcon,
    A_long    x,
    A_long    y,
    PF_Pixel  *in,
    PF_Pixel  *out),
  PF_EffectWorld  *dst);

iterate_generic

仅限 PF_Iterate8Suite。如果您想在每个可用的 CPU 上执行一次操作,可以使用这个函数(为 iterationsL 传递 PF_Iterations_ONCE_PER_PROCESSOR )。仅从线程索引 0 调用 abortprogress 函数。

注意: 您可以遍历多个像素。在内部,我们使用它进行基于行的图像处理,以及复杂序列数据的每个实体一次的更新(once-per-entity updates)。

iterate_generic(
  A_long iterationsL,
  void   *refconPV,
  PF_Err (*fn_func)(
    void    *refconPV,
    A_long  thread_idxL,
    A_long  i,
    A_long  itrtL));