Spec-Zone.ru › Web APIs

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

См. также

  • WebGLRenderingContext.drawArrays()
  • WebGLRenderingContext.drawElements()
  • ANGLE_instanced_arrays.drawArraysInstancedANGLE() или в WebGL 2: WebGL2RenderingContext.drawArraysInstanced()
  • ANGLE_instanced_arrays.drawElementsInstancedANGLE() или в WebGL 2: WebGL2RenderingContext.drawElementsInstanced()

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API