Нет простого способа передачи личных данных в WebGL.
В WebGL (и OpenGL ES 2) существует два вида данных, которые могут быть переданы шейдерам: атрибуты вершин и униформы. Атрибуты вершин могут иметь различное значение для каждой вершины, а единообразные данные имеют единственное значение, которое изменяется явно только через один из унифицированных вызовов * ().
Когда атрибут вершины, скажем, цвет, передается непосредственно из вершинного шейдера в фрагментный шейдер, он автоматически интерполируется аппаратными средствами, так что в результате происходит плавное изменение значения (цвета) по поверхности получившийся треугольник. Таким образом, чтобы придать треугольнику «плоский» цвет, все вершины треугольника должны быть одинакового цвета. Так как вершины также будут частью других треугольников, которые, вероятно, будут иметь разные цвета, единственный вариант - создать отдельную запись вершины для каждого отдельного цвета каждой грани, которая использует ту же точку.
Если бы вы использовали вместо этого униформу, ее пришлось бы менять по мере прорисовки каждой грани. Это означает, что вам придется разделить куб на 6 частей и сделать 6 отдельных вызовов для рисования. Это гораздо менее эффективно. Хорошо известно, что «менее злое» решение состоит в том, чтобы иметь несколько записей вершин, как описано, и использовать некоторую дополнительную память графического процессора для ускорения рисования.
В других версиях OpenGL есть функция glVertexAttribDivisor()
, которая позволяет вам установить атрибут вершины, который изменяет только каждые n вершин. Это может быть использовано для достижения того, что вы пытаетесь сделать. Однако, к сожалению, он недоступен в WebGL.