Mejores prácticas con vértices en Open GL

8

¿Cuál es la mejor práctica con respecto al almacenamiento de datos de vértices en Open GL? Es decir:

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[];
} 

o tenerlos almacenados por separado en la clase requerida como:

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

        GLuint vbo_vertices;
        GLuint vbo_normals;
        GLuint vbo_colors;
        GLuint ibo_elements;
}
Darestium
fuente
Sigo escuchando que tener sus valores por vértice entrelazados es importante para el rendimiento, sería genial si alguien pudiera explicar por qué exactamente
dreta
1
El segundo ejemplo tiene un código incorrecto: GLfloat [] ... -> GLfloat ... []
kravemir
Sí, lo siento, simplemente lo preparé para dar un ejemplo, vengo de un fondo de C # donde declaras matrices así: matriz GLfloat [];
Darestium

Respuestas:

11

No hay ninguna mejor práctica. Todo varía según la aplicación que se está desarrollando.

Para el renderizador de juegos no hay necesidad de almacenar vértices tanto en RAM como en VRAM , eso significa que solo necesita mantener la identificación de vbo. La excepción es el terreno donde necesita tener acceso a las posiciones debido a la altura de la ubicación / colisiones del jugador.

¿Necesita tener todos los datos de vértice juntos? Si desea tener múltiples colores para los mismos vértices, como diferentes colores para los mismos modelos de jugadores, juntar todo puede causar pocos obstáculos en el desarrollo.

¿Accede a datos fuera de la clase? Si no, solo terminará con más código como en vertices->position[i]lugar de positions[i]. En el diseñador de juegos / modelos, debes acceder a ellos desde afuera, pero no estás accediendo a todos los datos al mismo tiempo cuando modelas, luego accedes a posiciones y cuando estás coloreando, accedes a los colores.

Lo único que juntaría son los valores xyz( rgb) en una estructura para un código más agradable:

Vector3 {
   GLfloat x,y,z;
};

Color3 {
   GLbyte r,g,b;
};

Editar: me gustaría agregar que algunas personas están usando unionsglVertex * 3v, glVertex * 4v, glUniform * v ... más fácil llamando a donde se pasa la matriz en lugar de variables separadas:

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

union Color3b {
   GLbyte c[3];
   struct {
      GLbyte r,g,b;
   };
};
Kravemir
fuente
Si desea diferentes colores para el mismo modelo, simplemente cambie las texturas, o tenga todo en escala de grises y multiplique por color (o mapa de textura de color) en el sombreador de píxeles. Pero no guarde los datos de la CPU si no es necesario. Pero a veces desea conservarlos, por ejemplo, para la emisión de rayos, eso depende, pero mantenga solo los vértices.
Notabene