首页 > 编程知识 正文

yolov3算法详解,普里姆算法详解步骤

时间:2023-05-04 05:15:08 阅读:226244 作者:3616

SMAABlendingWeightCalculationPS //-----------------------------------------------------------------------------// Blending Weight Calculation Pixel Shader (Second Pass)float4 SMAABlendingWeightCalculationPS(float2 texcoord, float2 pixcoord, float4 offset[3], SMAATexture2D(edgesTex), SMAATexture2D(areaTex), SMAATexture2D(searchTex), float4 subsampleIndices) { // Just pass zero for SMAA 1x, see @SUBSAMPLE_INDICES. 获取边界值 float2 e = SMAASample(edgesTex, texcoord).rg; 假如有上边 SMAA_BRANCHif (e.g > 0.0) { // Edge at north // ...}

2.1 计算对角线权重

#if !defined(SMAApsdqtISABLEpsdqtIAGpsdqtETECTION)// Diagonals have both north and west edges, so searching for them in// one of the boundaries is enough.weights.rg = SMAACalculateDiagWeights(SMAATexturePass2D(edgesTex), SMAATexturePass2D(areaTex), texcoord, e, subsampleIndices);

2.2 假如对角线权重为 0

// We give priority to diagonals, so if we find a diagonal we skip // horizontal/vertical processing.SMAA_BRANCHif (weights.r == -weights.g) { // weights.r + weights.g == 0.0#endif

2.3 往左搜索

// Find the distance to the left:float3 coords;coords.x = SMAASearchXLeft(SMAATexturePass2D(edgesTex), SMAATexturePass2D(searchTex), offset[0].xy, offset[2].x);coords.y = offset[1].y; // offset[1].y = texcoord.y - 0.25 * SMAA_RT_METRICS.y (@CROSSING_OFFSET)d.x = coords.x;// Now fetch the left crossing edges, two at a time using bilinear// filtering. Sampling at -0.25 (see @CROSSING_OFFSET) enables to// discern what value each edge has:float e1 = SMAASampleLevelZero(edgesTex, coords.xy).r;

2.4 往右搜索

// Find the distance to the right:coords.z = SMAASearchXRight(SMAATexturePass2D(edgesTex), SMAATexturePass2D(searchTex), offset[0].zw, offset[2].y);d.y = coords.z;// We want the distances to be in pixel units (doing this here allow to// better interleave arithmetic and memory accesses):d = abs(round(mad(SMAA_RT_METRICS.zz, d, -pixcoord.xx)));// SMAAArea below needs a sqrt, as the areas texture is compressed// quadratically:float2 sqrt_d = sqrt(d);// Fetch the right crossing edges:float e2 = SMAASampleLevelZeroOffset(edgesTex, coords.zy, int2(1, 0)).r;

float2 sqrt_d = sqrt(d):因为横向锯齿只使用16个像素来存放数据,所以需要对d取平方根。
具体查看【SMAA算法详解 - AreaTex】

2.5 获取权重

// Ok, we know how this pattern looks like, now it is time for getting // the actual area: weights.rg = SMAAArea(SMAATexturePass2D(areaTex), sqrt_d, e1, e2, subsampleIndices.y);

2.6 修正水平转角

// Fix corners: coords.y = texcoord.y; SMAADetectHorizontalCornerPattern(SMAATexturePass2D(edgesTex), weights.rg, coords.xyzy, d);

3 假如存在左边界

SMAA_BRANCH if (e.r > 0.0) { // Edge at west // ... }

3.1 往上搜索

// Find the distance to the top: float3 coords; coords.y = SMAASearchYUp(SMAATexturePass2D(edgesTex), SMAATexturePass2D(searchTex), offset[1].xy, offset[2].z); coords.x = offset[0].x; // offset[1].x = texcoord.x - 0.25 * SMAA_RT_METRICS.x; d.x = coords.y; // Fetch the top crossing edges: float e1 = SMAASampleLevelZero(edgesTex, coords.xy).g;

3.2 往下搜索

// Fetch the top crossing edges: float e1 = SMAASampleLevelZero(edgesTex, coords.xy).g; // Find the distance to the bottom: coords.z = SMAASearchYDown(SMAATexturePass2D(edgesTex), SMAATexturePass2D(searchTex), offset[1].zw, offset[2].w); d.y = coords.z; // We want the distances to be in pixel units: d = abs(round(mad(SMAA_RT_METRICS.ww, d, -pixcoord.yy))); // SMAAArea below needs a sqrt, as the areas texture is compressed // quadratically: float2 sqrt_d = sqrt(d); // Fetch the bottom crossing edges: float e2 = SMAASampleLevelZeroOffset(edgesTex, coords.xz, int2(0, 1)).g;

3.3 计算权重

// Get the area for this direction: weights.ba = SMAAArea(SMAATexturePass2D(areaTex), sqrt_d, e1, e2, subsampleIndices.x);

3.4 修正垂直转角

// Fix corners: coords.x = texcoord.x; SMAADetectVerticalCornerPattern(SMAATexturePass2D(edgesTex), weights.ba, coords.xyxz, d);

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。