Отрисовка точек (частиц) с OpenGL 3+

Точки рендеринга OpenGL 3: точки хранятся в дереве разделов пространства. Дерево имеет точки с цветовыми и нормальными информационными атрибутами.

Информация о точке и ее атрибуты хранятся в виде набора буферов.

  1. Буфер смещения представляет собой векторный массив.

  2. Точки сохраняются в памяти как индекс центра и смещения. Индекс смещения указывает на буфер смещения Point = center + OffSetBuffer[offset index].

  3. Нормали хранятся в буфере нормалей, и каждая точка содержит индекс буфера нормалей.

  4. Цвет хранится в цветовом буфере, и каждая точка содержит индекс цветового буфера.

У меня есть место для изменения макета буфера, но хранение информации, как указано выше, уменьшает повторяющуюся или избыточную информацию.

Мой вопрос заключается в том, как эффективно отображать вышеуказанные точки с помощью API OpenGL 3+?


person Ram    schedule 19.09.2012    source источник


Ответы (1)


Вам не нужен дополнительный буфер смещения и индекс смещения, просто передайте координаты текстуры. Вот что вы должны сделать в вершинной программе:

1) Рассчитать базис частиц из матрицы ModelView:

vec3 X = vec3(ModelView[0][0], ModelView[1][0], ModelView[2][0]);
vec3 Y = vec3(ModelView[0][1], ModelView[1][1], ModelView[2][1]);

2) Расчет угловых точек на основе размера частиц (может быть равномерным или атрибутивным):

   vec3 A1 = -X*SizeX - Y*SizeY;
   vec3 B1 =  X*SizeX - Y*SizeY;
   vec3 C1 =  X*SizeX + Y*SizeY;
   vec3 D1 = -X*SizeX + Y*SizeY;

3) Переместите центральную точку в соответствующий угол:

   if (TexCoord == vec2(0.0, 0.0)) Position += A1;
   if (TexCoord == vec2(1.0, 0.0)) Position += B1;
   if (TexCoord == vec2(1.0, 1.0)) Position += C1;
   if (TexCoord == vec2(0.0, 1.0)) Position += D1;

или более эффективный код без ответвлений:

vec3 O1 = ( 1.0 - TexCoord.y ) * ( A1 * ( 1.0 - TexCoord.x ) + B1 * TexCoord.x );
vec3 O2 = TexCoord.y * ( C1 * TexCoord.x + D1 * (1.0 - TexCoord.x ) );
Position += O1 + O2;
person Sergey K.    schedule 19.09.2012
comment
Сергей, к сожалению, офсетные буферы нужны, объясню зачем. Точки разделены на кластеры, а центры кластеров хранятся в структуре данных пространственного раздела. Смещения сохраняются для представления фактической точки, когда требуется лучший уровень детализации. Я не совсем уверен в вашем решении. Не могли бы вы уточнить свой ответ. - person Ram; 19.09.2012
comment
Затем просто добавьте Position = center + OffSetBuffer[индекс смещения] в начало моего кода. - person Sergey K.; 19.09.2012