shader中级课程的smoothstep课后作业

发布于 2024-08-07 21:41:09

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;
}

效果图:微信截图_20240807213249.png

查看更多

关注者
0
被浏览
381
1 个回答
Jsonco
Jsonco 图形社区官方人员 2024-08-07
奔驰的蜗牛

同学你好,其实实现上述效果的方法很多,你目前代码展示的效果是什么呢。以下是我实现的一个种思路,大同小异,希望对你有所帮助。

#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
image.png

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览