GL绘制心形线和心形

心脏线是……

下面是片段着色器的脚本。注意因为数学公式最后画出来的心脏线是的中心对称线将平行于横轴。为了让心脏竖直放置,脚本中求取极坐标的theta值时,将横纵坐标互相调换。

varying vec2 v_texCoord;

void main(){
    vec2 p = 1.0 - 2.0 * v_texCoord;
    p.y -= 0.5;
    float delta = 0.01;
    float a = atan(p.x, p.y)/3.1415926;
    float r = 1.0;
    float len = 2.0 * r * (1.0 - cos(a));
    float dist = length(p);
    if (abs(len - dist) < delta){
        gl_FragColor = vec4(vec3(1.0, 0.0, 0.0), 1.0);
    }
    else{
        gl_FragColor = vec4(vec3(0.0), 1.0);
    }
}

运行结果如下图:


GL绘制心形线和心形_第1张图片
脚本运行结果

如果想要填充线条中的颜色,只需要将上面脚本中的判断条件改了就好:

if (dist <= len){
        gl_FragColor = vec4(vec3(1.0, 0.0, 0.0), 1.0);
    }

去掉不需要的delta即可。全部代码如下:

varying vec2 v_texCoord;

void main(){
    vec2 p = 1.0 - 2.0 * v_texCoord;
    p.y -= 0.5;
    float a = atan(p.x, p.y)/3.1415926;
    float r = 1.0;
    float len = 2.0 * r * (1.0 - cos(a));
    float dist = length(p);
    if (dist <= len){
        gl_FragColor = vec4(vec3(1.0, 0.0, 0.0), 1.0);
    }
    else{
        gl_FragColor = vec4(vec3(0.0), 1.0);
    }
}
GL绘制心形线和心形_第2张图片
填充版结果图

在做效果中,我们可以根据坐标形变去改变心形的形状。可以传入时间类的变量,进行控制,使得心形动起来。并且用更巧妙的颜色来填充,使得心形的颜色过渡自然。当然背景色也可以这样做。

你可能感兴趣的:(GL绘制心形线和心形)