OpenGL: atributo de vértice único para múltiplos vértices?
Eu tenho um sombreador de vértice que aceita os seguintes atributos:
a_posCoord
: posição do vérticea_texCoord
: coordenada de textura (passada para o shader de fragmento)a_alpha
: fator de transparência (passado para o shader do fragmento)Os objetos que estou renderizando são todos "outdoors" (um par de triângulos retângulos para fazer um retângulo).
Estou usando uma única chamada paraglDrawArrays
renderizarmuitos outdoors, cada qual pode ter um valor alfa único. Um único outdoor tem 6 vértices. Aqui está um pseudocódigo para ilustrar como eu organizo o buffer de atributos de vértices para um único outdoor:
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 ...
];
Observe como o mesmoalpha
o valor é repetido 6 vezes, uma vez para cada vértice.
Existe uma maneira que eu possa especificar um atributo para todos os 6 vértices sem repeti-lo para cada vértice individual?
Aqui está o que eu quero que meu buffer de atributos de vértices seja semelhante, no interesse de reduzir o tamanho do buffer:
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 ...
];
Por que vale a pena, minha solução atual funciona muito bem, mas me faz sentir sujo. Eu apenas comecei a entender como usarglVertexAttribPointer
e queria saber se de alguma forma apoiava algo assim, ou se há um método ou técnica diferente que eu pudesse usar para conseguir algo menos força bruta.
Isso é mais especificamente uma questão WebGL, mas estou curioso sobre o OpenGL no sentido geral.
Estou ciente de que um shader de geometria é realmente o que eu preciso para esse exemplo específico, mas está fora de questão, já que eles não são suportados atualmente no WebGL.