shader中级课程的smoothstep课后作业的圆环边缘错落的效果用sin函数实现不了
下面代码我的代码: 请赐教
precision lowp float;
varying vec2 vUv; 接收的uv
varying float vTime; 接收的时间
void main(){
vec2 uv=(vUv-.5)*2.;//-1 1 圆点居中 值域改成[-1,1]
float r=abs(.5-length(uv));
r=smoothstep(.0,.01,r);
float a=.5;
float b=30.;
float c=5.;
float d=.5;
float e=c*0.2;
r=(a*sin(b*r+e)+d)-(.1*sin(b*r+e*.03)+.3); 这里sin处理的边缘线条
vec4 color=vec4(vec3(r),1.);
gl_FragColor=color;
}
效果图:
同学你好,其实实现上述效果的方法很多,你目前代码展示的效果是什么呢。以下是我实现的一个种思路,大同小异,希望对你有所帮助。
#ifdef GL_ES
precision mediump float;
#endif
uniform vec2 u_resolution;
uniform float u_time;
float gear(float teethN, float toothHW, vec2 st, float radius) {
vec2 uv = vec2(st.x * teethN, st.y-radius);
float x = abs((fract(uv.x)-0.5))*2.;
float y = uv.y * sqrt(2.) * teethN;
return 1. - abs(y - smoothstep(0.5-toothHW, 0.5+toothHW, x));
}
void main( )
{
vec2 uv = (gl_FragCoord.xy-.5*u_resolution.xy)/u_resolution.y;
vec2 st = vec2((atan(uv.x, uv.y) / 6.2831)+0.5, length(uv));
float a = 32.;
float b = 0.3;
float g1 = gear(a, b, st + vec2(u_time*0.1,0.), 0.4);
float g2 = gear(a, b, st + vec2(u_time*0.1,0.), 0.35);
float col = smoothstep(0.9, 1., pow(max(g1, g2), 0.2));
gl_FragColor = vec4(col, col, col,1.0);
}
上述代码关键是fract做的皱纹,这个思路效率有点低,最好还是用sin函数去实现效率更高一些。
上述代码可以在iceshader在线编辑器里面去测试。https://www.icegl.cn/addons/cms/archives/glslediter?file=test/018_diamond.frag