OpenGL油畫效果

shader油畫效果


代碼參考網絡上的Unity Shader腳本,將其轉換爲glsl語法進行GL渲染。glsl代碼如下,可以使用shadertoy直接運行:

#iChannel1"file://./dusk.jpg"

#define Res iResolution.xy

void mainImage(out vec4 fragColor,in vec2 fragCoord)
{
	// size 和 _Radius是兩個超參數,可以提供我們修改。建議_Radius爲2到10之間
    vec2 size = 2.0/Res;
    float _Radius = 2.0;
    vec2 uv = fragCoord/Res;
    float n = (_Radius + 1.0)*(_Radius + 1.0);
    vec3 m0 = vec3(0.0);
    vec3 m1 = vec3(0.0);
    vec3 s0 = vec3(0.0);
    vec3 s1 = vec3(0.0);
    vec3 color = vec3(0.0);
    for (float j = -_Radius;j <= 0.0;++j) {
        for (float k = -_Radius;k <= 0.0; ++k) {
            color = texture2D(iChannel1, uv+vec2(k,j)*size).rgb;
            m0 += color;
            s0 += color * color;
        }
    }
    for (float j = 0.0;j <= _Radius; ++j) {
        for (float k = 0.0;k <= _Radius; ++k) {
            color = texture2D(iChannel1, uv + vec2(k, j)*size).rgb;
            m1 += color;
            s1 += color * color;
        }
    }
    vec4 finalColor = vec4(0.0);
    float min_sigma2 = 100.0;
    m0 /= n;
    s0 = abs(s0 / n - m0 * m0);
    float sigma2 = s0.r + s0.g + s0.b;
    if (sigma2 < min_sigma2) 
    {
        min_sigma2 = sigma2;
        finalColor = vec4(m0, 1.0);
    }
    m1 /= n;
    s1 = abs(s1 / n - m1 * m1);
    sigma2 = s1.r + s1.g + s1.b;
    if (sigma2 < min_sigma2) 
    {
        min_sigma2 = sigma2;
        finalColor = vec4(m1, 1.0);
    }
    fragColor = finalColor;
}

原圖如下:
在這裏插入圖片描述
效果圖如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章