欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SMAA代码详解 - SMAASearchXLeft(Right)

程序员文章站 2022-06-09 20:48:30
SMAASearchXLeft(Right)SMAASearchXLeft/** * Horizontal/vertical search functions for the 2nd pass. */float SMAASearchXLeft(SMAATexture2D(edgesTex), SMAATexture2D(searchTex), float2 texcoord, float end) {/** * @PSEUDO_GATHER4 * This tex...

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)
SMAA代码详解 - SMAASearchXLeft(Right)
不符合条件的值范围(绿色部分) e.g <= 0.78125 (25/32)
SMAA代码详解 - SMAASearchXLeft(Right)
因此,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 .

部分结果枚举:
SMAA代码详解 - SMAASearchXLeft(Right)

SMAA代码详解 - SMAASearchXLeft(Right)
SMAA代码详解 - SMAASearchXLeft(Right)
SMAA代码详解 - SMAASearchXLeft(Right)

SMAA代码详解 - SMAASearchXLeft(Right)
SMAA代码详解 - SMAASearchXLeft(Right)

从循环条件可以得出,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