OpenGL 3 Точки рендеринга: Точки хранятся в дереве разделов пространства. Дерево имеет точки с цветными и обычными информационными атрибутами.
Информация о точке и ее атрибуты хранятся в виде набора буферов.
Буфер смещения — это векторный массив.
Точки сохраняются в памяти как центр и индекс смещения. Индекс смещения указывает на буфер смещения Point = center + OffSetBuffer[offset index]
,
Нормы хранятся в нормальном буфере, и каждая точка содержит индекс нормального буфера.
Цвет сохраняется в цветовом буфере, и каждая точка содержит индекс цветового буфера.
У меня есть возможность изменить расположение буфера, но информация, как указано выше, уменьшает количество повторяющейся или избыточной информации.
Мой вопрос заключается в том, как эффективно отрисовать вышеуказанные очки с помощью API OpenGL 3+?
Вам не нужен дополнительный буфер смещения и индекс смещения, просто передайте координаты текстур. Вот что вы должны делать в вершинной программе:
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;
Других решений пока нет …