Monde à la "Minecraft" v2

Généralités sur la programmation 3D
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Monde à la "Minecraft" v2

Message par kelebrindae »

Bonjour,

J'ai enfin trouvé un peu de temps pour refaire de zéro mon exemple de "Minecraft-Like". Tout le source et les ressources sont dans le zip ci-dessous. Désolé, je ne peux pas mettre le code directement ici, ça ne tient pas... :(
http://keleb.free.fr/codecorner/downloa ... clone2.zip

[UPDATE 11/07/2014]
Support préliminaire d'OpenGL => si quelqu'un peut tester sur Mac / Linux et me dire si ça marche, ça m'intéresse!
[/UPDATE]

[UPDATE 10/07/2014]
Un peu plus de matériaux pour construire, correction du bug sur la lave.
Et surtout ajout des matériaux type "billboard" pour l'herbe et les fleurs! :mrgreen:
(par contre, les mondes modifiés avec les versions précédentes ne sont plus compatibles; désolé)
- Clic gauche pour creuser / clic droit pour construire;
- E/R pour sélectionner le matériau de construction;
- G pour passer en "ghost mode"
- Ctrl + flêches pour se déplacer.
[/UPDATE]

La version 5.30 de PB m'a bien aidé, en ceci qu'on peut désormais afficher le nombre de batches de rendu utilisés pour afficher la scene 3D.
Pour mémoire, Ogre doit "ordonner" la scène en paquets de choses à afficher avant d'envoyer les infos vers le GPU. Cette opération est faite par le CPU, ce qui constitue un goulet d'étranglement important: quelque soit le nombre de polygones affichés, au-delà d'un certain nombre de batches (100, 200, 400 selon les machines), ça ramera.
Grâce à la v5.30, j'ai pu voir que:
- Chaque material compte pour 1 batch;
- Chaque groupe de géométrie statique compte pour 1 batch;
- Les deux se multiplient: 10 groupes contenant 10 materials chacun correspondent à 100 batches (je crois).

Par ailleurs, pour créer un paysage en cubes, on sait qu'on va avoir beaucoup de polygones avec pleins de textures différentes, donc:
- On voudrait créer plusieurs groupes statiques (beaucoup?), afin que les polygones non-présents à l'écran soient automatiquement exclus du rendu;
- De plus, un groupe statique prend du temps à construire: après avoir ajouté les entités voulues dans le groupe, il faut faire un "BuildStaticGeometry" qui est d'autant plus long qu'il y a beaucoup de polygones dedans. Donc, si on veut les créer au fur et à mesure qu'on se balade dans le paysage, il vaut mieux qu'ils soient petits (donc nombreux);
- Qui dit textures différentes dit materials différents, donc beaucoup aussi.
Vous voyez le problème...

Voici le compromis que j'ai choisi:
- Le paysage est découpé en "chunks" de 16x16x16 cubes, qui sont créés à la volée quand on bouge la caméra. Ils sont initialisés dans un thread (grâce à l'include "Perlin" fourni par G-Rom), puis on les mets dans des groupe de géométrie statique (1 par chunk);
- Un seul material est utilisé pour toutes les textures, selon la technique du "Texture Atlas": on une grosse image contenant toutes les textures (comme une feuille de sprites), et on pointe sur la bonne à l'aide d'un shader. Pour passer le n° de texture à afficher au shader, j'ai codé ça dans le rouge de la couleur du vertex (256 textures maxi, donc);
- Le Texture Atlas est construit automatiquement à partir de datas et d'images présentes dans le répertoire "TextureLib", ça facilite la maintenance et la customisation;
- Pour les materials semi-transparents (l'eau) et les materials animés (magma), j'ai été obligé de créer des materials à part => ça fait 3 en tout.

Dernière précision, j'ai stocké les infos des chunks dans des octrees (cf mon post précédent), mais je ne suis pas certains que ce soit très avantageux...

Image
Image
Image
Dernière modification par kelebrindae le ven. 11/juil./2014 14:26, modifié 6 fois.
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Monde à la "Minecraft" v2

Message par comtois »

ça tourne bien chez moi, FPS d'environ 1000.
C'est excellent, ça fait plaisir de voir ce que certains sont capables de sortir avec la lib 3D.

Mais mon avis ne compte pas, je suis fan de tout tes codes :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Monde à la "Minecraft" v2

Message par graph100 »

même si certains n'aime pas ça, peut-tu inclure un exe aussi ? Je n'ai pas installé la version 4.30... pour le moment je reste à la LTS
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Monde à la "Minecraft" v2

Message par comtois »

graph100 a écrit :même si certains n'aime pas ça, peut-tu inclure un exe aussi ? Je n'ai pas installé la version 4.30... pour le moment je reste à la LTS
à mon avis ça prend moins de temps d'installer la 5.30 que de refaire une archive et la mettre à nouveau en ligne.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Monde à la "Minecraft" v2

Message par kelebrindae »

@graph100:
L'exe et engine3D.dll se trouvent ici (mais en 64bits):
http://keleb.free.fr/codecorner/downloa ... _exe64.rar
Ceci dit, je pense qu'en mettant seulement la ligne qui affiche les FPS en commentaires (176), ça doit marcher en 5.22.

@Comtois:
Merci! :D
1000 FPS, on peut dire que ça tourne pas mal, chez toi 8O . Si tu veux éprouver un peu ton système, il y a une constante "#VIEWDIST" au début du code qui détermine à quelle distance sont affichés le morceaux de paysage; j'ai l'impression que tu peux la mettre à 5 ou 6 sans trop de problème...
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Fred
Site Admin
Messages : 2805
Inscription : mer. 21/janv./2004 11:03

Re: Monde à la "Minecraft" v2

Message par Fred »

Genial comme d'habitude :)
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Monde à la "Minecraft" v2

Message par kelebrindae »

Merci! :D Je vais essayer d'ajouter rapidement les collisions et la possibilité de creuser/construire, ce sera un peu plus fun.
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Monde à la "Minecraft" v2

Message par comtois »

kelebrindae a écrit :@Comtois:
Merci! :D
1000 FPS, on peut dire que ça tourne pas mal, chez toi 8O . Si tu veux éprouver un peu ton système, il y a une constante "#VIEWDIST" au début du code qui détermine à quelle distance sont affichés le morceaux de paysage; j'ai l'impression que tu peux la mettre à 5 ou 6 sans trop de problème...

Pour info , avec #VIEWDIST = 6, le FPS varie entre 500 et 600.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Monde à la "Minecraft" v2

Message par graph100 »

merci pour l'exe, mais il semble que ça ne fonctionne pas chez moi, je n'ai pas saisi pourquoi et le log ogre ne révèle pas de bug en particulier ( ?)

Tant pis :(

chez moi ce genre de code nécessite généralement la compilation en mode OpenGL... Mais le log ne rale pas ...

Code : Tout sélectionner

20:39:41: Creating resource group General
20:39:41: Creating resource group Internal
20:39:41: Creating resource group Autodetect
20:39:41: SceneManagerFactory for type 'DefaultSceneManager' registered.
20:39:41: Registering ResourceManager for type Material
20:39:41: Registering ResourceManager for type Mesh
20:39:41: Registering ResourceManager for type Skeleton
20:39:41: MovableObjectFactory for type 'ParticleSystem' registered.
20:39:41: OverlayElementFactory for type Panel registered.
20:39:41: OverlayElementFactory for type BorderPanel registered.
20:39:41: OverlayElementFactory for type TextArea registered.
20:39:41: Registering ResourceManager for type Font
20:39:41: ArchiveFactory for archive type FileSystem registered.
20:39:41: ArchiveFactory for archive type Zip registered.
20:39:41: ArchiveFactory for archive type EmbeddedZip registered.
20:39:41: DDS codec registering
20:39:41: FreeImage version: 3.10.0
20:39:41: This program uses FreeImage, a free, open source image library supporting all common bitmap formats. See http://freeimage.sourceforge.net for details
20:39:41: Supported formats: bmp,ico,jpg,jif,jpeg,jpe,koa,iff,lbm,pbm,pbm,pcd,pcx,pgm,pgm,png,ppm,ppm,ras,tga,targa,tif,tiff,wap,wbmp,wbm,psd,cut,xbm,xpm,dds,gif,g3,sgi,j2k,j2c,jp2
20:39:41: PVRTC codec registering
20:39:41: Registering ResourceManager for type HighLevelGpuProgram
20:39:41: Registering ResourceManager for type Compositor
20:39:41: MovableObjectFactory for type 'Entity' registered.
20:39:41: MovableObjectFactory for type 'Light' registered.
20:39:41: MovableObjectFactory for type 'BillboardSet' registered.
20:39:41: MovableObjectFactory for type 'ManualObject' registered.
20:39:41: MovableObjectFactory for type 'BillboardChain' registered.
20:39:41: MovableObjectFactory for type 'RibbonTrail' registered.
20:39:41: *-*-* OGRE Initialising
20:39:41: *-*-* Version 1.8.2 (Byatis)
20:39:41: D3D9 : Direct3D9 Rendering Subsystem created.
20:39:41: D3D9: Driver Detection Starts
20:39:41: D3D9: Driver Detection Ends
20:39:41: Particle Emitter Type 'Point' registered
20:39:41: Particle Emitter Type 'Box' registered
20:39:41: Particle Emitter Type 'Ellipsoid' registered
20:39:41: Particle Emitter Type 'Cylinder' registered
20:39:41: Particle Emitter Type 'Ring' registered
20:39:41: Particle Emitter Type 'HollowEllipsoid' registered
20:39:41: Particle Affector Type 'LinearForce' registered
20:39:41: Particle Affector Type 'ColourFader' registered
20:39:41: Particle Affector Type 'ColourFader2' registered
20:39:41: Particle Affector Type 'ColourImage' registered
20:39:41: Particle Affector Type 'ColourInterpolator' registered
20:39:41: Particle Affector Type 'Scaler' registered
20:39:41: Particle Affector Type 'Rotator' registered
20:39:41: Particle Affector Type 'DirectionRandomiser' registered
20:39:41: Particle Affector Type 'DeflectorPlane' registered
20:39:41: PCZone Factory Type 'ZoneType_Default' registered
20:39:41: CPU Identifier & Features
20:39:41: -------------------------
20:39:41:  *   CPU ID: GenuineIntel: Intel(R) Core(TM) i7-3630QM CPU @ 2.40GHz
20:39:41:  *      SSE: yes
20:39:41:  *     SSE2: yes
20:39:41:  *     SSE3: yes
20:39:41:  *      MMX: yes
20:39:41:  *   MMXEXT: yes
20:39:41:  *    3DNOW: no
20:39:41:  * 3DNOWEXT: no
20:39:41:  *     CMOV: yes
20:39:41:  *      TSC: yes
20:39:41:  *      FPU: yes
20:39:41:  *      PRO: yes
20:39:41:  *       HT: no
20:39:41: -------------------------
20:39:41: D3D9 : Subsystem Initialising
20:39:41: Registering ResourceManager for type Texture
20:39:41: Registering ResourceManager for type GpuProgram
20:39:41: ***************************************
20:39:41: *** D3D9 : Subsystem Initialised OK ***
20:39:41: ***************************************
20:39:41: SceneManagerFactory for type 'OctreeSceneManager' registered.
20:39:41: SceneManagerFactory for type 'BspSceneManager' registered.
20:39:41: Registering ResourceManager for type BspLevel
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Fred
Site Admin
Messages : 2805
Inscription : mer. 21/janv./2004 11:03

Re: Monde à la "Minecraft" v2

Message par Fred »

T'as pris les 2 archives ?
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Monde à la "Minecraft" v2

Message par graph100 »

effectivement, je ne l'avais pas fait.
Mais en mettant l'exe dans le répertoire avec les ressources, j'ai une fenêtre qui se lance, puis ça plante, rien à faire.

Et non, il n'y a pas que l'affichage des fps, mais aussi la fonction clipOutput()

Je vais installer PB5.30...
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Monde à la "Minecraft" v2

Message par graph100 »

Chouette j'ai enfin pu me le faire tourner :D

J'ai mis #VIEWDIST = 20 :

849150 polygons, 92 FPS, 1485 Batches, RAM utilisée : 1537.8Mo, Processeur : 22% (ca veut dire que t'as multithreadé un peu... parce que chez moi mono thread à fond c'est 17%)

C'est rigolo, comme c'est énorme et que le monde met du temps à être construit, on peut observer la structure en octree de l’intérieur de la carte.

Chapeau !

[edit] tu devrais modifier :

Code : Tout sélectionner

; Size of a chunk (group of cubes that are prepared/built/rendered at the same time)
#CHUNKSIZE = 16
#CHUNK_INDICELIMIT = #CHUNKSIZE - 1 ; save a lot of "#CHUNKSIZE - 1" at runtime
j'ai modifié que le 1er un moment et j'ai eu un résultat bizarre !

Il semble que ça n'est pas trop une valeur modifiable...
Mais ca m'a permis de voir que pour mon pc, le nombre de batch qui fait passer en dessous de 60fps, c'est 2550 environ (avec chunksize = 1 pour augmenter le nb de batches)
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Monde à la "Minecraft" v2

Message par kelebrindae »

@Graph100:
"#viewdist = 20", c'est énorme! 8O Il me semble avoir lu quelque part que le réglage maxi de Minecraft pour la "render distance" était de 16 (mais ça a pu changer depuis)... Vous avez des specs de folie, sur vos PC! (jalousie)

Sinon, pour "#Chunksize", il faut absolument que ce soit une puissance de 2, à cause du principe même des Octree: on recherche le contenu des blocs en partant de la taille d'origine, puis on divise successivement par 2 jusqu'à trouver un bloc homogène ou jusqu'à ce qu'on arrive à une taille de 1.
Mais je dois t'avouer que je n'ai jamais essayé autre chose que "16", donc je ne sais même pas si ça marche avec une autre valeur... :mrgreen:

Pour info, j'ai implémenté les collision et la destruction de blocs; Je vais bientôt pouvoir poster une version un peu plus évoluée, je crois.
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Monde à la "Minecraft" v2

Message par graph100 »

oui c'est énorme :lol:,

j'ai essayé 64 pour #Chunksize, mais le chargement est tellement long que j'ai quitté avant, puis 8, puis 1, et ça fonctionne. En revanche, la taille du monde que tu affiches est #Chunksize * #viewdist, donc il faut modifier les 2 pour avoir quelque chose de valable.

J'attends avec impatience ta version suivante :D
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Monde à la "Minecraft" v2

Message par G-Rom »

Magnifique :mrgreen:
Vire moi cette skybox & fait des nuages 3D avec le code de "perlin pimpim" :D
Génère le monde à la volée, il ne dois pas y avoir de limite ! je veut creusé ! posé des blocs & joué en multijoueur ! :mrgreen: :mrgreen:

Lib pour le multi :
http://www.purebasic.fr/french/viewtopi ... =8&t=14038
Répondre