Práticas recomendadas com Vertices no Open GL

8

Qual é a melhor prática em relação ao armazenamento de dados de vértices no Open GL? Ou seja:

struct VertexColored {
    public:
        GLfloat position[];
        GLfloat normal[];

        byte colours[];
}

class Terrian  {
    private:
        GLuint vbo_vertices;
        GLuint vbo_normals;
        GLuint vbo_colors;
        GLuint ibo_elements;

        VertexColored vertices[];
} 

ou armazená-los separadamente na classe necessária, como:

class Terrian  {
    private:
        GLfloat vertices[];
        GLfloat normals[];
        GLfloat colors[];

        GLuint vbo_vertices;
        GLuint vbo_normals;
        GLuint vbo_colors;
        GLuint ibo_elements;
}
Darestium
fonte
i manter a audiência que ter os seus valores por vértice entrelaçados é importante para o desempenho, seria ótimo se alguém poderia explicar por que exatamente
dreta
11
Segundo exemplo tem código errado: GLfloat [] ... -> GLfloat ... []
kravemir
Sim, desculpe, eu apenas o preparei para dar um exemplo, eu venho de um background em C # onde você declara matrizes da seguinte forma: GLfloat [] array;
Darestium 15/07/12

Respostas:

11

Não há nenhuma prática recomendada. Tudo varia de acordo com a aplicação que está sendo desenvolvida.

Para o renderizador de jogos, não há necessidade de armazenar vértices na RAM e na VRAM , o que significa que você precisa manter apenas o ID do vbo. Exceção é o terreno em que você precisa ter acesso às posições devido à colocação / colisão do jogador em altura.

Você precisa ter todos os dados de vértice juntos? Se você quiser ter várias cores para os mesmos vértices, como cores diferentes para os mesmos modelos de jogadores, juntar tudo pode causar um pequeno obstáculo ao desenvolvimento.

Você acessa dados fora da classe? Se não, você só terá mais código como em vertices->position[i]vez de positions[i]. No designer de jogos / modelos, você precisa acessá-los de fora, mas não está acessando todos os dados ao mesmo tempo em que está modelando, depois acessa posições e, quando está colorindo, acessa cores.

A única coisa que eu colocaria em conjunto é xyz( rgb) valores em uma estrutura para um código melhor:

Vector3 {
   GLfloat x,y,z;
};

Color3 {
   GLbyte r,g,b;
};

Edit: Eu gostaria de acrescentar que algumas pessoas estão usando unionspara facilitar o glVertex * 3v, glVertex * 4v, glUniform * v ... chamando onde a matriz é passada em vez de variáveis ​​separadas:

union Vector3f {
   GLfloat v[3];
   struct {
      GLfloat x,y,z;
   };
};

union Color3b {
   GLbyte c[3];
   struct {
      GLbyte r,g,b;
   };
};
kravemir
fonte
Se você deseja cores diferentes para o mesmo modelo, basta alterar as texturas ou colocar tudo em escala de cinza e multiplicar por cor (ou mapa de textura de cores) no sombreador de pixels. Mas não mantenha os dados da CPU, se você não precisar. Mas, às vezes, você deseja mantê-los, por exemplo, para transmissão de raios, isso depende, mas mantenha apenas vértices.
Notabene 15/07/12