SimplexNoise перемасштабирует градиент внутри fbm - PullRequest
0 голосов
/ 06 апреля 2020

Как мне нужно изменить вектор градиента в моем fbm l oop?

Проблема в том, что я не могу получить нормальные значения, рассчитанные с помощью этого кода ... Они указывают только на немного в неправильном направлении, это вызывает странное освещение.

Здесь вычисление вектора нормалей:

    float3 grad;
    float noise = getNoiseValue(TriPos, grad);
    float3 nTriPos = normalize(TriPos);
    grad = grad / (noise);
    float3 h = grad - dot(grad, nTriPos) * nTriPos;
    float3 n = nTriPos - (h);

Редактировать: Я изменил Нормальный расчет чуть чуть. И убрал частоту. И теперь все выглядит хорошо. Есть ли способ вставить частоту?

    float getNoiseValue(float3 TriPos, out float3 gradient)
    {    
        float strength = 0.45f;
        float octaves = 15;
        float Persistence = 0.53333f;
        float BaseRoughness = 0.71f;
        float Roughness = 1.81f;
        float MinNoiseValue = 1.4f;

        float noiseValue = 0.f;
        float frequency = BaseRoughness;
        float amplitude = 1.f;
        TriPos = TriPos / 40000.f;
        for (int i = 0; i < octaves; i++)
        {
            float v = (sdnoise3(TriPos, gradient) + 1.f) * 0.5f;
            gradient += gradient * amplitude;
            noiseValue += v * amplitude;
            frequency *= Roughness;
            amplitude *= Persistence;
        }
        noiseValue = max(0.f, noiseValue - MinNoiseValue);
        return noiseValue;
    }

Обновление:

Так что теперь все работает как надо, НО, когда я добавляю частота моего l oop я снова получаю странное освещение ...

    for (int i = 0; i < octaves; i++)
    {
        float v = (sdnoise3(normalize(TriPos) * frequency, gradient) + 1.f) * 0.5f;
        gradient = gradient + (gradient * amplitude * frequency);
        noiseValue = noiseValue + (v * amplitude);
        frequency *= Roughness;
        amplitude *= Persistence;
    }

Кто-нибудь может сказать мне, что здесь не так?

1 Ответ

0 голосов
/ 09 апреля 2020

Я нашел проблему. Некоторые логи c ошибка ...

    float3 grad;
    for (int i = 0; i < octaves; i++)
    {
        float v = (sdnoise3(TriPos * frequency, gradient) + 1.f) * 0.5f;
        grad += (gradient * amplitude);
        noiseValue += (v * amplitude);
        frequency = frequency * Roughness;
        amplitude = amplitude * Persistence;
    }

I used the gradient variable as out parameter of sdnoise3 function so it got overriden every iteration.
...