SMAA代码详解 - SMAASearchXLeft(Right)
SMAASearchXLeft(Right)
SMAASearchXLeft
/**
* Horizontal/vertical search functions for the 2nd pass.
*/
float SMAASearchXLeft(SMAATexture2D(edgesTex), SMAATexture2D(searchTex), float2 texcoord, float end) {
/**
* @PSEUDO_GATHER4
* This texcoord has been offset by (-0.25, -0.125) in the vertex shader to
* sample between edge, thus fetching four edges in a row.
* Sampling with different offsets in each direction allows to disambiguate
* which edges are active from the four fetched ones.
*/
float2 e = float2(0.0, 1.0);
while (texcoord.x > end &&
e.g > 0.8281 && // Is there some edge not activated?
e.r == 0.0) { // Or is there a crossing edge that breaks the line?
e = SMAASampleLevelZero(edgesTex, texcoord).rg;
texcoord = mad(-float2(2.0, 0.0), SMAA_RT_METRICS.xy, texcoord);
}
条件1 : texcoord.x > end
条件2 : e.g > 0.8281
从图示可以得出,符合条件的值范围(绿色部分) e.g >= 0.875 (28/32)
不符合条件的值范围(绿色部分) e.g <= 0.78125 (25/32)
因此,e.g 的条件值范围在 (25/32, 28/32] = ((0.78125, 0875])
取中间值 (25 / 32 + 28 / 32) * 0.5 = 53 / 64 = 0.828125 => 0.8281
条件3 : e.r == 0 没有交叉边
因为采用了双线性采样,所以每次纹理每次需要偏移 2 .
部分结果枚举:
从循环条件可以得出,end与texcoord隔了两个像素。
我们的目的是计算到最左端上边界的距离。
从上面这些图中可以看出,texcoord需要往右偏移(1- 3)个像素。
至于需要移动几个像素,需要根据end的情况进行判断。
为了加快搜索,使用了预计算,把相应的值保存在SearchTex中。[SMAA算法详解 - SearchTex]。
-
首先,为了使用双线性采样,texcoord.x有 -0.25 的偏移. 在计算距离时,这个偏移值是不需要的,所以 +0.25。
-
其次,偏移范围(1 - 3)个像素,至少需要偏移1个像素,再 +1.之后,剩余偏移量(0 - 2),需要根据searchtex中的值进行偏移。也就是为什么SearchTex中的值为(0,1,2).
为什么这里是先往右偏移2 (+2),再往左偏移(-searchtex), 而不是直接继续往右偏移呢?
注意枚举中的Pattern 2,end处没有边界。如果以此处的end进行searchtex采样的话,值是0。
会被认定为没有边界。
在这种情况下,会造成本该偏移的却没有偏移。
所以先往右偏移2。再通过searchtex往左偏移相应的量。
以避免这类的特殊情况。 -
综上所述,未优化算法为 :+ 0.25 + 1 + 2 - SearchTex
优化后算法为:- SearchTex + 3.25
SMAASearchXRight
略…
本文地址:https://blog.csdn.net/weixin_43859510/article/details/107297498