XSI中抗锯齿和适应采样优化教程

修改
鏉ユ簮: 貌似殊途 浏览 2465 日期 2011-10-24 0

朱峰社区老师表示在谈论抗锯齿和能适应的采样之前, 希望解释为什么发明抗锯齿和as,并且描述他们用来解决的问题。

问题是什么是锯齿呢? 经常使用数字音频的模拟波形来解释锯齿。转换过程很简单:采样引擎把声波转换成数字流。

看图:

第一个图是模拟声波的外型。

第二个图对原始样本惊醒两次采样的外型,可以看到,重建的信号波形和原始波形相差甚远,当采样密度增加到4的时候,出现了相当不错的波形。

这个过程和渲染图象非常相似,唯一的不同是维度:声音是空间的(随时变化),图象是二维的(变化在xy坐标)。

渲染一个场景的时候,摄像机的虚拟胶片被曝光,这里叫做“帧缓冲器”。摄像机分类filmback上的像素,并且用颜色填充每个象素点。这个过程叫做渲染。

用户可以控制多少像素被颜色填充。没有得到颜色的其他像素,就简单的通过内插值算法接受相邻的像素的颜色。

用两个参数控制这个过程,叫做anti-aliasing min和max。anti-aliasing min控制像素被分解成子像素的最小次数,anti-aliasing max控制像素被分解成子像素的最大次数。

看看上边的图片,代表不同的抗锯齿级别。在每一个例子中,每个白色正方形是帧缓冲器中的一个像素。

第一个图像设置抗锯齿min = –2和max = -2。这意味着渲染器对每16个像素发送一次采样,就像你看到的,他将跳过15个像素,很明显,跳过了这么多的象素,渲染的速度自然就非常快,但是产生的是一个非常差劲的结果。

第二个图像设置抗锯齿min = –1和max = -1,这样渲染器对每4个像素发送一次采样。

第二个图像设置抗锯齿min =0和max = 0. 这意味着对每个像素都发送一次采样。

这里应该提到,每个采样都在像素的一角而不是在像素的中央,这是可能的,在每一个像素中包含更多的细节要被采样。

前三个例子抗锯齿值从负数到0,所有的渲染图像都有锯齿,这叫做infrasampling。要想消除锯齿,就要对每个像素发送额外的采样。

当设置anti-aliasing min和/或者max大于0,就是告所渲染器使用“superssampling”。使用anti-aliasing min和max值1, 意味着把每个像素分解成4个子像素。

使用anti-aliasing min和max值2, 意味着把每个像素分解成16个子像素。值为3的时候意味着把一个像素分解成64个子像素。

注意,值每增加1子像素的数量就大量增加,3已经是非常高的质量了,超过3的值应该尽量少的使用。

有一个建议,这个图表显示here is a graph that shows the number of samples taken when you render using different anti-aliasing settings and different resolutions.

例如,如果你使用ntsc渲染一个图像,设置aa为 0,采样次数非常的小。但是如果渲染4k图像,aa设置为2,你将看到大约2.5亿次采样!!!

增加aa设置可以“剧烈”的增加渲染时间!!!!!!!!!!

在调节aa参数之前应该先调整其他的参数。

[next]

增加aa值应该是在最后调整图像不足的。

现在解释适应采样是如何改善渲染时间的。

xsi渲染允许用户指定一个控制级别用来在渲染期间测定是否需要更多的采样。这个技术叫做适应采样。

当设置anti-aliasing min和max为相同的值时,适应采样是不起作用的,用一个固定的采样值进行渲染,这可以产生真实完美的图像,但是这却要用相当多的渲染时间。

下面举例说明适应采样时如何节省宝贵的渲染时间的。

#1 – 4个像素没有采样

这个例子阐述概念,用4个像素覆盖一个几何形。抗锯齿设置为min=0和max=3。适应采样需要各参数叫做contrast,它是一个rgba值。contrast用来决定什么时候象素要被分裂到子像素,子像素什么时候需要进一步分裂。

看看他是怎么工作的:首先渲染器将在每个像素的左上角计算一次采样。

#2 – 采样抗锯齿 0

这个图中的抗锯齿级为0。渲染器将比较每个采样结果来测定和anti-aliasing contrast的差别。如果比contrast大,就需要更多的采样,像素也需要细分。在细分像素或者子像素之前,渲染器测定当前的抗锯齿级别是否等于或者大于抗锯齿最大值,这个时候,对像素的再次细分就是必须的了。

#3 - subdiv > level1

像素被分裂成4个子像素。抗锯齿级别是1。

#4 - sample level 1

然后渲染器采样每个新的子像素,渲染器比较采样,测定一些子像素海需要再次细分。

#5 - subdiv > level2

抗锯齿级别现在是2。

#6 - sample level 2

同样的,渲染器再次采样,然后比较是否还有像素需要再次细分。

#7 - subdiv > level 3

渲染器应用细分……

#8 - sample level 3

...继续采样新的子像素。然后停止递归,因为它到达了用户设定anti-aliasing的最大值。

#9 >

因为适应适应采样,渲染器只需要19次采样,而没有适应采样的将使用64次采样。使用适应采样减少了66%的采样数量而渲染质量很好。

这里有一些调节抗锯齿的诀窍:

增加抗锯齿之前,强烈建议降低aa阀值直到产生预期的效果。

如果结果不满意,修改aa过滤器为更好的,比如triangle或者mitchell。

1) 过滤图像为了消除渲染结果中的锯齿。

2) 产生平滑的图像,有些过滤器可以根据设置模糊图像。

3) 消除抗锯齿造成图像看起来像cg。

4) 过滤值采用浮点值,因此可以接受小数点,比如1.23。

5) 5个可用的过滤模式。

什么是过滤?

过滤是一个允许渲染器衡量profile/falloff curve that allows the renderer to weight the contribution of each sample taken to create one pixel.

图中显示了xsi中可以用到的过滤剖面。我们从速度最快的过滤到效果最好的过滤开始介绍。

box:

所有的采样都有同样的weight。

他是非常快速的,但是往往产生的都是模糊的图像,而且会失去图像的细节。

除非需要渲染出模糊的图像,否则不推荐使用它。

triangle:

使用线性falloff,所以在摄像机附近的采样部远离摄像机的影响大。增加过滤值可以产生锐利的图像。

gauss:

这是一个曲线falloff,可以产生非常平滑柔软的采样,如果过滤的值设置的太高,会产生更模糊的效果。

lanczos:

提供一个比triangle、box和gauss更好的过滤。

lanczos比mitchell和triangle过滤的结果更锐利。

mitchell:

这是最好的过滤。

他不模糊图像而且追求细节。

评论

{{ username ? username.charAt(0).toUpperCase() : '?' }}
Ctrl+Enter 发布
{{ (c.username || c.author_name || '?').charAt(0).toUpperCase() }}
{{ c.username || c.author_name }} {{ Utils.formatDate(c.created_at) }}