效果说明:AdobeLinearWipe是 After Effects 的Linear Wipe(线性擦除),效果名"ADBE Linear Wipe"。一条直线扫过图层,扫过的一侧透明度变成 0,颜色不变。百分比从 0 到 100,图层从完整显示变成完全擦掉。
着色器把每个像素到这条擦除线的垂直距离和当前进度比较。进度线前面的像素 alpha 置 0,后面的保留原 alpha。羽化为 0 时是硬切;大于 0 时在进度线前一段 emergence 像素里用 smoothstep 做渐隐。进度会加上羽化宽度,所以 100% 时软边也会完全移出画面。
默认 90° 时,线从左边缘往右扫,左边先消失。角度每转 90°,起点换到画面的一个角,方向跟着转:0° 从下往上,180° 从上往下,270° 从右往左。中间角度则是斜向擦除。
简码如下:
"mat2 Rotate(float theta){return mat2(cos(theta), -sin(theta), sin(theta), cos(theta));}\n" \
"float pointToLineLength(vec2 P, vec2 P0, vec2 P1) {\n"\
" vec2 v = P1 - P0;\n"\
" vec2 w = P - P0;\n"\
" float b = dot(w, v) / dot(v, v);\n"\
" vec2 Pb = P0 + b * v;\n"\
" return distance(P, Pb);\n"\
"}\n"\
" mat2 rotation = Rotate(radians(270.0-wipeAngle));\n"\
" vec2 on = rotation * vec2(0.0, 1.0);\n"\
" float maxDist = pointToLineLength(corner.xy, vec2(0.0), on) + pointToLineLength(corner.zw, vec2(0.0), on);\n"\
" float dist = pointToLineLength(vec2(gl_FragCoord.x,viewSize.y - gl_FragCoord.y), startPoint, startPoint + on);\n"\
" float distance = (maxDist + emergence) * completion;\n"\
" float offset;\n"\
" if (emergence == 0.0) { offset = step(distance, dist); }\n"\
" else { offset = smoothstep(distance - emergence, distance, dist); }\n"\
" vec4 texColor = texture2D(currTexture,uv);\n"\
" float alpha = mix(0.0,texColor.a,offset);\n"\
" gl_FragColor = vec4(texColor.rgb, alpha);\n" \