« 1 (2)


Re: hARMful engine
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 1484
Petite question pour la culture: comment ça fonctionne, en résumé, un moteur de jeu qui gère nativement un langage ?

Par exemple, Ogre est en C++, mais accepte nativement le python. Pourtant, il semble qu'on ne sait pas tout faire en python.

Et Blender, pareil: pourquoi un programme en C++ nous permet de communiquer en python ?

Contribution le : 21/01 16:36:28
Créer un fichier PDF de la contribution Imprimer


Re: hARMful engine
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2136
Python est un langage interprété. Contrairement à certains langages comme C, C++ ou Rust, il n'est pas compilé. Autrement dit, Python n'est pas directement traduit en langage assembleur (~ instructions en bits) que le processeur est capable d'exécuter directement.
Pour pouvoir interpréter du Python et donc rendre son code exécutable par l'ordinateur, il faut un programme intermédiaire appelée interpréteur qui s'occupe de faire cette traduction "texte vers assembleur".

De tels programmes d'interprétation existent, écrits en différents langages pour Python. CPython est écrit en C, Jython en Java, etc.

Pour utiliser du Python depuis un programme en C ou C++, on a justement une interface en C existante qui fait cette traduction. Celle-ci permet soit d'embarquer du code Python sous la forme d'une chaîne de caractère, soit d'importer un module Python depuis un fichier.

Ici le lien de la doc, mais le code est indigeste bien qu'ils précisent que c'est à cause de nombreuses vérifications.
https://docs.python.org/2/extending/embedding.html


A l'inverse, on peut étendre le langage Python à partir de code C ou C++ (ou encore d'autres sans doute). On écrit le code qui fait ce qu'on veut en C/C++ et on crée ensuite des fichiers autour qui vont servir à importer et utiliser ces fonctions ou classes. La raison de faire ça peut être multiple : performances, réutilisation du même code en natif ou en Python, etc.
Dans le cas du BGE, on récupère par exemple des données de la scène 3D (position d'objets). Les gars se sont pas amusés à synchroniser 40 fois les mêmes données : ils ont dû faire un wrapper du code C++ existant dans Blender.

Pour mieux expliquer tout ça, parlons de trois phases permettant d'appeler du code natif depuis un script (l'exemple est bidon* et très simpifié, c'est pour l'idée) :
1. Code natif
float myFunction(float a, float b, int c) {
    // ....
    return result ;
}

2. Wrapper
void wrapperMyFunction(PyFloat a, PyFloat b, PyIntc, PyFloat& result) {
    float resultFloat = myFunction(a.value(), b.value(), c.value()) ;
    result.setValue(resultFloat) ;
}

3. Script

f1 = 0.2
f2 = 3.6
i1 = -6
result = 0.
wrapperMyFunction(f1, f2, i1, result)

* (j'ai inventé les PyFloat, etc)


1. Tu as du code natif, disons une fonction en C++ que tu utilises déjà dans ton application. Elle a ses propres paramètres pour son calcul et retourner son résultat. Maintenant, tu veux aussi pouvoir l'exposer en Python...

2. Problème : l'interpréteur Python il ne la connaît pas et ne sait même pas comment l'appeler !

Il faut en effet prendre le problème à l'envers du cas habituel.
Dans le cas du BGE habituel, tu cherches la fonction "OrthoProjectionMatrix(plane, matSize, axis)". Tu vois qu'attend ces 3 paramètres, donc tu donnes ces valeurs lors de ton appel de fonction.
La signature de la fonction guide l'appel de fonction.

Dans le cas de l'extension d'un langage de script, c'est l'inverse : on sait comment va être appelée la fonction et c'est donc à nous de créer la signature avec les paramètres qui seront donnés.
L'appel de fonction guide la signature de la fonction.

Or, notre belle fonction décrite en 1. n'a pas forcément cette signature (encore moins s'il faut un type de donnée spécifique au langage de script comme je l'ai fait ici).
On va alors appeler notre fonction en 1. depuis notre nouvelle fonction en cours de développement : c'est typiquement ce que fait un "wrapper".

Elle va par exemple "convertir" les PyFloat en float, etc. Les donner à notre fonction native et emballer le résultat en PyFloat tel que souhaité.

3. Avec tout un tas de choses en plus de ce que j'ai fait en exemple bidon, on peut enfin utiliser notre fonction en Python.

Contribution le : 21/01 18:01:24
Créer un fichier PDF de la contribution Imprimer


Re: hARMful engine
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2136
Ici, je parle de Python mais c'est globalement le cas pour tous les langages de script.

Dans mon ancien taf, j'avais la magnifique tâche de faire communiquer du script Matlab avec du C. Donc je connais bien la procédure que ça implique même si je ne connais pas celle spécifique à Python.

Contribution le : 21/01 18:07:17
Créer un fichier PDF de la contribution Imprimer


Re: hARMful engine
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2136
Coucou,
Un petit point sur les avancements !

J'ai pris un peu de retard par rapport aux prévisions. D'une part parce que j'ai fait une "bêtise" : j'ai voulu ajouter le support de l'anti-aliasing !
De l'autre, un incendie a eu lieu dans ma résidence et ça a foutu la pagaille ! Heureusement, pas de dégâts chez moi.

Ce que je ne savais pas avec l'anti-aliasing - car j'ai exploré un domaine que je ne connaissais pas du tout - c'est que ça allait changer énormément de choses dans le code ! J'ai dû faire un beau refactoring ("réusinage" pour nos amis québécois).
Cela m'a demandé en fait de revoir la partie du rendu, en particulier "à cause" de l'ambient occlusion. C'est un mal pour un bien car ce travail devait être fait, je le prévoyais pour plus tard lorsque j'allais implémenter des effets de post-production. Au final, l'ajout d'effets de post-prod sera nettement simplifié !

La suite sera une amélioration du code sans ajouts notables côté rendu. En particulier, je vais m'attacher à utiliser les smart pointers de C++ pour faciliter la gestion de la mémoire.
J'ai aussi quelques bugs à corriger avant de passer au support de Windows.

Le plan de développement est ici !
https://github.com/dcarlus/hARMful/projects/5



Si vous êtes intéressés par les détails techniques, voici une petite explication.

Je fais mes rendus hors écran, dans des framebuffers, pour réaliser du "deferred shading"*. Un framebuffer est comme un ensemble de textures dans lesquelles on vient écrire les valeurs de pixels à l'aide de shaders. Un framebuffer peut contenir plusieurs images en couleur en plus d'un depth buffer et d'un stencil buffer.
Dans mon cas, je stocke l'albedo des objets (= couleur/texture), les normals, la spécularité et la profondeur des objets (depth buffer).

Pour l'ambient occlusion, je stockais auparavant sa valeur dans le canal alpha de l'albedo pour un côté pratique et optimisé.

Le souci avec l'anti-aliasing, c'est que j'ai dû modifier le type de mes framebuffers afin que ceux-ci supportent le multisampling (comme l'option MSAA des jeux vidéo). Quand on utilise un framebuffer en multisampling, toutes les textures qui le composent doivent elles-mêmes être aptes à supporter le multisampling. Ainsi, mon ambient occlusion était calculée plusieurs fois par le GPU pour chaque sample. Par exemple, pour un MSAA x4, elle est calculée 4 fois. Pire encore, une texture avec multisampling occupe plus d'espace puisqu'il faut autant de copies qu'il y a de samples (dans l'exemple, 4 copies). Mais l'ambient occlusion n'a pas besoin d'antialiasing car elle est déjà floutée dans le processus de traitement.

J'ai donc dû faire beaucoup de changements pour avoir d'un côté mon framebuffer avec MSAA. J'ai ensuite précalculé le shading en appliquant le MSAA dans un autre framebuffer sans multisampling (!). Ce framebuffer me sert également pour les effets de post-prod dont l'ambient occlusion.

Ouf !!


J'ai acheté le humble bundle d'objets 3D à 1€ pour faire des scènes de démo, ici la scène de démo du pack.


* Le deferred shading, c'est une façon qui est très répandue dans les jeux vidéo pour optimiser le calcul des lumières (il existe des alternatives). Au lieu de calculer l'ombrage pour chaque objet, on ne le fait que globalement pour uniquement ce qui est visible à l'écran.
https://fr.wikipedia.org/wiki/Deferred_Shading

Contribution le : 15/02 18:18:39
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant
« 1 (2)




Enregistrer votre réponse
Compte*
Nom   Mot de passe   Authentification
Message:*



[Recherche avancée]



Sujets récemment répondus
Forums Sujets Réponses Lus Dernières contributions
Questions & Réponses [non résolu] rendu image 4 64 Aujourd'hui 14:09:05
galley59 
Questions & Réponses Objet différent de Blender à Cura 2 44 Aujourd'hui 12:56:07
RuBy_H 
Questions & Réponses emission objet avec hdri 0 10 Aujourd'hui 12:39:59
ritchy22 
Hors Sujet !! Studio Multimédia magazine    [1][2] 10 2589 Hier 19:20:57
lucky 
Questions & Réponses Grove 6 1 39 Hier 18:54:06
SPH 
Le coin des geeks GPU AMD Compatible Blender 2.82 2 34 Hier 18:53:37
DesmoDark 
[WIP] et travaux terminés [WIP] Projet Tales & Legends    [1][2][3]...[12] 111 37270 Hier 11:54:14
blendman 
The Blender Clan 'tchat Décès d'Eddy    [1][2] 18 676 Hier 11:45:42
blendman 
Moteur de jeu GameBlender et alternatives [WIP] DeadSigns FPS horreur - Reprise du développement    [1][2][3]...[42] 417 76314 Hier 09:45:07
Hook 
The Blender Clan 'tchat Tutoriels en français ou en anglais ? 1 53 Hier 06:53:06
tykrane 
Questions & Réponses Méthode de référence : verre avec Eevee 2 81 27/02 21:27:16
tykrane 
Questions & Réponses comment importer un fichier makehuman avec son armature dans blender 2.82 ? 0 117 27/02 15:20:21
fouyou 
Questions & Réponses [non résolu] Fluide passe à travers obstacle    [1][2] 14 267 27/02 15:18:15
alexmge 
Questions & Réponses [Bones]renomer en symétire 3 138 26/02 19:47:55
pierre-y 
Questions & Réponses [résolu] Perte de vue de mon objet par des zones grises 2 150 26/02 18:13:42
Olguern 
Questions & Réponses [Quaternion] Que represente le w dans la rotation en quaternion? 1 126 26/02 14:18:02
Redstar 
Questions & Réponses Century fox rendu pas top    [1][2] 12 308 23/02 11:21:57
Rimpotche 
Questions & Réponses Installer une ancienne version pour Blend4web 4 199 21/02 18:44:19
Rimpotche 
Questions & Réponses [résolu] Array autour d'un axe 3 148 22/02 16:52:12
Crocodile_13 
Questions & Réponses eevee radiosité 3 160 24/02 17:15:34
Rimpotche 

Qui est en ligne
84 utilisateur(s) en ligne (dont 36 sur Forums)

Membre(s): 0
Invité(s): 84


plus...
Nouveaux membres
BrandenHar 29/2/2020
IgnacioWat 29/2/2020
VirgilioHa 29/2/2020
JoelHarris 29/2/2020
CruzBalder 29/2/2020
ritchy22 29/2/2020
galley59 28/2/2020
DesmoDark 28/2/2020
Toast 28/2/2020
pspkjsp 25/2/2020
Dernier Ajout
mirages-preview~0.jpg

Evènements à venir
Mar 14
Anniversaire de AMV12
Mar 16
Anniversaire de galba
Mar 29
GeeWee's B-Day
plus 273 plus d'élément(s)
 Par Mickaël Guédon [ebrain] © 2003-2020 The Blender Clan - hébergé par TuxFamily - Site déclaré à la CNIL sous le numéro 1155445