Shader极坐标实践:编写三叶草效果

Number of views 119

上篇实验我们对2D极坐标系已经有过了解,这篇实验主要对极坐标系进行实践

案例的完整代码如下:

mat2 roatate2d(float theta) {
	return mat2(cos(theta), -sin(theta),
               sin(theta), cos(theta)
               );

}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 uv = 2.*(2.* fragCoord - iResolution.xy)/iResolution.y;
    uv = roatate2d(iTime) * uv;
    float r = atan(uv.y, uv.x);
    float d = 0.5 + sin(r * 3.) * 0.5;
    d = pow(d, 0.4);
    float d2 = 0.5 + cos(r * 6.) * 0.15;
    d += d2;
    float v = smoothstep(d, d-0.01, length(uv));
    float h = length(uv)/d;
    vec4 col = mix(vec4(1.), vec4(0.5*h,.5*h+0.5,0.,1.), v);
    // Output to screen
    fragColor = col;
}

部分代码在2D极坐标系中有过讲解。

这里主要对如下代码进行分析:

float r = atan(uv.y, uv.x);
float d = 0.5 + sin(r * 3.) * 0.5;
d = pow(d, 0.4);
float d2 = 0.5 + cos(r * 6.) * 0.15;
d += d2;
float h = length(uv)/d;

对d与d2值的相加操作可作图如下:

image.png

转为极坐标系图示如下:

image.png

知道运作原理后,再分析下颜色渐变的实现,由于length(uv)是由中间往四周由小变大的方式扩散,而d值的映射是笛卡尔坐标系红色线的结果,通过length(uv)/d得出的结果作用于最终颜色上,很容易得出最终的映射结果。

image.png

感兴趣的伙伴可关注知乎"Shader实验室"或扫描下方二维码关注公众号

image.png

0 Answers