2010-04-05 5 views
4

Je crée un petit jeu/démo graphique 3D pour l'apprentissage personnel. Je sais d3d9 et un peu sur d3d11 mais peu sur opengl pour le moment, donc j'ai l'intention d'abstraire le rendu réel des graphiques de sorte que mon graphique de la scène et tout "au-dessus" il doit savoir peu sur la façon de réellement dessiner les graphiques. J'ai l'intention de le faire fonctionner avec d3d9 puis ajouter le support d3d11 et enfin le support opengl. Juste comme un exercice d'apprentissage pour apprendre sur les graphiques 3D et l'abstraction. Je ne connais pas grand-chose à propos de opengl à ce stade, et je ne veux pas que mon interface abstraite expose tout ce qui n'est pas simple à implémenter dans opengl. Plus précisément, je regarde les tampons de vertex. Dans d3d, ils sont essentiellement un tableau de structures, mais en regardant l'interface opengl, l'équivalent semble être des tableaux de vertex. Cependant, ceux-ci semblent être organisés différemment là où vous avez besoin d'un tableau séparé pour les vertices, un pour les normales, un pour les coordonnées de texture, etc, et avec glVertexPointer, glTexCoordPointer, etcVertex Buffers in opengl

J'espérais pouvoir implémenter une interface VertexBuffer un peu comme le directx mais on dirait que dans d3d vous avez un tableau de structures et en opengl vous avez besoin d'un tableau séparé pour chaque élément qui rend la recherche d'une abstraction commune assez difficile à rendre efficace.

Existe-t-il un moyen d'utiliser opengl de la même manière que directx? Ou des suggestions sur la façon d'arriver à une abstraction de niveau supérieur qui fonctionnera efficacement avec les deux systèmes?

Répondre

3

Les tableaux de sommets ont des attributs de foulée et de décalage. Ceci est spécifiquement pour permettre des tableaux de structure.

Alors, que vous voulez mettre en place un VBO avec un sommet float3 et une texture float2 coordonnées, vous souhaitez effectuer les opérations suivantes:

// on creation of the buffer 
typedef struct { GLfloat vert[3]; GLfloat texcoord[2]; } PackedVertex; 
glBindBuffer(GL_ARRAY_BUFFER, vboname); 
glBufferData(...); // fill vboname with array of PackedVertex data 

// on using the buffer 
glBindBuffer(GL_ARRAY_BUFFER, vboname); 
glVertexPointer(3, GL_FLOAT, sizeof(PackedVertex), BUFFER_OFFSET(0))); 
glTexCoordPointer(2, GL_FLOAT, sizeof(PackedVertex), BUFFER_OFFSET(offsetof(PackedVertex, texcoord)); 

Avec BUFFER_OFFSET une macro pour transformer des décalages dans les pointeurs correspondants (vbos utilise le paramètre pointer comme offset), et offsetof une autre macro pour trouver le décalage de texcoord dans la structure PackedVertex. Ici, il est probable que sizeof (float) * 3, car il y aura peu de remplissage à l'intérieur de la structure.

+0

Ah ok c'est logique. Vous devez encore appeler différentes fonctions pour configurer les différentes attributions, mais je devrais être capable de partager une structure avec d3d. Hmm, j'ai vraiment besoin d'en savoir plus sur opengl :) – jcoder

+0

@JB, en fait, si vous allez avec GL3.0, Il introduit des objets de tableau de vertex, qui encapsulent le tout. http://www.opengl.org/registry/specs/ARB/vertex_array_object.txt – Bahbar

+0

Évitez gl..Pointer comme la peste. Utilisez plutôt glVertexAttribPointer. Évitez également d'entrelacer des données (foulées) si vous pouvez l'aider. Enregistrez plutôt les attributs de sommet individuels de manière séquentielle dans un objet tampon. N'oubliez pas de rendre le GPU heureux en alignant les tampons de données. –

Questions connexes