Created
November 12, 2023 13:52
-
-
Save CaptainGPU/feedc17d8ce3f2d208cb9ca03a63c93e to your computer and use it in GitHub Desktop.
Worley.glsl
This file contains hidden or 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
/* Main function, uniforms & utils */ | |
#ifdef GL_ES | |
precision mediump float; | |
#endif | |
uniform vec2 u_resolution; | |
uniform float u_time; | |
// Функція псевдо-випадкового двовимірного шуму | |
vec2 noise(vec2 p) | |
{ | |
float x = dot(p, vec2(123.4, 234.5)); | |
float y = dot(p, vec2(345.6, 456.7)); | |
vec2 noise = vec2(x, y); | |
noise = sin(noise); | |
noise = noise * 43758.5453; | |
noise = fract(noise); | |
return noise; | |
} | |
void main() | |
{ | |
// Фінальний колір пікселя, обчислений у шейдері | |
vec3 finalColor = vec3(.0); | |
// Отримуємо UV-координати екрану | |
vec2 uv = gl_FragCoord.xy / u_resolution.xy; | |
// Помножуємо UV на розмір сітки для ефекту (кількість клитинок) | |
uv = uv * 5.0; | |
// Отримуємо номер клітини | |
vec2 gridID = floor(uv); | |
// Отримуємо UV-координати клітини | |
vec2 gridCoord = fract(uv); | |
// Зміщуємо UV-координати клітини на 0.5, | |
// щоб точка початку координат була по центру клітини | |
// діапазон UV-координат клітини стає [-0.5 ... 0.0 ... 0.5] | |
gridCoord = gridCoord - 0.5; | |
// Переводимо точки UV-координати клітини в модульні UV-координати | |
// Абсолютне значення числа може розглядатися як його відстань від нуля | |
vec2 gridUV = abs(gridCoord); | |
// Отримуємо відстань у (x,y) координатах від центру клітини до її межі | |
// використовуючи UV-координати, помножуючи їх на 2, | |
// перевівши значення з діапазону [0.5... 0.0 ...0.5] | |
// до діапазону [1.0 ... 0.0 ... 1.0] | |
float distanceToEdgeOfGrid = 2.0 * length(gridUV); | |
finalColor = vec3(distanceToEdgeOfGrid); | |
// Точка у центрі клітини | |
float pointOnGrid = 0.0; | |
// Мінімальна відстань до найбліжчого центра сусідньої | |
float minDistToNeighbourCells = 9999.0; | |
// Цикл по сусідним клітинкам | |
for (float i = -1.0; i <= 1.0; i++) | |
{ | |
for (float j = -1.0; j <= 1.0; j++) | |
{ | |
// Сусідна клітинка | |
vec2 pointOnAdjGrid = vec2(i, j); | |
// Обчислюємо псевдовипадкове значення для центру кожної клітини | |
vec2 noiseToGrid = noise(gridID + pointOnAdjGrid); | |
// Додаємо до центру кожної точки зсув на синус/2 від поточного часу | |
// помножене на псевдовипадкове значення для центру кожної клітини | |
pointOnAdjGrid += sin(u_time * noiseToGrid) * 0.5; | |
// Дистанція до центру сусідньої клітини | |
float dist = length(gridCoord - pointOnAdjGrid); | |
// Беремо мінімальну дистанцію до сусідньої клітини | |
minDistToNeighbourCells = min(dist, minDistToNeighbourCells); | |
// Обрізаємо значення дистанції для визначення точки у центрі сусідньої клітини | |
pointOnGrid += smoothstep(0.97, 0.98, 1.0 - dist); | |
} | |
} | |
// Інвертуємо значення відстані | |
minDistToNeighbourCells = 1.0 - minDistToNeighbourCells; | |
// Відображаємо мінімальну відстань до найбліжчого центра сусідньої клітини | |
finalColor = vec3(minDistToNeighbourCells); | |
// Виводимо обчислений колір пікселя | |
gl_FragColor = vec4(finalColor, 1.0); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment