Для браузера не требуется никакой оптимизации.Вы можете увидеть, что браузер отправляет драйверу, используя расширение WEBGL_debug_shaders
.
Пример:
const gl = document.createElement('canvas').getContext('webgl');
const ext = gl.getExtension('WEBGL_debug_shaders');
const vs = `
attribute vec4 position;
uniform mat4 matrix;
void main() {
float a = 1. + 2. * 3.; // does this get optimized to 7?
float b = a; // does this get discarded?
gl_Position = matrix * position * vec4(b, a, b, a);
}
`;
const s = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(s, vs);
gl.compileShader(s);
console.log(ext.getTranslatedShaderSource(s));
На моей машине / драйвере / браузере, который возвращает этот результат
#version 410
in vec4 webgl_74509a83309904df;
uniform mat4 webgl_5746d1f3d2c2394;
void main(){
(gl_Position = vec4(0.0, 0.0, 0.0, 0.0));
float webgl_2420662cd003acfa = 7.0;
float webgl_44a9acbe7629930d = webgl_2420662cd003acfa;
(gl_Position = ((webgl_5746d1f3d2c2394 * webgl_74509a83309904df) * vec4(webgl_44a9acbe7629930d, webgl_2420662cd003acfa, webgl_44a9acbe7629930d, webgl_2420662cd003acfa)));
}
Мы можем видеть, что в этом случае простая константа математика была оптимизирована, но фактчто a
и b
одинаковы не были.Тем не менее, нет никакой гарантии, что другие браузеры выполнят эту оптимизацию.
Независимо от того, оптимизировать драйверы или нет, зависит от драйвера.Большинство драйверов хотя бы немного оптимизируют, но полная оптимизация требует времени.DirectX может занять> 5 минут для оптимизации одного сложного шейдера с полной оптимизацией, так что оптимизацию, вероятно, следует выполнить в автономном режиме .В случае DirectX ожидается, что вы сохраните результат бинарного шейдера, чтобы избежать следующих 5 минут, когда шейдер понадобится в следующий раз, но для WebGL это невозможно, поскольку бинарные шейдеры будут и не переносимыми, и проблемой безопасности.Также недопустимо длительное зависание браузера в ожидании компиляции, поэтому браузеры не могут запросить DirectX для полной оптимизации.Тем не менее, некоторые бинарные шейдеры кеша в браузере закулисны.