Эффективная отправка значений в шейдер GLSL - PullRequest
4 голосов
/ 26 ноября 2011

Я пытаюсь написать свою систему частиц для 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...

что память неэффективна и кажется мне очень уродливой.Итак, каково решение этой проблемы?Как правильно передать параметры, которые меняются для каждой вершины в шейдер?

Ответы [ 4 ]

2 голосов
/ 30 ноября 2011

Используйте точечные спрайты .Во введении очень подробно рассказывается о том, как решить вашу проблему.

Вы также можете комбинировать использование точечных спрайтов с другим расширением, point_size_array .

...

Как прокомментировал Кристиан Рау, point_size_array более бесполезен при использовании программируемого конвейера: установите максимальный размер точки как обычно, затем отбрасывайте фрагменты на основе их расстояния от центра точки, полученного из координат текстуры, созданных OpenGL.Размер частиц должен быть отправлен через дополнительный атрибут.

2 голосов
/ 26 ноября 2011

GL ES на самом деле не имеет хорошего решения для этого.OpenGL на рабочем столе позволяет создавать экземпляры и выполнять различные другие приемы, но в ES их просто нет.

0 голосов
/ 26 ноября 2011

Отправить информацию через текстуру.Я не уверен, что выборка текстур поддерживается в вершинных шейдерах opengl-es 2.0, но если это так, то это будет оптимально.

0 голосов
/ 26 ноября 2011

Вы можете использовать Объект Uniform Buffer .Обратите внимание, что эта функция доступна только на оборудовании D3D10 +.

...