WEBGL_multi_draw расширение
Ограниченная доступность
Эта функция не является базовой, так как она не работает во всех широко используемых браузерах.
Расширение WEBGL_multi_draw является частью WebGL API и позволяет отрисовать более чем один примитив с помощью одного вызова функции. Это может улучшить производительность WebGL-приложения, так как оно снижает затраты на привязку в рендерере и ускоряет время работы потока GPU с однородными данными.
При включенном этом расширении:
- Добавлены новые методы, обрабатывающие несколько списков аргументов в одном вызове (см. список методов ниже).
- В язык шейдеров добавлен
gl_DrawIDвстроенный элемент.
Примечание: Это расширение доступно для контекстов как WebGL 1, так и WebGL 2.
В коде шейдера необходимо вызвать директиву #extension GL_ANGLE_multi_draw для включения расширения.
Это расширение подразумевает включение расширения ANGLE_instanced_arrays.
Методы экземпляров
ext.multiDrawArraysWEBGL()-
Отрисовывает несколько примитивов из данных массива (аналогично нескольким вызовам
drawArrays). ext.multiDrawElementsWEBGL()-
Отрисовывает несколько примитивов из данных массива элементов (аналогично нескольким вызовам
drawElements). ext.multiDrawArraysInstancedWEBGL()-
Отрисовывает несколько примитивов из данных массива (аналогично нескольким вызовам
drawArraysInstanced). ext.multiDrawElementsInstancedWEBGL()-
Отрисовывает несколько примитивов из данных массива элементов (аналогично нескольким вызовам
drawElementsInstanced).
Расширение шейдера
Примечание: Несмотря на то, что имя расширения WEBGL_multi_draw, расширение должно быть включено с помощью директивы #extension GL_ANGLE_multi_draw для использования в шейдере.
При включенном расширении, в коде шейдера можно использовать встроенный элемент gl_DrawID. Для любого варианта вызова multi* вывода, индекс вывода i может быть прочитан вершинным шейдером как gl_DrawID. Для вызовов, не являющихся multi*, значение gl_DrawID равно 0.
<script type="x-shader/x-vertex">
#extension GL_ANGLE_multi_draw : require
void main() {
gl_Position = vec4(gl_DrawID, 0, 0, 1);
}
</script>
Примеры
Включение расширения
WebGL-расширения доступны с помощью метода WebGLRenderingContext.getExtension(). Дополнительную информацию можно найти также в Использование расширений в учебнике по WebGL.
let ext = gl.getExtension("WEBGL_multi_draw");
Отрисовка нескольких массивов
Примеры вызовов для ext.multiDrawArraysWEBGL() и ext.multiDrawArraysInstancedWEBGL():
// multiDrawArrays variant const firsts = new Int32Array(/* … */); const counts = new Int32Array(/* … */); ext.multiDrawArraysWEBGL(gl.TRIANGLES, firsts, 0, counts, 0, firsts.length);
// multiDrawArraysInstanced variant const firsts = new Int32Array(/* … */); const counts = new Int32Array(/* … */); const instanceCounts = new Int32Array(/* … */); ext.multiDrawArraysInstancedWEBGL( gl.TRIANGLES, firsts, 0, counts, 0, instanceCounts, 0, firsts.length, );
Отрисовка нескольких элементов
Примеры вызовов для ext.multiDrawElementsWEBGL() и ext.multiDrawElementsInstancedWEBGL().
Предполагается, что индексы, которые были ранее загружены в ELEMENT_ARRAY_BUFFER, будут интерпретироваться как UNSIGNED_SHORT.
// multiDrawElements variant const counts = new Int32Array(/* … */); const offsets = new Int32Array(/* … */); ext.multiDrawElementsWEBGL( gl.TRIANGLES, counts, 0, gl.UNSIGNED_SHORT, offsets, 0, counts.length, );
// multiDrawElementsInstanced variant const counts = new Int32Array(/* … */); const offsets = new Int32Array(/* … */); const instanceCounts = new Int32Array(/* … */); ext.multiDrawElementsInstancedWEBGL( gl.TRIANGLES, counts, 0, gl.UNSIGNED_SHORT, offsets, 0, instanceCounts, 0, counts.length, );
Спецификации
| Спецификация |
|---|
| Спецификация расширения WebGL WEBGL_multi_draw |
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
WEBGL_multi_draw |
86 | 86 | Нет | 72 | 15 | 86 | Нет | Нет | 15 | 14.0 | 86 |
multiDrawArraysInstancedWEBGL |
86 | 86 | Нет | 72 | 15 | 86 | Нет | Нет | 15 | 14.0 | 86 |
multiDrawArraysWEBGL |
86 | 86 | Нет | 72 | 15 | 86 | Нет | Нет | 15 | 14.0 | 86 |
multiDrawElementsInstancedWEBGL |
86 | 86 | Нет | 72 | 15 | 86 | Нет | Нет | 15 | 14.0 | 86 |
multiDrawElementsWEBGL |
86 | 86 | Нет | 72 | 15 | 86 | Нет | Нет | 15 | 14.0 | 86 |
См. также
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/WEBGL_multi_draw