像素精灵元素GLSL - 34-绘制一个爱心❤️(the lovers)

948 阅读1分钟

绘制一个爱心

示例代码
#ifdef GL_ES
precision mediump float;
#endif

uniform float u_time;
uniform vec2 u_resolution;
uniform vec2 u_mouse;

float QTR_PI = 0.78539816339;                       // 四分之一PI
float HALF_PI = 1.5707963267948966192313216916398;  // 二分之一PI
float PI = 3.1415926535897932384626433832795;       // PI 
float TWO_PI = 6.2831853071795864769252867665590;  // 2PI
float TAU = 6.2831853071795864769252867665590;  // 2PI
float PHI = 1.618033988749894848204586834;  // 黄金分割率
float EPSILON = 0.0000001;

/** 绘制线条
* @param {float } x 坐标点
* @param {float } s 划线的位置
* @param {float } w 现对与屏幕宽度的线宽
*/
float stroke(float x, float s, float w){
    float d = step(s, x + w * 0.5) - step(s, x - w * 0.5);
    return clamp(d, 0.0, 1.0);
}

float polySDF(vec2 st, int V){
	st = st * 2.0 - 1.0;
	float a = atan(st.x, st.y) + PI;
	float r = length(st);
	float v = TAU / float(V);
	return cos(floor(0.5 + a / v) * v - a) * r;
}

float raysSDF(vec2 st, int N){
    st -= 0.5;
    return fract(atan(st.y,st.x) / TAU * float(N));
}


float heartSDF(vec2 st) {
	st -= vec2(0.5, 0.8);
	float r = length(st) * 5.0;
	st = normalize(st);
	return r - ((st.y * pow(abs(st.x), 0.67)) / (st.y + 1.5) - (2.0) * st.y + 1.26);
}


void main(){
    vec2 st = gl_FragCoord.xy/u_resolution.xy;
    st.x *= u_resolution.x/u_resolution.y;
    st.y *= u_resolution.y/u_resolution.x;
    vec3 color = vec3(0.0);

	color += fill(heartSDF(st), 0.5);
	color -= stroke(polySDF(st, 3), 0.15, 0.05);
    gl_FragColor = vec4(color, 1.0);
}
代码效果

《像素精灵元素GLSL》期待你的关注与点赞