Я реализую трехмерный генератор сферических планет на основе шума Перлина, но получаю линейные артефакты при попытке использовать аналитическую производную в расчетах шума. Я вычисляю аналитическую производную, используя подход Майло Йипа: Аналитическая производная трехмерного шума Перлина
Например, при попытке использовать шум IQ:
float IQturbulence(float3 p, int octaves, float freq, float amp, float gain, float lacunarity)
{
float sum = 0.5;
float3 dsum = float3(0,0,0);
for(int i = 0; i < octaves; i++)
{
float4 n = noiseDeriv((p*freq), (i)/256.0);
dsum += n.yzw;
sum += amp * n.x / (1 + dot(dsum,dsum));
freq *= lacunarity;
amp *= gain;
}
return sum;
}
Я получаю эти артефакты линий сетки, которые выглядят так:
Однако эти строки только появляются, когда я использую скалярное произведение (скаляр) производной при вычислении шума,
i.e.
(1 + dot(deriv,deriv))
независимо от того, используется ли это для модуляции усиления, частоты и т. д., всегда кажется, что это создает артефакты.
При использовании производной для деформации домена я не получаю линейных артефактов.
ex.
float4 n = noiseDeriv((p + 0.15 * dsum) * freq, (i)/256.0);
Это просто ограничение классического шума Перлина? Я немного не решаюсь полностью менять алгоритмы шума на этом этапе моего проекта. : /
- Примечание: при вычислении производной я использую квинтические функции.
perlinNoiseDeriv
).// Get the derivative d(w*f)/df
float2 dwp = f * f * f * (f * (f * 36 - 75) + 40); // 36f^5 - 75f^4 + 40f^3
Это не вторая производная, поэтому я не уверен, для чего предназначена эта кривая. Есть ли какие-нибудь математические волшебники, которые могли бы знать, как включить это в уравнение Майло Йипа? :) де Карпентье предназначен только для 2D. - person onehand   schedule 08.10.2017