III. Tutoriel 1. Importer des assets▲
Ce tutoriel montre comment utiliser Assimp pour importer et effectuer le rendu d'assets. Assimp est une bibliothèque open source capable de charger une variété de modèles 3D (3ds, obj, X, modèles quake et doom). En plus des positions des vertices, des normales, des coordonnées de texture, des tangentes, des os et leur poids (utilisés pour l'animation de personnages dans un prochain tutoriel), les matériaux et textures diffuses sont extraits du modèle et stockés dans un CMeshBuffer. Le CMeshBuffer contient tous les groupes et matériaux du mesh. Les groupes peuvent partager des matériaux. Lors du rendu du modèle, nous parcourons chaque groupe du buffer mesh, trouvons le matériau correspondant à chaque groupe, nous associons les propriétés du matériau au shader et dessinons finalement le groupe.
III-A. Code de la procédure▲
Nous utilisons la classe CAssimpMesh pour charger le mesh dans le tableau OpenGL comme expliqué dans la section précédente. Pour faire le rendu du CMeshBuffer, nous parcourons tous les groupes du buffer mesh, obtenons le matériau correspondant et envoyons les bonnes informations du matériau au shader et dessinons le groupe. Le code ci-dessous montre la façon dont le CMeshEntity effectue le rendu de son buffer mesh.
// Récupère le buffer mesh
CMeshBuffer*
buffer =
m_pMesh->
GetMeshBuffer();
// Parcours de tous les groupes du buffer mesh
for
(uint32 g =
0
; g <
buffer->
GroupsCount(); ++
g)
{
// Rendu de chaque groupe
CMeshGroup*
grp =
buffer->
GroupAtIndex(g);
// Récupération du matériau correspondant à chaque groupe
CMaterial*
material =
buffer->
MaterialForGroup(grp);
// Association des propriétés du matériau au shader (nous associons seulement la texture diffuse car il n'y a pas d'éclairage)
if
(material !=
NULL
)
{
if
( material->
diffuseTexture !=
NULL
&&
shader->
texture0 !=
-
1
)
{
material->
diffuseTexture->
ActivateAndBind(GL_TEXTURE0);
glUniform1i(shader->
texture0, 0
);
}
}
// Activation du Vertex Array Object (VAO)
grp->
MapToGPU(0
);
// Dessin de chaque groupe
glDrawElements(grp->
GetDrawingMode(), grp->
GetIndices().size(), GL_UNSIGNED_SHORT, 0
);
}