跳转到内容

像素宽高比

像素宽高比

效果必须正确响应具有非方形像素和非均匀下采样因子的素材。甚至不同的图层参数也可能具有不同的像素宽高比!一旦理解了相关概念,做到这一点并不难。

简单的效果不需要做任何工作来将点参数与输出中的实际像素匹配。点参数会根据下采样因子和像素宽高比进行缩放后传递给效果;它们位于输入缓冲区的坐标系中。这提供了一个隐式的“像素坐标系”。这个坐标系方便且易于理解。但使用绝对像素测量或几何形状的效果必须更深入地了解输入缓冲区与最终渲染图像之间的关系。


不要假设像素是方形的,或1:1的

首先,由于像素宽高比和非均匀下采样因子,坐标系不一定是方形的。最终渲染的图像可能会相对于效果处理的像素在水平方向上拉伸或压缩。圆形会显示为椭圆形,正方形会显示为矩形。两点之间的距离根据它们在这个坐标系中的角度而变化;在这个系统中旋转的任何东西在最终输出中都会发生倾斜。

其次,即使它是一个方形坐标系,它也不一定与最终输出的大小相同。这意味着任何以像素为单位定义大小的滑块在图像被下采样渲染时都会出现问题;抗锯齿滤镜的宽度会根据下采样因子而变化。

有时这些问题并不重要。任何仅基于x和y坐标的线性函数为像素着色的效果根本不需要考虑像素宽高比和下采样因子。保持在输入坐标空间是一个选项,尽管你必须在其他地方考虑像素宽高比和下采样因子。

假设你正在编写一个粒子系统效果,该效果从由效果控制点定义的源位置喷射纹理精灵。使用像素坐标来表示粒子位置似乎没问题(只要粒子不需要围绕一个点旋转),但当你实际渲染粒子纹理时,你必须根据像素宽高比和下采样因子对它们进行缩放。

如果一个效果在其管道中已经有坐标转换机制,通常有一个更简单的替代方案。许多算法需要某种坐标转换;例如,使用矩阵来设置转换。但还有其他易于适应的算法,例如基于像素位置计算每个像素值的纹理生成效果。在这种情况下,代码必须获取原始像素位置并考虑像素宽高比和下采样因子。


建议的方法

正确处理所有这些的最简单方法是完全在全分辨率方形坐标中工作,然后根据下采样因子和像素宽高比进行缩放作为最终输出转换。由于点参数始终以输入缓冲区坐标报告,因此在使用之前将它们转换为全分辨率方形坐标。通过这种方法,你不需要担心以像素为单位定义大小的滑块;只需将它们解释为以全分辨率垂直像素为单位定义大小。

  1. 在获取点参数时,立即将其转换为浮点数并进入全分辨率方形像素系统,如下所示。
x *= in_data>pixel_aspect_ratio.num / (float)in_data>pixel_aspect_ratio.den;
x *= in_data>downsample_x.den / (float)in_data>downsample_x.num;
y *= in_data>downsample_y.den / (float)in_data>downsample_y.num;
  1. 在此坐标空间中执行所有设置(定义转换矩阵,生成用于后续扫描转换的坐标,基于点之间的距离计算值,旋转物体等)。请注意,在此阶段你实际上并没有处理像素;你只是在操作坐标或坐标转换。
  2. 要返回到与输出缓冲区的像素直接对应的坐标系,撤销第一步的转换。尽可能晚地进行此操作,以便尽可能少的代码需要处理这个非方形空间。如果你使用矩阵,这将是一个最终的输出转换。对于基于每个像素的坐标渲染某些内容的效果,在输出像素上迭代,并在为该像素进行任何处理之前将像素坐标转换为方形坐标。

这可能看起来像是额外的工作,但大多数合理复杂的效果通常都有一个坐标转换步骤;如果没有,它们仍然需要一个步骤来正确处理像素宽高比和下采样因子。


以像素为单位应用用户输入

After Effects 会将其所有拉伸操作水平进行,以避免引入不必要的场插值;当像素用作单位时,我们将它们视为垂直像素。


测试测试测试!

在1/2、1/4和自定义分辨率下进行测试并比较输出。使用变形(2:1)像素宽高比的合成来追踪像素宽高比处理中的错误(这确实使它们显而易见),并确保使用不同的水平和垂直下采样因子进行测试。

一些开发者报告说,某些“After Effects 兼容”插件主机提供的下采样因子为零。在除法之前检查是否为零。