From 8572014f6b76c4c32a3019d4b006f2c4b33b53dc Mon Sep 17 00:00:00 2001 From: aarizona Date: Mon, 30 Sep 2024 22:18:11 +0300 Subject: [PATCH] make base noise normal --- utils/dith.frag | 2 +- utils/main.frag | 32 ++++++++++++++++++++++++++++++++ utils/material.ts | 3 ++- utils/normal.frag | 10 ++++++---- utils/vertex.vert | 7 ++++++- 5 files changed, 47 insertions(+), 7 deletions(-) diff --git a/utils/dith.frag b/utils/dith.frag index 32131d8..4fde669 100644 --- a/utils/dith.frag +++ b/utils/dith.frag @@ -1,7 +1,7 @@ #include // vec2 st = vec2(vDistance,vDistance)/vec2(u_resolution); -vec2 st = gl_FragCoord.xy / vec2(u_resolution); +vec2 st = vPosition.xy / vec2(u_resolution); vec3 pos = vec3(st * 5.0, 1.0 * 0.5); diff --git a/utils/main.frag b/utils/main.frag index 9cb5569..971cacb 100644 --- a/utils/main.frag +++ b/utils/main.frag @@ -2,6 +2,8 @@ uniform vec2 u_resolution; uniform vec2 u_mouse; uniform float u_time; varying float vDistance; +varying vec3 vPosition; + float random(in float x) { return fract(sin(x) * 1e4); } @@ -22,4 +24,34 @@ float noise(in vec3 p) { vec3 u = f * f * (3.0 - 2.0 * f); return mix(mix(mix(random(n + dot(step, vec3(0, 0, 0))), random(n + dot(step, vec3(1, 0, 0))), u.x), mix(random(n + dot(step, vec3(0, 1, 0))), random(n + dot(step, vec3(1, 1, 0))), u.x), u.y), mix(mix(random(n + dot(step, vec3(0, 0, 1))), random(n + dot(step, vec3(1, 0, 1))), u.x), mix(random(n + dot(step, vec3(0, 1, 1))), random(n + dot(step, vec3(1, 1, 1))), u.x), u.y), u.z); +} + +// +// by inigo quilez +// + +vec3 hash3(vec2 p) { + vec3 q = vec3(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3)), dot(p, vec2(419.2, 371.9))); + return fract(sin(q) * 43758.5453); +} + +float iqnoise(in vec2 x, float u, float v) { + vec2 p = floor(x); + vec2 f = fract(x); + + float k = 1.0 + 63.0 * pow(1.0 - v, 4.0); + + float va = 0.0; + float wt = 0.0; + for(int j = -2; j <= 2; j++) for(int i = -2; i <= 2; i++) { + vec2 g = vec2(float(i), float(j)); + vec3 o = hash3(p + g) * vec3(u, u, 1.0); + vec2 r = g - f + o.xy; + float d = dot(r, r); + float ww = pow(1.0 - smoothstep(0.0, 1.414, sqrt(d)), k); + va += o.z * ww; + wt += ww; + } + + return va / wt; } \ No newline at end of file diff --git a/utils/material.ts b/utils/material.ts index e259c9e..3921da0 100644 --- a/utils/material.ts +++ b/utils/material.ts @@ -52,7 +52,7 @@ function generateNoiseTexture(width: number, height: number) { texture.needsUpdate = true; return texture; } -console.log(vertexShader) + const m_onBeforeCompile = (shader) => { // Добавляем uniform переменную shader.uniforms.u_resolution = { value: new Vector2(20.0, 20.0) }; @@ -60,6 +60,7 @@ const m_onBeforeCompile = (shader) => { // Изменяем вершинный шейдер shader.vertexShader = ` varying float vDistance; + varying vec3 vPosition; ${shader.vertexShader} `.replace( `#include `, diff --git a/utils/normal.frag b/utils/normal.frag index 5facf50..8c16cc8 100644 --- a/utils/normal.frag +++ b/utils/normal.frag @@ -1,7 +1,9 @@ -vec2 normal_st = gl_FragCoord.xy / vec2(u_resolution); - // vec2 normal_st = vec2(random(vDistance), random(vDistance))/vec2(u_resolution); +vec2 normal_st = vec2(vPosition.x * vPosition.y, vPosition.y) * vec2(1000 * 2); +// vec2 normal_st = vec2(random(vDistance), random(vDistance))/vec2(u_resolution); vec3 normal_pos = vec3(normal_st * 5.0, 1.0 * 0.5); -vec3 normal_noise = vec3(noise(normal_pos)); -vec3 modifiedNormal = normalize(normal + normal_noise); +// vec3 pos_xz = vPosition * vec3(1.0, 0.0, 1.0); +// vec3 distance = pos_xz + vec3(0.15); +vec3 normal_noise = vec3(noise(normal_pos)); +vec3 modifiedNormal = normal * normal_noise * vec3(0.5); normal = modifiedNormal; \ No newline at end of file diff --git a/utils/vertex.vert b/utils/vertex.vert index 0edda29..0ecc4c9 100644 --- a/utils/vertex.vert +++ b/utils/vertex.vert @@ -1 +1,6 @@ -vDistance = length(position); \ No newline at end of file +// Вычисляем расстояние от текущей вершины до некоторой точки в пространстве +vec3 pointToMeasure = vec3(1.0, 1.0, 1.0); // Некоторая точка, до которой вы хотите измерить расстояние + +// Используем функцию distance, чтобы вычислить расстояние от вершины до точки +vDistance = distance(pointToMeasure, position.xyz); +vPosition = position.xyz; \ No newline at end of file