Можно ли перебрать второй VBO в вершинном шейдере? - PullRequest
1 голос
/ 05 марта 2012

Итак, допустим, у меня есть два буфера вершин. Тот, который описывает реальную форму, которую я хочу нарисовать, а другой способен влиять на первую.

Итак, что я действительно хочу сделать, это примерно так:

uniform VBO second_one;

void main()
{
  for (int i = 0; i < size_of_array(second_one); ++i)
    Do things with second_one[i] to alter the values
  create the output informations
}

Я мог бы захотеть сделать гравитацию: каждая точка в second_one пытается немного перетащить точку ближе к ней и т. Д., А затем, после корректировки точки, применить матрицы для определения ее фактического местоположения.

Я был бы очень удивлен, что это возможно, или что-то близкое к этому. Но весь смысл в том, чтобы иметь возможность использовать второй VBO или сделать его как униформу типа vec3, скажем так, чтобы я мог получить к нему доступ.

1 Ответ

1 голос
/ 05 марта 2012

Для того, что вы хотите, у вас есть три варианта.

  1. Массив униформы.GLSL позволяет вам делать uniform vec3 stuff[50];.А массивы в GLSL имеют метод .length(), поэтому вы можете узнать, насколько они велики.Конечно, количество используемых вами униформ ограничено, но вам не нужно больше 20-30.Больше, чем это, и вы действительно почувствуете снижение производительности.
  2. Единые буферные объекты .Они могут хранить немного больше данных, чем неблокированные формы, но они все еще имеют ограничения.И хранилище происходит из буферного объекта.Но доступ к ним, в зависимости от оборудования, немного медленнее, чем доступ к прямой униформе.
  3. Текстуры буфера .Это способ прикрепить буферный объект к текстуре.Благодаря этому вы можете получить доступ к огромному количеству памяти из шейдера.Но будьте осторожны: они не быстрые для доступа.Если вы можете сделать это одним из перечисленных выше способов, сделайте это.

Обратите внимание, что # 2 и # 3 будут найдены только на оборудовании, поддерживающем GL 3.x и выше.Итак, оборудование класса DX10.

...