Projeto Virtual Worlds

Computação Gráfica 3D em C

Array de estruturas ou Estrutura com arrays?

Existem algumas maneiras de montar o buffer contendo os atributos de vértices de um triângulo. Um vértice possui atributos como: coordenada, vetor normal, coordenada de textura, cor. Podemos agrupar esses atributos numa estrutura única e criar um array de estruturas (Array of Structures, AoS):

struct vertice_attrib_s {
  float pos[3];
  float normal[3];
  float texcoord[2];
  float color[4];     // RGBA
};

struct vertice_attrib_s buffer[NUM_VERTICES];

Ou podemos criar um grande buffer particionado (Structure of Arrays, SoA):

// Neste buffer os offsets definidos abaixo
// determinam o início de cada array de atributos.
#define POSITION_ATTRIB_OFFSET 0
#define NORMAL_ATTRIB_OFFSET (NUM_VERTICES*3)
#define TEXCOORD_ATTRIB_OFFSET (NUM_VERTICES*(3+3))
#define COLOR_ATTRIB_OFFSET (NUM_VERTICES*(3+3+2))

// Grande buffer contendo os 4 arrays.
float buffer[NUM_VERTICES*12];

Tenho a tendência a usar o primeiro modelo (AoS) pelo simples motivo que, para achar um atributo qualquer, basta calcular apenas um offset e obter o ponteiro para a estrutura. No segundo modelo teríamos que manter ponteiros auxiliares para cada array:

float *aux_vpos_ptr = buffer + POSITION_ATTRIB_OFFSET;
float *aux_normal_ptr = buffer + NORMAL_ATTRIB_OFFSET;
float *aux_texcoord_ptr = buffer + TEXCOORD_ATTRIB_OFFSET;
float *aux_color_ptr = buffer + COLOR_ATTRIB_OFFSET;

O motivo da minha preferência também é embasada em informação não muito bem documentadas: Parece que o VBO montado de maneira “intercalada” (AoS) apresenta melhor performance… Parece que OpenGL vai intercalar os atributos antes de apresentá-los aos shaders… Fato ainda a ser medido e confirmado, amigos!

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s