Я использую OpenGL на C++ (технически EGL на Jetson Nano).
Допустим, я хочу нарисовать N квадроциклов. Представьте себе просто список цветных прямоугольников. Таких прямоугольников в кадре может быть несколько тысяч.
Я хочу использовать два буфера вершин:
- Тот, который определяет геометрию каждого квадроцикла.
- Тот, который определяет свойства, общие для каждого квадроцикла.
Первый буфер вершин должен определять геометрию каждого четырехугольника. В нем должно быть только 4 вершины, и его данные будут просто углами четырехугольника. Что-то типа:
0, 0, // top left
1, 0, // top right
0, 1, // bottom left
1, 1, // bottom right
Тогда второй буфер вершин должен иметь только x, y, ширину, высоту всех прямоугольников.
x1, y1, width1, height1, color1,
x2, y2, width2, height2, color2,
x3, y3, width3, height3, color3,
x4, y4, width4, height4, color4,
x5, y5, width5, height5, color5,
x6, y6, width6, height6, color6,
... etc.
Дело в том, что каждый из элементов моего буфера прямоугольников должен применяться к 4 вершинам в буфере вершин.
Есть ли способ настроить это так, чтобы оно продолжало повторно использовать одни и те же 4 четырехъядерных вершины снова и снова для каждого прямоугольника и применяло одни и те же свойства прямоугольника к 4 вершинам одновременно?
Я предполагаю, что могу что-то сделать, например, сказать, что первый буфер вершин должен использовать один элемент на каждую вершину и обтекать его, а второй буфер вершин использует один элемент на каждые четыре вершины или что-то в этом роде.
Как мне это настроить?
Что я делаю сейчас:
Прямо сейчас мне нужен один буфер вершин, в котором четыре вершины повторяются снова и снова столько раз, сколько у меня есть экземпляров.
0, 0, // (1) top left
1, 0, //
0, 1, //
1, 1 //
0, 0, // (2) top left
1, 0, //
0, 1, //
1, 1, //
0, 0, // (3) top left
1, 0, //
0, 1, //
1, 1, //
... etc
И мой второй буфер дублирует свои данные для каждой вершины:
x1, y1, width1, height1, color1,
x1, y1, width1, height1, color1,
x1, y1, width1, height1, color1,
x1, y1, width1, height1, color1,
x2, y2, width2, height2, color2,
x2, y2, width2, height2, color2,
x2, y2, width2, height2, color2,
x2, y2, width2, height2, color2,
x3, y3, width3, height3, color3,
x3, y3, width3, height3, color3,
x3, y3, width3, height3, color3,
x3, y3, width3, height3, color3,
x4, y4, width4, height4, color4,
x4, y4, width4, height4, color4,
x4, y4, width4, height4, color4,
x4, y4, width4, height4, color4,
x5, y5, width5, height5, color5,
x5, y5, width5, height5, color5,
x5, y5, width5, height5, color5,
x5, y5, width5, height5, color5,
x6, y6, width6, height6, color6,
x6, y6, width6, height6, color6,
x6, y6, width6, height6, color6,
x6, y6, width6, height6, color6,
... etc.
Это кажется действительно неэффективным, и я просто хочу указать первые 4 вершины один раз и заставить их каким-то образом повторно использовать их, а не дублировать эти 4 вершины N раз, чтобы иметь в общей сложности 4 * N вершин в моем первом буфере. . И я хочу указать атрибуты x,y,width,height,color только один раз для каждого четырехугольника, всего N вершин, и не один раз для каждой общей вершины, всего 4*N вершин. .
Что я делаю?
gl_Position = pos * widthAndHeight + xAndY
, гдеpos
— ваш неэкземплярный атрибут, подаваемый первым вершинным буфером, аxAndY
, а такжеwidthAndHeight
— экземплярные атрибуты, подаваемые вторым вершинным буфером. - person Kai Burjack   schedule 16.10.2019