Skip to content

Instantly share code, notes, and snippets.

@CaptainGPU
Created November 12, 2023 13:52
Show Gist options
  • Save CaptainGPU/feedc17d8ce3f2d208cb9ca03a63c93e to your computer and use it in GitHub Desktop.
Save CaptainGPU/feedc17d8ce3f2d208cb9ca03a63c93e to your computer and use it in GitHub Desktop.
Worley.glsl
/* 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