Я пытаюсь написать компактную и простую функцию шума со строго FP16. Это то, с чем я вышел, но я думаю, что где-то на операции число становится слишком маленьким для фракции или sin, так как в GPU я должен написать это для они находятся в пределах FP16. Любые идеи о том, что я делаю неправильно? Кстати, я не могу использовать переменные времени, ни текстуры шума образца. Функция, которую мне нужно получить, должна быть компактной, маленькой и самодостаточной, а также создавать простой эффект зернистого шума. Примечание. Следующий алгоритм отлично работает на любой графической карте настольного компьютера, но полностью не работает на графическом процессоре " MALI 400 MP", поскольку у этого есть ограничение FP16 на значения float.
vec3 noise(vec3 color)
{
float variation = length(color);
float dot_product = dot(variation, -0.577350269);
float sin_result = sin(dot_product) * 1.19245;
float random = fract(sin_result);
return color + vec3(random);
}
Если кто-то может рекомендовать любую другую случайную функцию для GLSL-ES, но строго с лимитом FP16, также будет замечательно. Я знаю о других случайных реализациях, таких как симплекс-шум, но они слишком велики и медленны для того, что мне нужно делать. Таким образом, Perlin и Симплексные алгоритмы шума не являются опцией.