Рендеринг точек (частиц) с OpenGL 3+

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

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

  1. Буфер смещения — это векторный массив.

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

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

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

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

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

2

Решение

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

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;
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector