绘制一个高塔
示例代码
这里使用了 mix(x,y,a) 内部方法,计算逻辑是x(x-a) + y*a 重叠的地方显示的很清晰
#ifdef GL_ES
precision mediump float;
#endif
uniform float u_time;
uniform vec2 u_resolution;
uniform vec2 u_mouse;
/**
* @param x 坐标点
* @param size 大小
*/
float fill(float x, float size){
return 1.0 - step(size,x);
}
/**
* @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);
}
/**
* @param st 坐标值
* @param s 区域大小
*/
float rectSDF(vec2 st, vec2 s){
st = st * 2.0 -1.0;
return max(abs(st.x / s.x), abs(st.y / s.y));
}
/**
* @param v 坐标值
* @param pct 十字大小
*/
float flip(float v, float pct){
return mix(v, 1.0 - v, pct);
}
void main(){
vec2 st = gl_FragCoord.xy / u_resolution;
st.x *= u_resolution.x/u_resolution.y;
vec3 color = vec3(0.0);
float rect = rectSDF(st, vec2(0.5, 1.0));
float diag = (st.x + st.y) * 0.5;
color +=flip(fill(rect, 0.5), stroke(diag, 0.5, 0.01));
gl_FragColor = vec4(color, 1.0);
}
代码效果

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