OpenGL: один атрибут вершины для нескольких вершин?
У меня есть вершинный шейдер, который принимает следующие атрибуты:
a_posCoord
: положение вершиныa_texCoord
: координата текстуры (передается фрагментному шейдеру)a_alpha
: коэффициент прозрачности (передается фрагментному шейдеру)Все объекты, которые я представляю, являются «рекламными щитами» (пара прямоугольных треугольников, образующих прямоугольник).
Я использую один звонокglDrawArrays
оказыватьмного рекламные щиты, каждый из которых может иметь уникальное альфа-значение. Один рекламный щит имеет 6 вершин. Вот некоторый псевдокод, чтобы проиллюстрировать, как я организую буфер атрибутов вершины для одного билборда:
vertexAttributes = [
px1,py1,pz1, // vertex 1: a_posCoord
tx1,ty1, // vertex 1: a_texCoord
alpha, // vertex 1: a_alpha
px2,py2,pz2, // vertex 2: a_posCoord
tx2,ty2, // vertex 2: a_texCoord
alpha, // vertex 2: a_alpha
px3,py3,pz3, // vertex 3: a_posCoord
tx3,ty3, // vertex 3: a_texCoord
alpha, // vertex 3: a_alpha
px4,py4,pz4, // vertex 4: a_posCoord
tx4,ty4, // vertex 4: a_texCoord
alpha, // vertex 4: a_alpha
px5,py5,pz5, // vertex 5: a_posCoord
tx5,ty5, // vertex 5: a_texCoord
alpha, // vertex 5: a_alpha
px6,py6,pz6, // vertex 6: a_posCoord
tx6,ty6, // vertex 6: a_texCoord
alpha // vertex 6: a_alpha
// ... Many more billboards not shown ...
];
Обратите внимание, как то же самоеalpha
значение повторяется 6 раз, по одному разу для каждой вершины.
Есть ли способ, которым я могу указать атрибут для всех 6 вершин, не повторяя его для каждой отдельной вершины?
Вот как я хочу, чтобы мой буфер вершинных атрибутов выглядел в интересах уменьшения размера буфера:
vertexAttributes = [
px1,py1,pz1, // vertex 1: a_posCoord
tx1,ty1, // vertex 1: a_texCoord
px2,py2,pz2, // vertex 2: a_posCoord
tx2,ty2, // vertex 2: a_texCoord
px3,py3,pz3, // vertex 3: a_posCoord
tx3,ty3, // vertex 3: a_texCoord
px4,py4,pz4, // vertex 4: a_posCoord
tx4,ty4, // vertex 4: a_texCoord
px5,py5,pz5, // vertex 5: a_posCoord
tx5,ty5, // vertex 5: a_texCoord
px6,py6,pz6, // vertex 6: a_posCoord
tx6,ty6, // vertex 6: a_texCoord
alpha // vertex 1-6: a_alpha
// ... Many more billboards not shown ...
];
Что бы это ни стоило, мое текущее решение работает просто отлично, но заставляет меня чувствовать себя грязным. Я только начал понимать, как использоватьglVertexAttribPointer
и мне было интересно, поддерживает ли это что-то вроде этого, или есть другой метод или метод, который я мог бы использовать, чтобы добиться чего-то менее грубого.
В частности, это вопрос WebGL, но мне интересно, что такое OpenGL в общем смысле.
Я знаю, что геометрический шейдер действительно нужен для этого конкретного примера, но об этом не может быть и речи, поскольку в настоящее время он не поддерживается в WebGL.