Remplir un tableau de nombres flottants avec une certaine valeur

Remplir un tableau de nombres flottants avec une certaine valeur - C - Programmation

Marsh Posté le 11-01-2004 à 10:20:38    

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?!

Reply

Marsh Posté le 11-01-2004 à 10:20:38   

Reply

Marsh Posté le 11-01-2004 à 10:50:07    

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

Reply

Marsh Posté le 11-01-2004 à 10:52:17    

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

Reply

Marsh Posté le 11-01-2004 à 10:57:53    

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?

Reply

Marsh Posté le 11-01-2004 à 11:00:22    

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

Reply

Marsh Posté le 11-01-2004 à 11:06:04    

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

Reply

Marsh Posté le 11-01-2004 à 11:07:28    

déroule un peu ta boucle

Reply

Marsh Posté le 11-01-2004 à 11:23:37    

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?

Reply

Marsh Posté le 11-01-2004 à 12:30:41    

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.

Reply

Marsh Posté le 11-01-2004 à 12:35:46    

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

Reply

Marsh Posté le 11-01-2004 à 12:35:46   

Reply

Marsh Posté le 11-01-2004 à 12:37:07    

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

Reply

Marsh Posté le 11-01-2004 à 16:24:27    

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?)

Reply

Marsh Posté le 11-01-2004 à 17:00:26    

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

Reply

Marsh Posté le 11-01-2004 à 17:01:51    

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 ?

Reply

Marsh Posté le 12-01-2004 à 06:39:39    

_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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed