Author Topic: Vitesse de chargement d'un .OBJ  (Read 4878 times)

0 Members and 1 Guest are viewing this topic.

Offline Elrick

  • Base
    • View Profile
  • Groupe: SFX
  • Rôle: Code / GFX
  • Ville: Lyon
Vitesse de chargement d'un .OBJ
« on: 09 January 2013 à 12:17:45 »
Bonjour,

une petite question que je me pose, je suis en train de faire un loader pour le format wavefront .obj et comme model de test j'ai pris un truc un peu bourrin sur turbosquid, il y a environ 500K vertex et 975K faces et la ... c'est looooooooooonnnnnnnnnnnnnngggg juste pour lire tout le fichier (> 2min).

j'ai pas testé avec un logiciel 3D si c'était aussi long je le ferais ce soir, mais je me demande si il y a des techniques permettant d'accélérer le temps de chargement ?

pour l'instant je me contente juste de lire les vertex:

Code: [Select]
bool ObjLoader::LoadOBJModel(wchar_t* _filename, Model& _model)
{
std::wifstream inputStream(_filename);
std::wstring strBuffer;

if (!inputStream)
{
return false;
}
ModelSubset subset;

while(inputStream)
{
inputStream >> strBuffer;

if (strBuffer == L"v")
{
//# List of Vertices, with (x,y,z[,w]) coordinates, w is optional and defaults to 1.0.
float vx,vy,vz,weigth = 1.0f;
inputStream >> vx >> vy >> vz;
subset.vertices.push_back(D3DXVECTOR4(vx,vy,vz,weigth));
}if (strBuffer == L"vt")
{
//# Texture coordinates, in (u ,v [,w]) coordinates, these will vary between 0 and 1, w is optional and default to 0.
float u,v;
inputStream >> u >> v;
}else if (strBuffer == L"vn")
{
//# Normals in (x,y,z) form; normals might not be unit.
float nx,ny,nz;
inputStream >> nx >> ny >> nz;
}else if (strBuffer == L"f")
{
//NOT Implemented -> skip
std::getline(inputStream,strBuffer);
}else if (strBuffer == L"g")
{
//NOT Implemented -> skip
std::getline(inputStream,strBuffer);
}else{
//unsupported -> skip
std::getline(inputStream,strBuffer);
}
}
_model.subsets.push_back(subset);
_model.subsetCount++;
return true;
}

le lien pour le model 3D: http://www.turbosquid.com/3d-models/king-kong-bust-sculpture-obj-free/696966
« Last Edit: 09 January 2013 à 12:25:13 by Elrick »

Offline MsK`

  • Base
    • Pouet.net
    • View Profile
  • Rôle: Code
  • Ville: Paris/RP
Re : Vitesse de chargement d'un .OBJ
« Reply #1 on: 09 January 2013 à 12:35:41 »
Perso, je me pose même plus la question, j'utilise assimp. C'est souple, simple, ça permet de faire des tas de processing sympa sur les fichiers chargés, et ça supporte une tetra chiée de formats !

http://assimp.sourceforge.net
Formats supportés

Offline Elrick

  • Base
    • View Profile
  • Groupe: SFX
  • Rôle: Code / GFX
  • Ville: Lyon
Re : Vitesse de chargement d'un .OBJ
« Reply #2 on: 09 January 2013 à 12:39:01 »
bon j'aurais du poser la question plus globalement.

l'OBJ c'est un exemple, imagine que c'est un autre format de fichier texte

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : Vitesse de chargement d'un .OBJ
« Reply #3 on: 09 January 2013 à 12:43:06 »
Mouais bah si l'OBJ c'est du texte comme ça a l'air de l'être, pose-toi la question de processer 1,000,000 de chaines de caractères de N floats avec à chaque fois des indentifieurs devant pour savoir de quel type ils sont...

J'te conseillerais franchement de le lire une fois et de restocker le tout en binaire dans un format à toi !

Et puis surtout, pas processer chaque vertex et faire "Si le champ suivant c'est une position alors position, sinon si c'est une normale alors normale, sinon si c'est un UV alors UV" mais carrément:

1) tu lis le vertex format descriptor (1 byte) qui te donne un enum avec l'équivalent des P3N3G3B3T2 et autres qu'on avait vu
2) tu lis le nombre de vertex
3) tu lis tout ton stream en binarie de N*sizeof(VertexFormat) bytes et PAF!

Idem pour les index...

Là je te garantis que ton truc il va se charger en un pet de lapin... ;D
.  Pom  .

Offline Elrick

  • Base
    • View Profile
  • Groupe: SFX
  • Rôle: Code / GFX
  • Ville: Lyon
Re : Vitesse de chargement d'un .OBJ
« Reply #4 on: 09 January 2013 à 12:49:45 »
Bon globalement, il n'y a pas de recette miracle quoi.

Offline xoofx

  • Base
    • Pouet.net
    • View Profile
    • xoofx
  • Ancienneté: 1989
  • Groupe: FRequency
  • Rôle: code (+musique), web
  • Ville: Grenoble
Re : Vitesse de chargement d'un .OBJ
« Reply #5 on: 09 January 2013 à 14:16:43 »
+1 Patapom pour le chargement binare+bulk et MsK` pour Assimp.

Offline nytrik

  • Base
    • View Profile
  • Ancienneté: 1994
  • Groupe: cocoon
  • Rôle: GFX -3D et trucs du genre
  • Ville: LONDON - UK
Re : Vitesse de chargement d'un .OBJ
« Reply #6 on: 10 January 2013 à 13:36:22 »
Elrik : heu trouve toi un graphiste qui te fais des normal maps  :).....ok je sors

Offline Elrick

  • Base
    • View Profile
  • Groupe: SFX
  • Rôle: Code / GFX
  • Ville: Lyon
Re : Re : Vitesse de chargement d'un .OBJ
« Reply #7 on: 10 January 2013 à 13:44:15 »
Elrick : heu trouve toi un graphiste qui te fais des normal maps  :).....ok je sors
;)

Offline ponce

Re : Vitesse de chargement d'un .OBJ
« Reply #8 on: 10 January 2013 à 14:18:59 »
Autant je comprends pour le nom de fichier, autant je voie pas trop de raison de parser le .obj en wchar_t.
(le format .obj c'est quand même relou quand tu te retrouve a merger les vertex, trianguler et le format de matérial beurk)
« Last Edit: 10 January 2013 à 20:55:06 by ponce »

Offline MsK`

  • Base
    • Pouet.net
    • View Profile
  • Rôle: Code
  • Ville: Paris/RP
Re : Vitesse de chargement d'un .OBJ
« Reply #9 on: 10 January 2013 à 19:38:51 »
Ah mais moi pareil, j'utilise assimp pour faire des tools qui convertissent en format binaire maison.

Offline nytrik

  • Base
    • View Profile
  • Ancienneté: 1994
  • Groupe: cocoon
  • Rôle: GFX -3D et trucs du genre
  • Ville: LONDON - UK
Re : Vitesse de chargement d'un .OBJ
« Reply #10 on: 11 January 2013 à 15:42:43 »
Bon c' est la "minute du graphiste qui ne comprend rien" : c est bien necessaire de faire un moteur demo qui bouffe des meshs de 950K vertex ?
Quel graphiste est assez malade pour produire ca .

le niveau de detail offert par ce nombre de faces est tout a fait replicable en low res avec des nomal map + Ao map+ Diffuse ..... pour 10 fois moins de face.

enfin voila j arrete d etre lourd 

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : Vitesse de chargement d'un .OBJ
« Reply #11 on: 11 January 2013 à 16:26:07 »
Bah il fait pas un "moteur démo", il essaie de créer son renderer... C'est normal qu'il essaie de charger des gros meshes pour tester.
En + il a pas de graphiste sous la main pour lui faire ses normal maps et compagnie, c'est plus chiant à trouver que des gros meshes dispo gratos sur turbosquid...
.  Pom  .

Offline flure

  • Base
    • Pouet.net
    • View Profile
  • Ancienneté: 1998
  • Groupe: PoPsY TeAm
  • Rôle: Codeur Linux
  • Ville: Lyon
Re : Vitesse de chargement d'un .OBJ
« Reply #12 on: 11 January 2013 à 16:45:45 »
@nytrik : si tu pouvais dire ça à Wodk, peut-être qu'il t'écouterait, toi... ;)

Offline Elrick

  • Base
    • View Profile
  • Groupe: SFX
  • Rôle: Code / GFX
  • Ville: Lyon
Re : Vitesse de chargement d'un .OBJ
« Reply #13 on: 24 January 2013 à 19:21:51 »
@nytrik pas besoin d'autant de poly effectivement mais c'etait pour avoir un truc suffisament gros pour voir un peu les perfs ... pour avoir une référence.

bon sinon assymp ca marche bien mais qu'avec des formats chelous ...
genre le lxo (modo) il gère pas (ou j'ai pas reussit) les textures.
il prend pas le fbx (du moins dans la version compilee telechargeable)

et si c'est pour avoir une dll de 6Mo pour charger de l'obj ... bref

Offline Elrick

  • Base
    • View Profile
  • Groupe: SFX
  • Rôle: Code / GFX
  • Ville: Lyon
Re : Vitesse de chargement d'un .OBJ
« Reply #14 on: 25 January 2013 à 15:24:08 »
En fouillant dans le SDK Directx:

...\SDK\Microsoft\Microsoft DirectX SDK (June 2010)\Samples\C++\Misc\ContentExporter\ImportFBX
et
...\SDK\Microsoft\Microsoft DirectX SDK (June 2010)\Samples\C++\Misc\ContentExporter\SDKMeshFileWriter