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

  FORUM HardWare.fr
  Programmation
  C

  Remplir un tableau de nombres flottants avec une certaine valeur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Remplir un tableau de nombres flottants avec une certaine valeur

n°607894
_momone_
Posté le 11-01-2004 à 10:20:38  profilanswer
 

Je suis en train de programmer un visualisateur 3D software et je veux implémenté un ZBuffer Software. J'ai donc un tableau de flottants de dimension élevée (celle de l'écran donc dans mon cas 640*480) et je dois le remplir à chaque frame par une valeur très faible.
Pour l'instant je fais un for et je remplis les cases une par une et on peut pas dire que ce soit une méthode super optimisée!
 
J'ai pensé à utiliser memset mais apparemment ça ne marche que pour les char!
 
Savez-vous comment je pourrais faire?!

mood
Publicité
Posté le 11-01-2004 à 10:20:38  profilanswer
 

n°607904
skelter
Posté le 11-01-2004 à 10:50:07  profilanswer
 

non ca marche pour tout il me semble
 
ton zbuffer tu l'ecris dans la vram?

n°607905
Taz
bisounours-codeur
Posté le 11-01-2004 à 10:52:17  profilanswer
 

non. ça ne marche que pour les char. garde ton for.

n°607908
skelter
Posté le 11-01-2004 à 10:57:53  profilanswer
 

taz ==> j'ai vu des sources qui utilisait memset avec d'autre type que char, en fait ca fait quoi si on utilise autre chose que des char?

n°607911
Taz
bisounours-codeur
Posté le 11-01-2004 à 11:00:22  profilanswer
 

skelter a écrit :

taz ==> j'ai vu des sources qui utilisait memset avec d'autre type que char, en fait ca fait quoi si on utilise autre chose que des char?

ça fait mal. comme memset initialise char par char, pour les types entiers, ça peut servir (genre mettre à 0 leplus souvent).
 
 
mais imagine la tete d'un flottant initialisé à 00.00.00.00

n°607914
skelter
Posté le 11-01-2004 à 11:06:04  profilanswer
 

ok, de toute facon je voi pas en quoi un memset peut servir pour remplir un z-buffer?? vu que ca initialise...

n°607915
Taz
bisounours-codeur
Posté le 11-01-2004 à 11:07:28  profilanswer
 

déroule un peu ta boucle

n°607919
skelter
Posté le 11-01-2004 à 11:23:37  profilanswer
 

zbuffer contien le z de tout les pixel vu, donc dans une scene 3d les valeurs peuvent etre toutes differentes, pourquoi initialiser a chaque frame?

n°607949
_momone_
Posté le 11-01-2004 à 12:30:41  profilanswer
 

L'interet du Zbuffer c'est d'afficher les faces qui sont les plus proches de toi: lorsque tu dessines chaque pixel d'une face, tu compares ca profondeur avec celle du Zbuffer. Si elle est plus élevée, alors tu dessines le pixel et tu stockes la valeur de la nouvelle profondeur dans ton zbuffer.
Si tu laisses les anciennes valeurs à chaque frame, tu vas comparer les profondeurs de la frame précédente avec celle de la frame actuelle et tu obtiendras surement un résultat complètement faux.
Donc, il faut à chaque frame, initialiser le zbuffer à une valeur très faible.
 

Citation :

déroule un peu ta boucle


Euh... je fais ca comment?
 
Et sinon, ya pas moyen de trouver un float négatif très faible de la forme "xx.xx.xx.xx" comme ca je pourrais utiliser memset.

n°607953
skelter
Posté le 11-01-2004 à 12:35:46  profilanswer
 

tu est pas obliger d'initialiser, le premier pixel de coordonée x,y lu initialisera la profondeur en x,y  
 
un float c'est signé et ca commence par un 1 quand c'est negatif donc si t z sont tous positif tu initialise avec un negatif

mood
Publicité
Posté le 11-01-2004 à 12:35:46  profilanswer
 

n°607955
Taz
bisounours-codeur
Posté le 11-01-2004 à 12:37:07  profilanswer
 

pas possible
 
ben
 
for(i=0; i<N; ++i)
{
  truc_sur_i(i);
}
 
->
 
for(i=0; i<N; i+=4)
{
   truc_sur_i(i);
   truc_sur_i(i+1);
   truc_sur_i(i+2);
   truc_sur_i(i+3);
}
 
bon évidemment si c'est un appel de fonction du gagne rien, mais si c'est des affectations, ça peut bien marcher. à toi de voir

n°608103
_momone_
Posté le 11-01-2004 à 16:24:27  profilanswer
 

Ok merci Taz.
Sinon, j'ai remarqué que la plus petite valeur à fournir à memset pour remplir un tableau de floats avec la plus petite valeur possible était 254.
Donc si je fait un memset(MonTableau, 254, sizeof(float) * NOMBRE_DELEMENTS); ca devrait minisialiser tous mes floats à -169473953031737902729750710990328037376.0 ce qui est assez précis pour moi ;)
 
Mais le truc c'est que c'est un peu crade et je sais pas si ça sera portable (à la rigueur je m'en fous pour ce programme mais c'est juste par curiosité: ya pas une histoire de little ou big endian qui intervient dans ce cas?)

n°608116
skelter
Posté le 11-01-2004 à 17:00:26  profilanswer
 

tu es sur que c'est necessaire de l'initialiser?

n°608117
Taz
bisounours-codeur
Posté le 11-01-2004 à 17:01:51  profilanswer
 

quoi 254 ?  
 
et apres ton raisonnement est mauvais, et ça sera pas portable.  
et puis de toute façon t'es fait quoi d'un float pourri comme ça ?

n°608629
LeGreg
Posté le 12-01-2004 à 06:39:39  profilanswer
 

_momone_, un ZBuffer ça ne s'initialise pas, ça se "Clear"
et en général c'est l'appli qui fixe la valeur du ZBuffer. Donc obliger à mettre la valeur à 254 c'est plutot une mauvaise idée.
 
Par ailleurs un float c'est trop et trop peu. La plupart des cartes graphiques se contentent d'un entier sur 16 bits ou 24 bits (plus le stencil) qui représente un nombre entre 0 et 1 à précision fixe.
 
Ne pas avoir de float garantit que si les valeurs de clipping near et far sont bien choisis, l'efficacité du zbuffer en terme de précision est maximale (avec des variantes sur la distribution en terme de distance). Alors qu'un nombre flottant aura un grand nombre de bits qui serviront à représenter des ordres de Z qui ne seront jamais utilisés (notamment négatifs ou très petit proches de zero ou très grands).
 
Pour ce qui est de l'efficacité, tu peux éventuellement réduire le cout en mettant le contenu d'une ou plusieurs valeurs de Z dans un registres MMX et boucler sur la mémoire. De toute façon il y aura toujours une boucle à faire et memset ne fait pas les choses autrement !
 
LeGreg


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Remplir un tableau de nombres flottants avec une certaine valeur

 

Sujets relatifs
Comment récupère t on la valeur de la date système?[PHP/sql] Valeur d'un champs table sql qui change au cours du temps ?
[MySQL] Modifier la valeur de l'AUTO_INCREMENT [résolu]Mettre une frame dans un tableau
[VB] remplir base access à partir d'un tableau excelSQL - Extraire une partie d'une valeur
[DOS] commande 'SET' et les nombres....[PHP/Mysql] enregistrer tableau dans bdd
help tableau en html 
Plus de sujets relatifs à : Remplir un tableau de nombres flottants avec une certaine valeur


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