Как мне нужно изменить вектор градиента в моем 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;
}
Кто-нибудь может сказать мне, что здесь не так?