Shader特效——"徑向畸變"和"反畸變"「GLSL」

Shader特效——

徑向畸變

Shader特效——

反(逆)徑向畸變

徑向畸變,可以簡單的總結為:圖像中心處的放大倍數大於在邊緣處的放大倍數。

有兩個係數 k1, k2 的多項式徑向畸變模型有為如下公式:

Shader特效——

多項式的徑向畸變公式

但是有人證明了有更簡單的形式來近似它,如下

Shader特效——

徑向畸變的近似公式

其中 ru 和 rd 分別表示 非畸變 和 畸變後 的當前紋理座標到圖像中心(0, 0)距離。 是每一個常量係數。

代碼如下:

<code>#iChannel0 "file://./beauty.jpg"
float alpha = .2;

void main()
{
vec2 uv = gl_FragCoord.xy / iResolution.xy;
vec2 xy = 2.*uv - 1.;

// 計算 L2 norm,即中心距離的平方 r_{u}*r_{u}
float r2 = dot(xy, xy);
vec2 xy2;
#if 0
// 徑向畸變
xy2 = xy / (1. - alpha * r2);
#else
// 逆徑向畸變
xy2 = xy * (1.0 - alpha * r2);
#endif
vec2 ij = .5 * (xy2 + 1.);

if ( all(greaterThan(ij, vec2(0.))) && all(lessThan(ij, vec2(1.))) )
gl_FragColor = texture2D(iChannel0, ij);
else
gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
}

// reference from https://panda1234lee.blog.csdn.net/article/details/103998003/<code>


分享到:


相關文章: