Исходная текстура в шейдерной версии является двухмерной и состоит из 256 * 256 случайных пикселей и нескольких цветовых каналов. Далее, когда текстура ищется в исходной функции grad
, тогда пиксели интерполируются в соответствии с фильтром минимизации текстуры, который, вероятно, равен GL_LINEAR
.
vec2 grad(vec2 p) {
const float texture_width = 256.0;
vec4 v = texture(iChannel0, vec2(p.x / texture_width, p.y / texture_width));
return normalize(v.xy*2.0 - vec2(1.0));
}
Ваша униформамассив имеет всего 256 различных значений, и интерполяция между текселями не эмулируется в вашей функции grad
:
vec2 grad(vec2 p){
vec2 v = vec2(gradient[int(p.x)&255],gradient[int(p.y)&255]);
return normalize(v.xy*2.0 - vec2(1.0));
}
Используйте Функции случайного шума и интерпретируйтевозвращаемое значение шумовой функции в виде угла (шум * 2 * PI) для вычисления возвращаемого значения grad()
:
float rand(vec2 co){
return fract(sin(dot(co.xy, vec2(12.9898,78.233))) * 43758.5453);
}
vec2 grad(vec2 p){
float a = rand(p) * 2.0 * 3.1415926;
return vec2(cos(a), sin(a));
}
Или используйте универсальный массив для генерации случайного значения
vec2 grad(vec2 p){
ivec2 i00 = ivec2(int(p.x)&255, int(p.y)&255);
vec2 f = floor(p);
float vx = mix(gradient[i00.x], gradient[i00.x+1], f.x);
float vy = mix(gradient[i00.y], gradient[i00.y+1], f.y);
float a = (vx + vy) * 3.141529;
return vec2(cos(a), sin(a));
}