forked from ltt1598/--Shadertoys
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path02_circles_tiling.py
69 lines (53 loc) · 1.75 KB
/
02_circles_tiling.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# reference ==>
import taichi as ti
import handy_shader_functions as hsf
ti.init(arch = ti.cuda)
res_x = 512
res_y = 512
pixels = ti.Vector.field(3, ti.f32, shape=(res_x, res_y))
@ ti.func
def circle(pos, center, radius, blur):
r = (pos - center).norm()
t = 0.0
if blur > 1.0: blur = 1.0
if blur <= 0.0:
t = 1.0-hsf.step(1.0, r/radius)
else:
t = hsf.smoothstep(1.0, 1.0-blur, r/radius)
return t
@ti.func
def square(pos, center, radius, blur):
diff = ti.abs(pos-center)
r = ti.max(diff[0], diff[1])
t = 0.0
if blur > 1.0: blur = 1.0
if blur <= 0.0:
t = 1.0-hsf.step(1.0, r/radius)
else:
t = hsf.smoothstep(1.0, 1.0-blur, r/radius)
return t
@ti.kernel
def render(t:ti.f32):
# draw something on your canvas
for i,j in pixels:
color = ti.Vector([0.0, 0.0, 0.0]) # init your canvas to black
tile_size = 16
for k in range(3):
center = ti.Vector([tile_size//2, tile_size//2])
radius = tile_size//2
pos = ti.Vector([hsf.mod(i, tile_size), hsf.mod(j, tile_size)]) # scale i, j to [0, tile_size-1]
blur =hsf.fract(ti.sin(float(0.1*t+i//tile_size*5+j//tile_size*3)))
c = circle(pos, center, radius, blur)
r = 0.5*ti.sin(float(0.001*t+i//tile_size)) + 0.5
g = 0.5*ti.sin(float(0.001*t+j//tile_size) + 2) + 0.5
b = 0.5*ti.sin(float(0.001*t+i//tile_size) + 4) + 0.5
color += ti.Vector([r, g, b])*c
color /= 2
tile_size *= 2
pixels[i,j] = color
gui = ti.GUI("Canvas", res=(res_x, res_y))
for i in range(100000):
t = i * 0.03
render(t)
gui.set_image(pixels)
gui.show()