Я пытаюсь написать свою систему частиц для OpenGL ES 2.0.Каждая частица состоит из 4 вершин, образующих маленький квадрат, на котором нарисована прозрачная текстура.
Проблема в том, что каждая частица имеет свои собственные свойства (цвет, положение, размер), которые являются постоянными по 4вершины этой частицы.Единственное изменение для каждой вершины - угол этого квадрата.
Если я хочу отправить свойства частицы через однородные переменные, я должен сделать:
for(each particle) { // do maaaany times
glUniform*(...);
glDrawArray(...); // only draw 4 vertexes
};
этоявно неэффективно, так как я буду рисовать только 4 вершины за вызов glDrawArray.
Если я отправляю эти свойства через переменные атрибута, я должен заполнить одну и ту же информацию 4 раза для каждого фрагмента в буфере атрибута:
struct particle buf[n];
for(each particle) {
struct particle p;
p = ...; // Update particle
buf[i+0] = buf[i+1] = buf[i+2] = buf[i+3] = p;
};
glBufferData(..., buf, ...);
// then draw everithing once afterwards...
что память неэффективна и кажется мне очень уродливой.Итак, каково решение этой проблемы?Как правильно передать параметры, которые меняются для каждой вершины в шейдер?