Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
984 connectés 

 

Sujet(s) à lire :
    - Article: un raytracer de base en C++
 

 Mot :   Pseudo :  
 
 Page :   1  2  3  4  5  6  7  8  9  10  11  12  13  14  15
Auteur Sujet :

La programmation d'effets de demos old-school (Assembleur + C)

n°524220
bjone
Insert booze to continue
Posté le 26-09-2003 à 18:48:42  profilanswer
 

Reprise du message précédent :
tous les OS libèrent les ressources demandées/crées par un process. (y'a des cas particuliers, comme les communications inter-process sous unix qui sont pas détruites quand y'a plus de process qui les utilisent, alors que sous windows oui )
 
mais c'est pas une excuse pour ne pas libérer ce qu'on crée...
(surtout dans des fonctions, sinon bonjour les leaks, mais bon à la fin d'un programme, (presque) tout est libéré)


Message édité par bjone le 26-09-2003 à 18:50:18
mood
Publicité
Posté le 26-09-2003 à 18:48:42  profilanswer
 

n°524270
antp
Super Administrateur
Champion des excuses bidons
Posté le 26-09-2003 à 19:52:25  profilanswer
 

BJOne a écrit :

tous les OS libèrent les ressources demandées/crées par un process.


 
Win9x aussi ? :D pas toujours il me semble :o


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°524305
pinguin007
a npe error
Posté le 26-09-2003 à 20:43:48  profilanswer
 

pas encore tout lu mais je plante mon drapo ici c ahcment interessant :jap:


---------------
LoD 4 ever && PWC spirit|Le topak de l'iMP-450|inDATOUNEwe trust
n°524319
bjone
Insert booze to continue
Posté le 26-09-2003 à 21:19:14  profilanswer
 

antp a écrit :


 
Win9x aussi ? :D pas toujours il me semble :o


 
en principe y devrait :D

n°524320
schnapsman​n
Zaford Beeblefect
Posté le 26-09-2003 à 21:20:48  profilanswer
 

BJOne a écrit :


 
en principe y devrait :D


 
non, c'est pas censé être un OS ça, tout juste une plateforme de lancement de jeux  :o


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
n°524335
LeGreg
Posté le 26-09-2003 à 22:02:17  profilanswer
 

De toute façon, savoir si l'OS ou non fait le ménage
n'est pas le problème.
Si tu as une fuite de mémoire rien ne garantit qu'elle ne va gonfler dans des proportions énormes, si ton programme
fait plus qu'un hello world (ce qui est vrai pour 99.9999% des programmes).
Faire ramer un ordi surpuissant par négligence -> c'est la peine de mort dans certains pays.
 
LeGreg
 

n°524336
chrisbk
-
Posté le 26-09-2003 à 22:05:51  profilanswer
 

legreg a écrit :


Faire ramer un ordi surpuissant par négligence -> c'est la peine de mort dans certains pays.
 


 
on raconte ds trucs horribles, des types deportés dans d'infames codoirs ou ils font du VB 22h par jour sur un 486dx d'epoque, coude a coude avec le voisin tellement les box sont serrés, et le tout pendant qu'un groupe ecossais joue de la cornemuse plein pot non stop pour les tenirs eveillés.
 
Affreux, vraiment, pensez a faire des free() !
 

n°524340
red factio​n
Posté le 26-09-2003 à 22:14:45  profilanswer
 

chrisbk a écrit :


 
on raconte ds trucs horribles, des types deportés dans d'infames codoirs ou ils font du VB 22h par jour sur un 486dx d'epoque, coude a coude avec le voisin tellement les box sont serrés, et le tout pendant qu'un groupe ecossais joue de la cornemuse plein pot non stop pour les tenirs eveillés.
 
Affreux, vraiment, pensez a faire des free() !
 
 


 [:rofl2]

n°524344
LeGreg
Posté le 26-09-2003 à 22:24:15  profilanswer
 

chrisbk a écrit :


on raconte ds trucs horribles, des types deportés dans d'infames codoirs ou ils font du VB 22h par jour sur un 486dx d'epoque, coude a coude avec le voisin tellement les box sont serrés, et le tout pendant qu'un groupe ecossais joue de la cornemuse plein pot non stop pour les tenirs eveillés.


 
putain t'as bossé dans la meme boite que moi ??
 
LeGreg

n°524414
bjone
Insert booze to continue
Posté le 27-09-2003 à 04:29:28  profilanswer
 

:lol:

mood
Publicité
Posté le 27-09-2003 à 04:29:28  profilanswer
 

n°524925
*syl*
--> []
Posté le 28-09-2003 à 15:57:23  profilanswer
 

Mr yvele a écrit :

[HS]
   Harkonnen> peux tu me virer de ton ignore list?
   (ce post s'autodetruira apres lecture du concerné)
[/HS]

Voilà, c'est fait ;)

n°524926
Mr yvele
yvele n'est plus.
Posté le 28-09-2003 à 15:57:52  profilanswer
 

*Syl* a écrit :

Voilà, c'est fait ;)


 
 ;)

n°524927
red factio​n
Posté le 28-09-2003 à 16:02:31  profilanswer
 

[:yoyoz]


Message édité par red faction le 06-05-2004 à 15:43:43
n°529829
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 02-10-2003 à 22:39:10  profilanswer
 

Désolé pour le retard, mais j'ai pas mal de sommeil en retard en ce moment, et je débauche tard...
Mais bientot mon boulot ne sera plus un problème et j'aurais tout mon temps [:ddr555]


---------------
J'ai un string dans l'array (Paris Hilton)
n°529984
bjone
Insert booze to continue
Posté le 03-10-2003 à 00:51:53  profilanswer
 

Harkonnen a écrit :

Désolé pour le retard, mais j'ai pas mal de sommeil en retard en ce moment, et je débauche tard...
Mais bientot mon boulot ne sera plus un problème et j'aurais tout mon temps [:ddr555]


 
serait-ce:
 
"fous zavez deuze zheures pour libérer fotre buro"
 
 :sweat: ?

n°529986
mareek
Et de 3 \o/
Posté le 03-10-2003 à 00:52:51  profilanswer
 

BJOne a écrit :


 
serait-ce:
 
"fous zavez deuze zheures pour libérer fotre buro"
 
 :sweat: ?


Il est viré mais heureux, son boulot le faisait chier depuis des mois.


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
n°530064
Moktar1er
No one replies...
Posté le 03-10-2003 à 09:35:02  profilanswer
 

l'effet de feu
l'effet de feu
l'effet de feu
l'effet de feu

n°530245
red factio​n
Posté le 03-10-2003 à 13:20:32  profilanswer
 

vu au rythme que ca va c pas demain la veille qu'on aura des metaballs  :whistle:

n°530288
Moktar1er
No one replies...
Posté le 03-10-2003 à 14:05:30  profilanswer
 

et des rasters  :??:   :love:  
bon je retourne au boulot moi...

n°530321
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 03-10-2003 à 14:45:35  profilanswer
 

Oui, oui, oui !
Rasters et metaballs sont prévus !
Et les rasters à l'ancienne hein, avec surveillance du faisceau horizontal et tout !


---------------
J'ai un string dans l'array (Paris Hilton)
n°530324
bjone
Insert booze to continue
Posté le 03-10-2003 à 14:46:08  profilanswer
 

avec un PC ?

n°530347
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 03-10-2003 à 14:54:50  profilanswer
 

ben oui, t'imagines pas tout ce que peut faire une carte VGA ;)


---------------
J'ai un string dans l'array (Paris Hilton)
n°530362
bjone
Insert booze to continue
Posté le 03-10-2003 à 15:10:07  profilanswer
 

tu polles les registres CRTC alors, passke sur amiga/atari st c'était par interruption non ?

n°530374
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 03-10-2003 à 15:20:01  profilanswer
 

ça pour les polluer, je les pollue [:ddr555]
sur ST je sais pas comment ça se passait (surement une interruption effectivement), mais sur Amiga on utilisait le Copper qui permettait d'attribuer une palette différente pour chaque ligne écran


---------------
J'ai un string dans l'array (Paris Hilton)
n°530408
k1200
Posté le 03-10-2003 à 15:59:42  profilanswer
 

http://forum.hardware.fr/icones/flag1.gif
 
A les demos Amiga...  :love:

n°530457
El_gringo
Posté le 03-10-2003 à 16:52:18  profilanswer
 

J'suis en retard, mais j'ai un pb moi:
quand j'essaye d'initialiser le mode d'affichage en 13h, comme ça :

Code :
  1. mov ax,13h // mode dans ax
  2.      int 10h // initialisation du mode écran


Ben, ça plante sur le "int 10h"
ça, c'est uniquement quand je compile avec VC++ 6. Avec la version compilée par Hako de starfield.exe, c ok.

n°530459
drasche
Posté le 03-10-2003 à 16:55:15  profilanswer
 

je crois que c'était dû au compilateur lui-même, il faudrait que tu downloades et installes Watcom pour réaliser sans problème une telle opération. VC n'a pas l'air d'apprécier les appels aux interruptions.

n°530461
bjone
Insert booze to continue
Posté le 03-10-2003 à 16:59:49  profilanswer
 

bah surtout qu'avec VC++ 6, t'es censé faire du Win32, pas du DOS en mode réel.

n°532915
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 06-10-2003 à 23:19:31  profilanswer
 

El_gringo a écrit :

J'suis en retard, mais j'ai un pb moi:
quand j'essaye d'initialiser le mode d'affichage en 13h, comme ça :

Code :
  1. mov ax,13h // mode dans ax
  2.      int 10h // initialisation du mode écran


Ben, ça plante sur le "int 10h"
ça, c'est uniquement quand je compile avec VC++ 6. Avec la version compilée par Hako de starfield.exe, c ok.


VC++ ne permet pas d'utiliser les interruptions DOS, tu ne peux que faire du Win 32.
C'est pour ça que j'ai utilisé Open Watcom ;)


---------------
J'ai un string dans l'array (Paris Hilton)
n°532916
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 06-10-2003 à 23:19:39  profilanswer
 

L'EFFET DE FEU
 
Télécharger le source
Télécharger l'éxécutable
N'oubliez pas de télécharger aussi le dos4gw.exe (le lien est présent dans l'article précédent)
 
L'effet de feu est un effet dont le principe est enfantin. Il repose uniquement sur un jeu de palette.
 
Avant toute chose, il faut définir une palette en adéquation avec la structure de la flamme elle même.
On part du principe qu'une flamme est quasi blanche à sa base, puis jaune et enfin rouge à son sommet. On crééra donc une palette respectant cette logique.
 
Dans mon exemple, j'utilise 128 couleurs sur les 256 possibles en mode 13h :
- La couleur 0 est noire (fond d'écran)
- Les couleurs 1 à 32 contiennent un dégradé qui va du noir au rouge,
- Les couleurs 33 à 64 contiennent un dégradé qui va du rouge au jaune,
- Les couleurs 65 à 96 contiennent un dégradé qui va du jaune au blanc;
- Les couleurs 97 à 128 ne contiennent que du blanc.
 
Pour créer la palette, on a le choix :
- Soit on utilise un éditeur de palette dans lequel on créé le dégradé à la souris, et on sauvegarde ensuite la palette sous forme de fichier include,
- Soit on la calcule directement dans le programme.
 
J'applique cette seconde méthode, en sachant que chaque nuance de rouge, vert ou bleu est codée sur 6 bits, soit 64 nuances possibles par composante.
 
Une fois qu'on a créé notre palette, il faut créer une ou plusieurs lignes en bas de l'écran, qui représenteront le foyer du feu.
Ces lignes sont remplies de pixels choisis aléatoirement.
 
Une fois les lignes du foyer créées (dans mon exemple, j'en créé 3), il va falloir procéder à un petit traitement d'image.
 
En effet, vous aurez remarqué que la structure d'une flamme est douce, qu'on ne distingue aucune transition entre les différentes couleurs.
Pour simuler ceci sur l'écran du PC, on utilise un effet de blur, dont l'explication est donnée ci après :
 
L'effet de floutage, ou blur
Le blur consiste à atténuer la transition entre les différentes couleurs d'une image, afin de la rendre plus douce à l'oeil.
Il existe plusieurs sortes de blur, mais celui que j'utilise est très simple :
 
- on initialise une variable qui représentera la moyenne des couleurs environnantes,
- on se positionne sur un pixel,  
- on ajoute à cette couleur la couleur des pixels environnants,
- on fait la moyenne de la somme de ces couleurs.
 
Ceci est résumé par le shéma suivant : le pixel "1" représente le pixel de référence, celui sur lequel est positionné le pointeur de lecture de l'écran. Pour les autres pixels, chaque nombre représente une couleur :
 


4   4   5
3   1   3
2   2   2


 
On calcule la moyenne des pixels environnants :
 
(4 + 4 + 5 + 3 + 3 + 2 + 2 + 2) = 25
25 / 8 = 3
 
Notre feu sera donc lissé selon cet algorithme en calculant la moyenne de tous les points le représentant. Ceci, ajouté au dégradé créé dans la palette, donnera une transition des plus douces.
 
Il reste à savoir ou positionner la couleur correspondant à la moyenne, ceci est très simple : puisqu'on veut que notre feu monte, on écrit cette valeur sur la ligne au dessus du pixel courant (y-320).
 
Il reste une dernière petite chose. Plus le feu monte, plus il doit foncer, donc plus la couleur doit décroitre (souvenez vous que les couleurs les plus basses dans la palette sont les plus sombres). Ceci est très simple : une fois la moyenne calculée, si cette dernière n'est pas nulle, on lui retranche 1. Ainsi, l'écran donnera l'illusion d'un feu très clair à son foyer, et très sombre à son sommet.
 
En résumé, voici l'algo complet de l'effet de feu :
 
1 - On créé un dégradé adapté aux couleurs naturelles du feu,
2 - On créé en bas de l'écran une ou plusieurs lignes qui représenteront le foyer
3 - Pour chaque point de l'écran à partir du bas, on calcule la moyenne des points environnants
4 - Si cette moyenne n'est pas nulle, on la baisse d'une unité
5 - On écrit la couleur ainsi obtenue une ligne au dessus du pixel courant.
 
La technique
Contrairement à l'effet précédent, l'écriture des points ne sera pas faite directement sur l'écran, mais dans un buffer hors écran. Ceci permet d'augmenter la vitesse du programme, car l'écriture dans la mémoire VGA est bien plus lente que l'écriture en mémoire centrale.
On calculera donc l'effet de feu dans un buffer de même taille que la mémoire vidéo (320 x 200 octets), puis on attend le début du balayage écran. Dés ce balayage entamé, on recopie l'ensemble du buffer dans la mémoire vidéo avec une fonction en assembleur.
Pour éviter d'observer le crépitement en bas de l'écran, assez disgracieux du fait de sa nature aléatoire, on ne recopiera pas les 3 dernières lignes.
 
Un mot sur le source
Le source est largement commenté, et ne devrait pas poser de difficultés.
A noter l'apparition de nouvelles fonctions en assembleur :
 

Code :
  1. void copyToVGA(unsigned char *source, int nbdwords)
  2. {
  3. _asm
  4. {
  5.  cld
  6.  mov ecx,nbdwords
  7.  mov esi,source
  8.  mov edi,screen
  9.  rep movsd
  10. }
  11. }


Comme son nom l'indique, cette fonction se charge de copier le contenu du buffer dans la mémoire vidéo. La variante que je propose ici permet d'indiquer le nombre de double words (=4 octets) qu'on désire copier.  
L'instruction movsd permet de copier le contenu de la zone mémoire pointée par le registre esi (source) dans la zone mémoire pointée par le registre edi (screen). Le registre ecx contient le nombre de double words à copier. Il est nécessaire si on préfixe l'instruction movsd par le préfixe rep
Pourquoi recopier des double words et non des octets ? Car on recopie ainsi 4 pixels à la fois dans la mémoire vidéo.
Le buffer étant constitué d'octets, il faudra penser à diviser ce nombre d'octets par 4 avant de le recopier dans la mémoire vidéo.
 
Autre fonction :

Code :
  1. void initPalette(void)
  2. {
  3. _asm
  4. {
  5.  xor ecx,ecx
  6.  xor eax,eax
  7.  mov dx,03c8h
  8.  mov al,0
  9.  out dx,al
  10.  mov dx,03c9h
  11.  lea esi,palette
  12.  mov cx,768
  13.  rep outsb
  14. }
  15. }


Cette fonction initialise la palette. Les registres 3c8h et 3c9h ont été expliqués dans un article précédent.
Ici, on commence par indiquer dans le registre 3c8h le premier index de couleur qu'on veut modifier (le 0), puis on envoie au registre 3c9h, les 768 octets de la palette (256 x 3) par l'instruction rep outsb, qui suit le même principe que l'instruction rep movsd de la fonction précédente.
 
C'est tout pour cette fois. N'hésitez pas à poser des questions si vous en avez.
 
Prochain article : le Sine Plasma ou plasma sinusoidal. Préparez les aspirines, nous allons rentrer dans le merveilleux monde de la trigonométrie :hello:
 
http://harko.free.fr/hfr/tuto/plasma/plasma.jpg


Message édité par Harkonnen le 06-10-2003 à 23:23:41

---------------
J'ai un string dans l'array (Paris Hilton)
n°532918
antp
Super Administrateur
Champion des excuses bidons
Posté le 06-10-2003 à 23:23:02  profilanswer
 

C'est plus simple que je ne le pensais le truc du feu [:figti]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°532919
chrisbk
-
Posté le 06-10-2003 à 23:25:03  profilanswer
 

antp a écrit :

C'est plus simple que je ne le pensais le truc du feu [:figti]


 
pas mal d'effet sont archis simples :O
harko fait du compliqué, la je dirais :D
 
tu prevois de faire du feedback harko ? :O
pis les metaballs 2D/3D ? :O


Message édité par chrisbk le 06-10-2003 à 23:25:23
n°532920
antp
Super Administrateur
Champion des excuses bidons
Posté le 06-10-2003 à 23:27:13  profilanswer
 

Harkonnen a écrit :


Pour éviter d'observer le crépitement en bas de l'écran, assez disgracieux du fait de sa nature aléatoire, on ne recopiera pas les 3 dernières lignes.
 


 
Dans ton exe y a cet effet bizarre en bas de l'écran justement, non ? :??:


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°532922
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 06-10-2003 à 23:28:25  profilanswer
 

chrisbk a écrit :


harko fait du compliqué, la je dirais :D


bah, j'ai toujours fait comme ça [:sinclaire]
 

chrisbk a écrit :


tu prevois de faire du feedback harko ? :O


c'est à dire :??:
 

chrisbk a écrit :


pis les metaballs 2D/3D ? :O


vi, c'est prévu :)


---------------
J'ai un string dans l'array (Paris Hilton)
n°532925
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 06-10-2003 à 23:31:02  profilanswer
 

antp a écrit :


 
Dans ton exe y a cet effet bizarre en bas de l'écran justement, non ? :??:

non, ça vient pas du foyer, je sais pas d'ou ça vient ce truc :heink:
sinon, ça disparait si tu met à 3 la hauteur du feu dans le #define du début :)
 
edit: si tu veux voir le foyer, remplace cette ligne à la fin du source :
 
copyToVGA(buffer,(320*197)>>2);  
 
par  
 
copyToVGA(buffer,(320*200)>>2);


Message édité par Harkonnen le 06-10-2003 à 23:32:30

---------------
J'ai un string dans l'array (Paris Hilton)
n°532930
antp
Super Administrateur
Champion des excuses bidons
Posté le 06-10-2003 à 23:38:40  profilanswer
 

J'ai pas encore d/l le compilo en fait :whistle:  


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°532931
chrisbk
-
Posté le 06-10-2003 à 23:39:06  profilanswer
 

Harkonnen a écrit :


bah, j'ai toujours fait comme ça [:sinclaire]


 
je veux dire en terme de complexité d'algo :o
 
le premier effet que j'ai fait c'etait
 

Code :
  1. for (int i=0;i<320;i++)
  2. {
  3. for (int j=0;j<200;j++)
  4. {
  5. int x =tableX[i%256][j%256];
  6. int y =tableY[i%256][j%256];
  7. ecran[i][j] = texture[x][y];
  8. }
  9. }


 
et ca tuait tout [:rougit]
 
 

Citation :


c'est à dire :??:


 
quand tu bricole avec l'image precedente
exemple :D
 
dessin :
dessiner oscillo de la musique courante
 
feedback :
etirer le centre de cette image sur tout l'ecran
appliquer blur
goto dessin  
 
(on notera l'absence de clear)
 
resultat : geiss for winamp :D (ouais, enfin, en gros hein ? :D)
 
 
(35 edits pour un post :pfff:)


Message édité par chrisbk le 06-10-2003 à 23:40:28
n°533029
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 07-10-2003 à 09:23:42  profilanswer
 

chrisbk a écrit :


quand tu bricole avec l'image precedente
exemple :D
 
dessin :
dessiner oscillo de la musique courante
 
feedback :
etirer le centre de cette image sur tout l'ecran
appliquer blur
goto dessin  
 
(on notera l'absence de clear)


ok, je vois le truc, c'est une sorte de motion blur avec trainées :)


---------------
J'ai un string dans l'array (Paris Hilton)
n°533034
chrisbk
-
Posté le 07-10-2003 à 09:27:20  profilanswer
 

Harkonnen a écrit :


ok, je vois le truc, c'est une sorte de motion blur avec trainées :)


 
tu peux faire des trucs sympa, tout depend de comment tu fais ton feedback (au lieu d'etirer tu tords par exemple ....)

n°533144
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 07-10-2003 à 12:14:25  profilanswer
 

Chuis en train de coder des copperbarres au boulot, et mon écran est en train d'émettre un drôle de sifflement quand je teste [:meganne]
Les registres du CRTC c'est bon, mangez en :D
Par contre, je suis en train de me demander si cet effet fonctionnera sur les écrans LCD :??:


---------------
J'ai un string dans l'array (Paris Hilton)
n°533149
bjone
Insert booze to continue
Posté le 07-10-2003 à 12:26:35  profilanswer
 

un principe oui, sur un LCD, le flux des pixels à travers le TMDS doit être comparable à celui du RAMDAC (ligne par ligne puis pixel par pixel), donc au niveau logique ça devrait être pareil :??:

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  6  7  8  9  10  11  12  13  14  15

Aller à :
Ajouter une réponse
 

Sujets relatifs
Projet de topic tutorial sur la programmation d'effets graphiquesProgrammation jeux video
cherche cours de programmation[ASM] L'assembleur sur TI82
Newbee en recherche d'un bon bon logiciel de programmationProgrammation graphique : choix d'un toolkit
[Programmation windows en C++] Recherche d'un bon tutorial...la fin des langages de programmation... sous Windows evidemment
cherche pro de la programmation 
Plus de sujets relatifs à : La programmation d'effets de demos old-school (Assembleur + C)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR