迭代套件
效果通常在图像中的所有像素上进行迭代,过滤每个像素。通过利用 After Effects 的迭代套件,您可以让 After Effects 将任务分配给尽可能多的处理器,利用硬件特定的加速。
After Effects 还将自动管理进度报告和用户的取消操作。
使用这些套件! 确保传递给这些迭代器回调的像素处理函数是可重入的(re-entrant)
2021 年 10 月 SDK 更新将并发迭代线程的数量增加到可用的系统 CPU 核数,而不是之前硬编码限制的 32 个。
PF_Iterate8Suite1, PF_Iterate16Suite1, PF_IterateFloatSuite1
iterate
遍历源图像的像素,修改它们,并填充目标图像。
您可以指定一个矩形区域的像素进行迭代; 如果你不这样做,After Effects 将迭代每个重叠像素。给出一个 refcon,函数将使用该 refcon 调用,再加上当前像素的 x 和 y 坐标,再加上源图像和目标图像中该像素的指针。如果传递一个 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 调用 abort 和 progress 函数。
注意: 您可以遍历多个像素。在内部,我们使用它进行基于行的图像处理,以及复杂序列数据的每个实体一次的更新(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));