begin process at 2010 03 14 06:55:02
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Tutoriels

 > REPRÉSENTATION D'UNE SPHÈRE EN 3D (FLAT SHADING)

REPRÉSENTATION D'UNE SPHÈRE EN 3D (FLAT SHADING)


 Information sur la source

Note :
Aucune note
Catégorie :Tutoriels Classé sous :3d, flatshading, vecteur, éclairage Niveau :Débutant Date de création :04/09/2006 Vu / téléchargé :3 840 / 441

Auteur : Nasman

Ecrire un message privé
Commentaire sur cette source (17)
Ajouter un commentaire et/ou une note

 Description

Cette source a été initiée suite à un post de tomart2005 désirant afficher une sphère et également traiter l'aspect éclairage/couleur des faces.
Ce programme illustre quelques uns des aspects du problème, calculs vectoriels, orientation des facettes élémentaires mais montre la complexité dans un cas plus général.


 Conclusion

A traiter : coupure de l'image (pour une facette non complètement dans l'écran), objet caché par un autre, limitation du "flat shading".

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip CRÉATION DE DIFFÉRENTS EXÉCUTABLES AVEC NASM ET ALINK
Source avec Zip Source avec une capture PROGRAMME DE VISUALISATION ET D'ANALYSE SPECTRALE DE FICHIER...
Source avec Zip CRÉATION DE GRAPHIQUES AVEC LES API WINDOWS
Source avec Zip EXEMPLES SIMPLES DE FICHIERS ÉCRITS AVEC NASM
Source avec Zip DLL EFFECTUANT UNE TRANSFORMÉE DE FOURIER RAPIDE

 Sources de la même categorie

Source avec Zip FLOATTOHEX CODE DE BRUNEWS RETRENSCRIS EN ASM PAR MOI par quoi
Source avec Zip [TUTO]PRISE EN MAIN ET CRÉATION DE .EXE À L'AIDE D'UN DÉBUGU... par rt15
Source avec Zip FPU SAMPLE 2. par tomart2005
Source avec Zip STARFIELD, SPHERE, CUBE, ROTATION 3D ET 2D EN UTILISANT LE F... par tomart2005
Source avec Zip [TUTORÉ] LOTO ET NOMBRES PSEUDO-ALÉATOIRES [MASM] par grandvizir

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture RAYTRACER EN TEMPS RÉEL ET EN ASSEMBLEUR par epineurien
Source avec Zip FPU SAMPLE 2. par tomart2005
Source avec Zip STARFIELD, SPHERE, CUBE, ROTATION 3D ET 2D EN UTILISANT LE F... par tomart2005
Source avec Zip Source avec une capture DEBUT D'UN MOTEUR 3D par VBFRANCE
Source avec Zip PETIT MOTEUR 3D EN TASM32 par haku_arsene

Commentaires et avis

Commentaire de BruNews le 04/09/2006 18:58:30 administrateur CS

Salut,
pourquoi tu crées une stackframe pour tes fonctions ???
'enter' doit prendre 10 cycles au moins et 'leave' 4, ça fait beaucoup à chaque appel surtout que inutile, non ?
Voyons Projection():
  push edi
  mov ecx, [esp+8]  ; adresse de A
  mov edi, [esp+12] ; adresse de destination
  mov eax, [ecx]
  ; etc
  ; etc...
  xor eax, eax
  pop edi
  ret 8
hors
  mov eax, -1
  pop edi
  ret 8

Je remplace partout (dans cette fonction) ESI par ECX (gagne PUSH POP) vu que ECX inutilisé et pas d'appel externe dans la fonction.
Je n'utilise pas nasm, tu nous diras si va bon ainsi.

Commentaire de Nasman le 05/09/2006 09:30:48

Bonjour BruNews,

Effectivement le code est loin d'être optimisé. J'avais utilisé une stackframe pour simplifier (?) le programme et utiliser ebp au lieu de esp (et éviter de compter les registres sauvegardés sur la pile). Je préfère ne pas utiliser ecx car ce dernier est utilisé comme compteur de boucle pour mes facettes. Si je l'utilise je devrais le sauvegarder au préalable et perdrais le bénéfice d'un push et pop.
Effectivement certaines instructions peuvent occuper un certain nombre de cycles mais je ne dispose pas de doc sur le nombre de cycles employés par les microprocesseurs. Je suppose que celà dépend si on utilise un 386, pentium ou plus performant...
J'ai essayé de réduire le temps d'exécution en travaillant avec des entiers mais la précision sera peut-être insuffisante dans certains cas.

Enfin concernant Nasm, je n'utilise pas les macros permettant de définir les différentes procédures et de ce fait le code est traduit directement sans rajout de stackframe ou autres instructions. Nasm permet également d'utiliser quelques instructions comme aam 16 (prévue par intel) que Masm n'autorise pas.

A+

Commentaire de ToutEnMasm le 05/09/2006 12:44:13

Salut,
Masm n'autorisant pas certaines instructions,c'est un scoop.
                           ToutEnMasm

                

Commentaire de BruNews le 05/09/2006 12:49:39 administrateur CS

Je confirme, AAM passe nickel comme toute autre instruction du standard Intel.

Commentaire de Nasman le 05/09/2006 13:19:17

Rebonjour,

Je ne parlais pas de l'instruction AAM tout court (donnant les octets D4 0A soit AAM 0xA mais AAM 0x10 codé avec les deux octets D4 10. Que donne le desassembleur de Masm avec les deux opcodes D4 10 ?
Ces deux octets décomposent un octet mis dans al en deux octets
ah, quotient de al par l'opérande (qui peut être différent de dix) et al qui contient le reste de la division.

Extrait du manuel de Nasm

AAM is for use after you have multiplied two decimal digits together and left the result in AL: it divides AL by ten and stores the quotient in AH, leaving the remainder in AL. The divisor 10 can be changed by specifying an operand to the instruction: a particularly handy use of this is AAM 16, causing the two nibbles in AL to be separated into AH and AL.

Vous pouvez vérifier qu'un exécutable contenant les deux octets D4 10 effectue bien l'opération citée.
Masm permet-il réellement de compiler AAM opérande avec opérande<>10 ?

A+

Commentaire de BruNews le 05/09/2006 14:10:40 administrateur CS

Exact encore, pas d'opérande pour AAM sur MASM.

Faut tout de même préciser que ceci respecte le standard Intel.
Extrait du vol2, Instructions Set Reference:
The AAM mnemonic is interpreted by all assemblers to mean adjust to ASCII (base 10) values. To adjust to values in another number base, the instruction must be hand coded in machine code (D4 imm8).

Commentaire de ToutEnMasm le 05/09/2006 14:21:47


Tout ça manque de clarté.
Mieux vaut prendre la référence intel qui suit,pour savoir de quoi on cause.Une troisième explication me semble necessaire.
                      ToutEnMasm


AAM—ASCII Adjust AX After Multiply Description Adjusts the result of the multiplication of two unpacked BCD values to create a pair of unpacked (base 10) BCD values. The AX register is the implied source and destination operand for this instruction. The AAM instruction is only useful when it follows an MUL instruction that multiplies (binary multiplication) two unpacked BCD values and stores a word result in the AX register. The AAM instruction then adjusts the contents of the AX register to contain the correct 2-digit unpacked (base 10) BCD result.
The generalized version of this instruction allows adjustment of the contents of the AX to create two unpacked digits of any number base (see the “Operation” section below). Here, the imm8 byte is set to the selected number base (for example, 08H for octal, 0AH for decimal, or 0CH for base 12 numbers). The AAM mnemonic is interpreted by all assemblers to mean adjust to ASCII (base 10) values. To adjust to values in another number base, the instruction must be hand
coded in machine code (D4 imm8).





Commentaire de Nasman le 05/09/2006 14:30:59

>ToutEnMasm,

Nasm permet l'instruction AAM 16 qui est assemblé en D4 10. Il n'est pas besoin de rentrer les valeurs à la main ou de faire des db 0xD4,0x10.

Cf extrait du listing généré lors de la compilation

  1040                           hexascii:
  1041 00000BFB D410                    aam 16
  1042                                       
  1043 00000BFD 3C09                    cmp al,0x9

A+

Commentaire de ToutEnMasm le 05/09/2006 14:39:32


Reprenons je cite,
"Nasm permet également d'utiliser quelques instructions comme aam 16 (prévue par intel) que Masm n'autorise pas.
"
ça c'est une contre vérité,preuve a l'appui.

Ensuite,si nasm veut rajouter une instruction de comparaison après l'instruction,c'est en dehors de la norme et sa ne rajoute rien du tout.
                   ToutEnMasm

Commentaire de BruNews le 05/09/2006 14:47:23 administrateur CS

Ne perdons pas de vue que cette instruction comme qlqs autres est obsolète en 64 bits, alors pas de quoi se prendre le crane avec ça.

Commentaire de Nasman le 05/09/2006 15:06:20

L'instruction de comparaison n'est pas liée à AAM, elle sert seulement à voir si le nibble est supérieur à 9 alors entre A et F sinon entre 0 et 9. J'ai laissé la ligne du listing pour montrer que AAM 16 occupe deux octets.
La conversion Mnemonique - octets n'est pas faite au niveau du microprocesseur qui ne connait que des octets mais par l'assembleur. Peut-être que dans l'esprit des gens d'Intel il n'existe que Masm comme assembleur.

Commentaire de ToutEnMasm le 05/09/2006 15:15:36


Pour finir,
Il manque les opcodes dans la copie du livre d'intel,les voila,
D4 0A AAM ASCII adjust AX after multiply
D4 ib (No mnemonic) Adjust AX after multiply to number base imm8

     Voila,information complète.
               ToutEnMasm

Commentaire de BruNews le 05/09/2006 15:42:27 administrateur CS

nasman > trop drole ta remarque. Soyons sérieux, c'est masm qui colle aux prescriptions Intel et non le contraire.

Je rextifie ce que j'ai dit plus haut:
AAM a disparu en 64 bits ET est obsolète depuis le Pentium (ça fait un bail...).
Une instruction à plus de 10 cycles (donc perte 20 instructions avec parallelisation) pour traiter 2 octets, c'est abusé. Il était temps qu'elle soit enlevée définitivement.

Commentaire de ManChesTer le 11/09/2006 16:07:26 administrateur CS

Nasman,

Je salue ton source qui est tres didactique.

Cependant il ne faut pas oublier que des outils permettent de réalisé ce genre d'objects 3d (opengl & directx) et de gerer les effets, déformations etc... Il est conseiller de les utiliser car ces outils garantissent une compatibilité à long teme et facilitent grandement le développement et les mise à jour.

Pour un dévelopement "pro", il est donc important d'utiliser un outil de ce type.

D'autre part ces outils sont fortement étudiés et obtimisés.
Certaines librairies permettent meme une compatibilité entre différents os/cpu.

Quand à l'utilisation d'une instruction "obsolete", pas de tracas, intel garantit la compatibilité dessandante des instructions.

Il est clair que l'instruction en question n'est pas obtimisée mais le but du source n'est-il pas didactique ?

D'autre part c'est bien plus obtimisé que le code généré par la majorité des compilateurs c, pascal ou autres....

Donc bravo pour ton source et continue sur cette voie qui me semble intéressante ;)

Bon Coding...

ManChesTer.

Commentaire de BruNews le 11/09/2006 16:54:45 administrateur CS

Essaie donc de battre VC++ 2005 en 'Release Full Optmization' sur une grosse fonction, ça demande un sérieux boulot et victoire pas garantie du tout.
Il faut cesser de penser qu'un compilo C est un vulgaire crétin d'automate, on n'en est plus là du tout.

Commentaire de Nasman le 11/09/2006 16:58:29

Bonjour Manchester,

Il est vrai que des fonctions de manipulation d'images bien plus sophistiquées existent et peuvent éviter de refaire ce qui existe déjà. Malheureusement c'est souvent (toujours?) utiliser une boite noire et on ne connait pas le mécanisme utilisé. D'autre part ces fonctions ont été la plupart du temps développées avec un langage de plus haut niveau et à la compilation on obtient quelque chose qui est loin d'être optimisé, même si les routines utiles (qui calculent réellement quelque chose) le sont.

C'est sans doute la rançon à payer pour avoir une plus grande compatibilité entre les différents systèmes.

Commentaire de ManChesTer le 12/09/2006 17:09:48 administrateur CS

BruNews,

Biensur certains compilateus permette une "bonne" obtimisation mais aucun ne vaudra jamais la maitrise des cycles machines que tu à en asm.

Certains compilateurs actuels sont memes "contre-performant", malheureusement, il n'y a pas que des bons compilos qui existent....

Mais je suis d'accord avec toi la plupart des compilos c permettent de généré un code assez obtimisé, mais il faut etre réaliste ce n'est pas le cas de tous les compilos (regarde le code que génere le compilo vb par exemple)....

Nasman,

Tu a raison les fonctions graphiques sont souvent "définies" dans des langages de haut nivau.

Prenons l'exemple de OpenGl que je connais bien, c'est bien une "boite noire" pour toi, bien que la doc détaillée du standard OpenGl se trouve sur le net et est accesible à tous mais peux de développeurs vont faire l'effort de lire les docs à se sujet, surtout qu'elle est énorme et tres réberbative.

Le principe de opengl:

le "cpu" de la carte graphique contiend des fonction opengl en interne, c'est du code 100% assembleur qui est traduit sous forme de shéma électronique et inclus dans la "partie opengl" de la puce de la carte graphique.

Ce systeme est donc hyper rapide, bien plus que nimporte quel code asm que tu pourrais pondre sur ton pc à cause notament des vitesses de transfert ram pc=>vidéo=>ram pc et de la vitesse des puces qui utilisnt des shemas "figés ou semi figés" et donc baucoups plus rapides que le code interpreté par un cpu.

Le développeur moyen utilise en fait une librairie qui définit et traduit les appels et les dialogues entre le langage dans lequel il développe et les fonctions internes de la puce.

Normalement ce code ne sert qu'au transfert de commandes et ne contiend aucune routines "low-level" puisque celles ci sont dans la puce de la carte écran.

Dans les faits les librairies contennent du code "low-level" pour garantir la compatibilité opengl de certaines cartes graphiques "non compatibles" ou ne respectant pas la norme opengl.

On parle dans ce cas d'une émulation opengl. Elle n'existe en réalité que pour garantir la compatibilité de l'application.

Il faut aussi savoir que des libs opengl existent en assembleur.

Dans tous les cas c'est au développeur de choisir la "boite noire" qu'il veut utiliser (opengl, directx &co, mmx et autres de plus haut nivau mais souvent portables et donc moins performants).

Bon Coding...

ManChesTer.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

aide pour faire jeux 3d [ par ghyslain ] nous somme en train de faire un jeu 3d de dragon ball z sur pc.sa ne peux que etre une bonne experience.pour nous aider nous avons besoin de:_programm Effacer un vecteur de caractere [ par RootASM ] Bonjour, J'ai utliser un vecteur que j'ai declarer comme suit : vec1 250, ?, 251 dup('$') J'aimerais pouvoir effacer tout son contenu. J'ai vu la fonc Interception d'événements sur port série [ par ffred10 ] Bonjour.Je voudrais espionner un bus I2C en le reliant sur le port série.Je n'ai pas de problème avec les connections électroniques, ni avec la techno Installation routine [ par Lilia_sys ] Bonsoir,S'il vous plait, est ce que qcq connait comment installer un vecteur d'interruption en utislisantINT 21H. Par exemple:  installer un vecteur (


Nos sponsors


Appels d'offres

Sondage...

Comparez les prix


HTC Magic

Entre 429€ et 429€

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,484 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales