Стандартной функции rand в glsl в нашем распоряжении нет. Есть популярная реализация:
float rand(vec2 seed) {
return fract(sin(dot(seed, vec2(12.9898,78.233))) * 43758.5453123);
}
Ее копипастят годами из проекта в проект, и используют, когда нужно что-то нарандомить.
Но глобальные константы должны быть именно константами, известными на этапе компиляции. На попытку присвоить им значение, вычисленное в какой-то функции - получим ошибки компиляции. Исключения по этой части в glsl делаются только для специальных переменных, в частности для uniform. Они могут быть определены уже в реальном времени. Можно было бы нарандомить все в main, и потом передавать все значения в остальные функции в качестве параметров, но может быть быстрее и удобнее добавить больше uniform-переменных, вроде:
var tuniform = {
SEA_SPEED: {
type: 'f',
value: Math.random() * 10.0
},
time: {
// ...
в JS, и в шейдере:
// Вместо
// const float SEA_SPEED = 0.8;
// используем
uniform float SEA_SPEED;