• Как встроить Math.Random в webgl?

    sfi0zy
    @sfi0zy
    Creative frontend developer
    Стандартной функции 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;
    Ответ написан
    1 комментарий