Last active
August 5, 2022 17:42
-
-
Save Hyiker/9221eb662694b12bd32e281d5840ac3e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import taichi as ti | |
ti.init(arch=ti.gpu) | |
window_size = (512, 512) | |
pixels = ti.field(ti.f32, shape=window_size) | |
gs = 64.0 | |
# len = 256 | |
ptable = ti.field(ti.i32, shape=256) | |
# ptable.from_numpy(np.array()) | |
grad_table = ti.Vector.field(3, ti.f32, shape=12) | |
@ti.func | |
def smooth(t): | |
return 6.0 * ti.pow(t, 5.0) - 15.0 * ti.pow(t, 4.0) + 10.0 * ti.pow(t, 3.0) | |
@ti.func | |
def lerp(v1, v2, t): | |
g = 1.0 - smooth(t) | |
return v1 * g + v2 * (1.0 - g) | |
@ti.func | |
def lerp2D(v00, v01, v10, v11, tu, tv): | |
v0y = lerp(v00, v01, tu) | |
v1y = lerp(v10, v11, tu) | |
return lerp(v0y, v1y, tv) | |
@ti.func | |
def grad(U, V, W): | |
s = ptable[(ptable[(ptable[U & 255] + V) & 255] + W) & 255] | |
return grad_table[s % 12] | |
@ti.func | |
def dot_prod(u, v, w, ug, vg, wg): | |
delta = ti.Vector([u - ug, v - vg, w - wg]) | |
g = grad(ug, vg, wg).normalized() | |
return delta.dot(g) | |
@ti.func | |
def perlin_noise(x, y, z): | |
u = x / gs | |
v = y / gs | |
w = z / gs | |
u0 = 0 | |
v0 = 0 | |
w0 = 0 | |
u0 = ti.floor(u) | |
v0 = ti.floor(v) | |
w0 = ti.floor(w) | |
u1 = u0 + 1 | |
v1 = v0 + 1 | |
w1 = w0 + 1 | |
prod000 = dot_prod(u, v, w, u0, v0, w0) | |
prod010 = dot_prod(u, v, w, u1, v0, w0) | |
prod100 = dot_prod(u, v, w, u0, v1, w0) | |
prod110 = dot_prod(u, v, w, u1, v1, w0) | |
prod001 = dot_prod(u, v, w, u0, v0, w1) | |
prod011 = dot_prod(u, v, w, u1, v0, w1) | |
prod101 = dot_prod(u, v, w, u0, v1, w1) | |
prod111 = dot_prod(u, v, w, u1, v1, w1) | |
result = lerp(lerp2D(prod000, prod010, prod100, prod110, u - u0, v - v0), | |
lerp2D(prod001, prod011, prod101, prod111, u - u0, v - v0), w - w0) | |
return result | |
@ti.kernel | |
def render(t: ti.f32): | |
for x, y in pixels: | |
noise_val_sum = 0.0 | |
p = 1.0 | |
for i in range(7): | |
pn = perlin_noise(x / p, y / p, t) * p | |
noise_val_sum += ti.abs(pn) | |
p /= 2.0 | |
pixels[x, y] = noise_val_sum | |
arr = [151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, | |
225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, | |
120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, | |
88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, | |
139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, | |
105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80, | |
73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, | |
164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, | |
147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, | |
28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, | |
155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, | |
178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, | |
191, 179, 162, 241, 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, | |
199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, | |
205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180] | |
for i in range(len(arr)): | |
ptable[i] = arr[i] | |
arr = [(0, 1, 1), (0, 1, -1), (0, -1, -1), (0, -1, 1), (1, 0, 1), | |
(1, 0, -1), (-1, 0, -1), (-1, 0, 1), (1, 1, 0), (-1, 1, 0), (-1, -1, 0), (1, -1, 0)] | |
for i in range(len(arr)): | |
for j in range(3): | |
grad_table[i][j] = arr[i][j] | |
gui = ti.GUI("Julia Set", res=window_size) | |
for i in range(100000): | |
if i % 100 == 0: | |
render(i * 0.01) | |
gui.set_image(pixels) | |
gui.show() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment