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

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4  5  6  7  8  9  10
Auteur Sujet :

Article: un raytracer de base en C++

n°1116393
Arghz
death nothing, torture merits
Posté le 11-06-2005 à 00:02:20  profilanswer
 

Reprise du message précédent :
bump mapping:
http://img159.echo.cx/img159/2779/27vf.jpg
 
Lorsqu'on lit une image hdr, les flottant fournit pour rgb sont compris entre 0 et environ 1e32, mais surtout vers 0 ou surtout 1e24 a 1e32
c'est etrange

mood
Publicité
Posté le 11-06-2005 à 00:02:20  profilanswer
 

n°1116414
LeGreg
Posté le 11-06-2005 à 00:16:46  profilanswer
 

Oui c'est vraiment bizarre ton bug, peut-etre une instabilité numérique, une normale qui est partie dans les choux, une variable non initialisée ou un autre bug dans le code.
 
Pour ton problème avec les images HDR, c'est quoi ta source HDR ? Elle est bien au format RGBE ? la fonction rgbe2float n'invente rien, elle ressort ce qu'on a entré.  
 
 
 

n°1116423
Arghz
death nothing, torture merits
Posté le 11-06-2005 à 00:27:15  profilanswer
 

Code :
  1. FILE *f = fopen("c:\\temp\\grace_probe.hdr","rb" );
  2.   Hdr *hdr = new Hdr();
  3.   int image_width = 1000;
  4.   int image_height = 1000;
  5.   hdr->RGBE_ReadHeader(f,&image_width,&image_height,NULL);
  6.   this->image = new float[3*image_width*image_height];
  7.   hdr->RGBE_ReadPixels(f,image,image_width*image_height);
  8.   fclose(f);
  9.   delete hdr;


 
grace probe est une image circulaire
pour calculer le pixels j'utilise d'après la formule sur le site:

Code :
  1. RGBColor CubeMap::ReadCubeMapHdr(Vector3D &rayView) {
  2. const float Pi = 3.1415926545f;
  3. const float Dx = rayView.x;
  4. const float Dy = rayView.y;
  5. const float Dz = rayView.z;
  6. const float r = (1/Pi)*acosf(Dz)/sqrtf(Dx*Dx+Dy*Dy);
  7. float u = Dx*r;
  8. float v = Dy*r;
  9. u = u/2.0f + .5f;
  10. v = v/2.0f + .5f;
  11. const int x = (int)(u*1000.0f);
  12. int y = (int)(v*1000.0f);
  13. y = min(y, 999);
  14. int offset = 3*(x+1000*y);
  15. float rr = image[offset];
  16. float g = image[offset+1];
  17. float b = image[offset+2];
  18. return RGBColor(rr,g,b);
  19. }


 
j'ai codé en dur que l'image fait 1000x1000 pixels

n°1116430
Arghz
death nothing, torture merits
Posté le 11-06-2005 à 00:42:07  profilanswer
 

Ourah j'ai compris pourquoi le bump marchait pas
en perturbant le vecteur normal, il arrive qu'on change le sens du vecteur, style une composante x>0 devient x<0, et ca c'est très mauvais
bon il me reste a trouver comment empecher ce phénomène

n°1116436
LeGreg
Posté le 11-06-2005 à 00:49:26  profilanswer
 

Arghz a écrit :

Ourah j'ai compris pourquoi le bump marchait pas
en perturbant le vecteur normal, il arrive qu'on change le sens du vecteur, style une composante x>0 devient x<0, et ca c'est très mauvais
bon il me reste a trouver comment empecher ce phénomène


 
tu te restreins à des tous petits déplacements.
 
De toute façon si les déplacements sont trop grands l'effet de bump mapping n'est plus du tout plausible.
 

n°1116437
LeGreg
Posté le 11-06-2005 à 00:50:53  profilanswer
 

HDR : Et avec les images que j'avais fourni ça marche mieux ?
 
Malheureusement je ne controle pas tout ce qui se fait sur le web :(

n°1119013
Arghz
death nothing, torture merits
Posté le 14-06-2005 à 00:04:25  profilanswer
 

Pour le moment je m'en sors pas avec le hdr
j'ai repris ta classe, remis data au lieu de couleur (+ compatible avec mon prog), et ca affiche une image absurde
j'ai 3x la meme image en noir et blanc sur le tiers en bas de l'écran

n°1119042
Arghz
death nothing, torture merits
Posté le 14-06-2005 à 01:30:55  profilanswer
 

Par contre une petite explication plus détaillé sur ta méthode pour faire des blob me ferait très plaisir, j'ai vraiment envie d'implementer ca dans mon raytracer :-)

n°1120645
Arghz
death nothing, torture merits
Posté le 15-06-2005 à 12:23:13  profilanswer
 

Wow enfin ca marche ! cubemapping HDR + bumpmapping
Yavais juste un bete bug long a trouver, sorry
J'ai un peu l'impression d etre seul sur ce topic
pourtant ya plein d'infos interessantes (par contre faut s'accrocher!)
Farib a laissé tomber?

n°1122666
LeGreg
Posté le 17-06-2005 à 02:50:45  profilanswer
 

Arghz a écrit :

Wow enfin ca marche ! cubemapping HDR + bumpmapping
Yavais juste un bete bug long a trouver, sorry


 
Heh je m'en doutais ;). Je ne peux commenter que s'il y a un problème  
en rapport avec le code posté ici.
 

Arghz a écrit :

Farib a laissé tomber?


 
Peut-etre qu'il a des exams. Ou alors il a accepté un boulot dans une banque.
 
Sinon presque rien à voir mais en rapport avec la réécriture de mon article
j'ai fait quelques tests de rapidité et j'ai d'étranges disparités suivant
les compilos. Je suis bien d'accord que mon code est pas optimisé
mais il y a un ordre de grandeur entre ce que me sort VC++ (7)
et g++ (3.4.4), genre 22 secondes contre 2 min 30 pour une image assez
simple (ouai on est loin du temps réél hein..).
 
Ou alors c'est g++ qui est bugué ou c'est moi qui sait pas me servir
des outils Gnu (c'est possible vu que je ne l'ai jamais utilisé qu'à l'école
il y a bien longtemps). Ligne de commande classique
-O2/O3 -Wall -pedantic -ansi
 
Le pire c'est que je suis persuadé que G++ (3.2) que j'avais utilisé
au début de cet article n'était pas aussi lent avec les memes options.
Bref..

mood
Publicité
Posté le 17-06-2005 à 02:50:45  profilanswer
 

n°1122668
Dion
Acceuil
Posté le 17-06-2005 à 03:00:04  profilanswer
 

tu as essaye avec gcc4 ?

n°1122670
LeGreg
Posté le 17-06-2005 à 03:10:28  profilanswer
 

Dion a écrit :

tu as essaye avec gcc4 ?


 
il était pas inclu dans la version de Cygwin que j'ai installé, c'est assez
récent non ?
 
J'essaierai quand il sera dispo, ceci dit, je ne m'attends pas à ce genre
de différence meme sans avoir la dernière version.
 
Non je pensais à une option magique qui faisait que c'est lent, genre
je compile en mode debug etc.. Je referai d'autres tests (mais c'est pas ma priorité).

n°1122671
Dion
Acceuil
Posté le 17-06-2005 à 03:12:45  profilanswer
 

Oui il est tres recent
 
 
Non le -O3 c'est toutes les optims dont gcc est capable :D
 
(pas de libefence, de valgrind et autre derriere ?)

n°1123750
Arghz
death nothing, torture merits
Posté le 18-06-2005 à 01:14:59  profilanswer
 

j'aimerais savoir, comment on calcule le rayon refracté a partir du rayon incident? je comprend Snell Descartes, mais je trouve pas l'explication mathématique de:
 

Code :
  1. viewRay.dir += fCosThetaI * vNormal;
  2. viewRay.dir = (fOldRefractionCoef / myContext.fRefractionCoef) * viewRay.dir;
  3. viewRay.dir += (-fCosThetaT) * vNormal;


n°1123758
LeGreg
Posté le 18-06-2005 à 01:41:32  profilanswer
 

imagine toi les deux vecteurs incident et transmis.
le vecteur incident fait un angle ThetaI avec -vNormal. Le vecteur transmis un angle ThetaT avec -vNormal.
 
Ils sont tous dans le meme plan P ce qui simplifie pas mal les choses. Le plan de la surface S est orthogonal à vNormal par définition.  
Le vecteur vI (incident) est décomposable en deux composants l'un parallèle à vNormal et l'autre perpendiculaire à vNormal. De meme pour vT (transmis).  
La partie perpendiculaire de vT et de vI sont colinéaires. le rapport entre leur normes est égale au rapport entre sinThetaT et sinThetaI (tu les mets sur un dessin en 2D tu verras que c'est assez simple, enfin c'est de la trigo..). C'est à dire que c'est le rapport entre les coéfficients de  réfraction selon la formule de Descartes.

n°1123770
Arghz
death nothing, torture merits
Posté le 18-06-2005 à 02:04:53  profilanswer
 

ok j'ai compris, les fcostheta sont en valeur absolue, donc d'abord t'enleve la partie // a vNormal en incident, puis tu utiilse la loi snell descarte pour la partie perpendiculaire restante, enfin tu rajoute la partie // a vNormal en réfracté. Bien vu

n°1123773
Arghz
death nothing, torture merits
Posté le 18-06-2005 à 02:14:46  profilanswer
 

Si n1*sin(theta1)/n2 >1 alors on a un rayon réfléchi, sinon on a un rayon réfléchi et un rayon transmis
dans ce 2e cas, on joue a la roulette russe pour savoir lequel des 2 rayons on va suivre?

n°1140517
Jipege
Top ascenseur !
Posté le 05-07-2005 à 15:19:58  profilanswer
 

[:blueflag]

n°1163863
LeGreg
Posté le 28-07-2005 à 20:15:54  profilanswer
 

Bon petite update, pour appel à contribution.
 
Voici une petite preview du travail que j'ai fait pendant ces derniers mois (oui je suis lent)
http://www.massal.net/article/raytrace/page1.html
 
J'aurais besoin de commentaires sur les explications, clartés des schémas ou sur d'éventuelles fautes d'orthographe (oui fatigue, plus difficultés à se relire).
 
Je suis le même plan que sur le forum mais le code n'est pas le même donc pas forcément la peine de comparer.
 
Il y a cinq épisodes, je verrai pour la mise en page et la navigation plus tard.
 
Merci d'avance.


Message édité par LeGreg le 29-02-2008 à 20:24:02

---------------
voxel terrain render engine | animation mentor
n°1165213
spokup
Posté le 29-07-2005 à 19:16:40  profilanswer
 

bonjour,
 
Je développe également un raytracer open source, je trouve les articles présent ici trés intéressant. Je suis pret a donner mes sources pour les compléter si vous le souhaitez. J'ai développé des classe de model au formats différents 3ds, ms3d , ..  ainsi que des algorithme d'optimisation, octree et arbre binaire.
 
bonne continuation

n°1165374
LeGreg
Posté le 30-07-2005 à 02:25:58  profilanswer
 

salut,
 
Oui si tu veux reprendre des idées évoquées ici n'hésite pas c'est là pour ça. De meme si tu as écrit des articles sur ton raytrace n'hésite pas à mettre un lien ici.
 
De mon coté, je manque un peu de temps pour développer le raytracer donc il restera en l'état (je rajouterai la partie photon mapping sur le site web prochainement et je corrigerai en fonction des commentaires et/ou des envies du moment).
 
Voila. Je pense pas que ça puisse servir de base à un logiciel sérieux mais une intro à différents concepts de la programmation 3D.

n°1166919
retrox
Posté le 01-08-2005 à 15:56:12  profilanswer
 

chrisbk a écrit :

je dirais meme limite devIL qui fait tout. Seulement jcrois que son api est opengl-like, stadire laide


j'avais raté cette perle :D
 
Sinon LeGreg je suis passé tres vite sur ton article, ça a l'air bien :D Pas mal de notions abordées, pas forcément spécifiques au ray-tracing d'ailleurs(forcément pas spécifiques? ;)). Je prendrai le temps de lire et te faire un retour. En tout cas on voit que y a du boulot  :)

n°1168451
LeGreg
Posté le 03-08-2005 à 05:43:04  profilanswer
 

retrox a écrit :

Pas mal de notions abordées, pas forcément spécifiques au ray-tracing d'ailleurs(forcément pas spécifiques? ;)).


 
Merci pour les commentaires.
 
Quant au fait que ce ne soit pas spécifique oui et non ;)
disons que les parties spécifiques au raytracing ne sont pas forcément
les plus intéressantes (et si elles sont trop spécifiques
on ne peut pas les réutiliser par ailleurs).
 
Bon d'ici quelques jours, je posterai la partie sur le photon mapping.
Certaines personnes m'ont déjà fait remarquer que le code manquait
et pour cause: buggé et pas très présentable, ça arrivera en même temps
que l'article.

n°1171559
LeGreg
Posté le 07-08-2005 à 11:13:04  profilanswer
 

Pour ceux qui désespéraient, voici revenu le photon mapping, le source code perdu et les explications qui vont avec.
http://www.massal.net/article/raytrace/page6.html
 
J'en ai profité pour reformater deux trois trucs, corriger des erreurs qui me sont apparues depuis (il en reste..)
 
Vous noterez que j'ai précisé sur la page que c'est le dernier article de la série et vu le temps dont je dispose je ne pense pas en faire d'autre.
 
Voilà, comments welcome comme d'hab.


Message édité par LeGreg le 29-02-2008 à 20:24:16

---------------
voxel terrain render engine | animation mentor
n°1171915
TBone
Pouet.
Posté le 07-08-2005 à 21:47:57  profilanswer
 

LeGreg> joli travail, lecture très intéressante à mille lieues de mes capacités au niveau math, mais très bien expliqué dans les principes :jap:
 
juste un souhait, peux-tu en exporter un PDF afin que cela soit imprimable ?
 
merci pour tout ceux comme moi qui sont intéressés sans avoir le bagage (et le temps nécessaire pour l'apprendre d'abord ;) )


---------------
As the plane took off, the pilot turned to the co-pilot and said, “Have you ever flown solo?” Co-pilot: No. Typically I fly much higher than this.
n°1172016
LeGreg
Posté le 07-08-2005 à 23:26:04  profilanswer
 

bah on verra pour le PDF..
 
C'est pas imprimable là ;) ?

n°1172301
TBone
Pouet.
Posté le 08-08-2005 à 12:35:39  profilanswer
 

j'ai peur que ce soit coupé et surtout que la gestion du passage à la page soit du n'importe nawak. [:joce]


---------------
As the plane took off, the pilot turned to the co-pilot and said, “Have you ever flown solo?” Co-pilot: No. Typically I fly much higher than this.
n°1178107
Jipege
Top ascenseur !
Posté le 17-08-2005 à 17:04:13  profilanswer
 

bravo leGreg pour ton raytracer :)
 
je m'essaie actuellement à l'écriture d'un raytracer en squeak (smalltalk) dans le cadre d'un stage, et je suis assez loin de toutes tes "jolies" images (et tu as aussi un joli cv :)).
 
bonne continuation
 
Jip


---------------
All your Bayes are belong to us !
n°1218963
tbp
Posté le 09-10-2005 à 18:32:45  profilanswer
 

Bon alors une réponse en vrac, parce que ça fait longtemps que je ne suis pas passé par là  :)  
 
Greg: il est anormal que des binaires compilés avec gcc soit plus lent qu'avec msvc7, surtout quand ça concerne les flottants parce que franchement, c'est une [censuré].
 
En 32bits sur des cpu modernes (SSE2+) la hierarchie est du genre ICC > GCC4 > MSCV7.
En 64bits, GCC4 domine sans conteste (enfin j'ai pas re-essayé avec une version non beta d'ICC 9).
 
Il n'y a rien de plus simple que de faire tourner un gcc récent sur cygwin: il suffit d'attraper un snapshot ( ftp://gcc.gnu.org/pub/gcc/snapshots/ ou mirroir) et de le recompiler.
 
Sinon pour ce qui est des articles de Jacco (avec qui j'ai travaillé) sur flipcode, ils n'ont jamais été re-actualisés quand il a implémenté une version cohérente/temps réel.
 
Enfin, et pardonnez moi si je l'ai déjà posté, j'ai bidouillé il y a qques temps de ça un raytracer en 100 affreuses lignes de C++ (sphere flake, antialiasing, ombres etc) qui est malgré tout relativement rapide.
 
http://ompf.org/ray/sphereflake/

n°1226669
LeGreg
Posté le 19-10-2005 à 22:07:15  profilanswer
 

tbp a écrit :

Il n'y a rien de plus simple que de faire tourner un gcc récent sur cygwin: il suffit d'attraper un snapshot ( ftp://gcc.gnu.org/pub/gcc/snapshots/ ou mirroir) et de le recompiler.


 
Ben y'a pas quelqu'un qui a du temps à perdre et qui veut bien le faire ;) ? Ça me permettra de mieux dormir la nuit.
 
Au boulot on est passé à msvc71, on n'utilise pas les profils SSE parce qu'on est censé
tourner sur toutes les machines mais on a quelques routines custom en assembleur (copie formatée
et quelques traitements de données).
Là je développe sur msvc8 (release candidate ?) mais pas pour compiler (peut-etre bientot).
Je crois qu'on avait évalué le compilateur Intel, mais ça posait plus de problèmes pour pas de gain en pratique.
En plus en ce moment j'ai 7 PCs dans mon cube (il n'y en a que cinq en marche) et  
ils tournent tous avec un processeur amd.
 
Sur ICC il y a aussi des trucs marrants :
http://yro.slashdot.org/comments.p [...] d=13042922

n°1227358
tbp
Posté le 20-10-2005 à 18:07:49  profilanswer
 

Oui, j'ai trouvé moi aussi que rapporter des bugs durant la beta d'ICC 9.x 64bit était une perte de temps.
 
Je n'ai que des proc AMD sous la main (opteron notament) et il est clair qu'ICC/Intel met déliberement des batons dans les roues.
Mais c'est assez simple a circonvenir, il suffit d'éviter l'émission de code multiple + selection au run time par le compilo.
 
Les intrinsics sont chaudement recommandées car elles genent bcp moins le compilo que de l'asm inline.
Evidement la portabilité est proche de 0.

n°1368871
damienlann
Posté le 17-05-2006 à 15:39:34  profilanswer
 

Citation :

for (int y = 0; y < myScene.sizey; ++y) {
for (int x = 0 ; x < myScene.sizex; ++x) {
  float red = 0, green = 0, blue = 0;
  for(float fragmentx = x; fragmentx < x + 1.0f; fragmentx += 0.5f)
  for(float fragmenty = y; fragmenty < y + 1.0f; fragmenty += 0.5f)
  {
   // la contribution de chaque rayon est diminuée au quart.
    float coef = 0.25f;
    // on continue les traitements comme si de rien n'était
  }
  // puis on écrit la contribution globale de tous les fragments de pixels dans le frame buffer
}


Alors voila je prend peut etre le coche en retard. Ce qui se ttrouve si dessus c'est pour l'antialiasing (supersampling si j'ai bien compris...).
Ca tourne pas un peu en rond? toutes les variables sont locales. on fait rien de particulier là a part du calcul?

n°1372521
LeGreg
Posté le 22-05-2006 à 20:33:56  profilanswer
 

damienlann a écrit :

Alors voila je prend peut etre le coche en retard. Ce qui se ttrouve si dessus c'est pour l'antialiasing (supersampling si j'ai bien compris...).
Ca tourne pas un peu en rond? toutes les variables sont locales. on fait rien de particulier là a part du calcul?


 
Tu n'as qu'à vérifier le résultat avant et après l'application du supersampling et voir si tu obtiens la même chose ;).


---------------
voxel terrain render engine | animation mentor
n°1419378
geffd
Posté le 04-08-2006 à 07:08:26  profilanswer
 

Bonjour à tous, et un grand merci à LeGreg pour son précieu tutoriel sur le raytracing ;)
 
J'ai moi même commencé un raytracer il y'a 3 ans, mais le manque de temps et le code qui devenait de plus en plus intenable ne me poussa pas à continuer l'aventure plus loin.
 
Un exemple de rendu avec ce raytracer :
 
http://geffd.free.fr/Coding/Ray6.jpg
 
(Il y'a une texture acide calculée via un bruit de perlin)
 
Cet été, j'ai remis ca, mon but était de coder un raytracer objets avec une interface utilisateur sympa, voici quelques écrans :
 
(La plupart des images sont calculées avec une précision de 20% (à cause de mon manque de patience face au calcul des scènes ;) ) donc ca pixellise pas mal, mais ca vous donne une bonne idée ;) )
 
 
Une piscine avec une normale calculée à partir d'un bruit de perlin de type turbulence pour la surface de l'eau
 
http://geffd.free.fr/Coding/Raytracer2006/Ray_Piscine0.jpg
 
Même chose sous un autre angle :
 
http://geffd.free.fr/Coding/Raytracer2006/Ray_Piscine1.JPG
 
J'ai intégré un début de photon mapping, avec la possibilité de voir les "impactes" de photon sur les surfaces dans la représentation du haut :
 
Normalement, dans cette scène la sphère de gauche est réfléchissante et celle de droite réfractante, mais ce qui m'intéressait là était le rendu des caustiques et des ombres, donc j'ai désactivé ces deux options pour avoir un rendu plus rapide
 
http://geffd.free.fr/Coding/Raytracer2006/Raytracer30Photons.JPG
 
http://geffd.free.fr/Coding/Raytracer2006/Raytracer32Photons_Noy20.JPG
 
Le rendu de photon mapping ne me convient pas encore, il faut que je règle la méthode de mélanges des couleurs, car la ca fait encore un peu "playskool"
 
Une jolie sphère transparente avec une texture procédurale pour modifier la normale, avec un peu de photon mapping, le tout calculé par 2 ordinateurs simultanément :
 
http://geffd.free.fr/Coding/Raytracer2006/TransSphere2.png
 
 
Sur cette dernière image, vous pouvez voir une différence entre le haut de l'image et le bas, car je venais d'introduire un principe de 'cluster', qui permet à l'application d'avoir un fonctionnement client / serveur, afin de répartir le calcul d'une scène sur plusieur ordinateurs, chose qui est très appréciable je vous l'assure ;)
 
Donc il suffit de mettre le logiciel en mode serveur ou client dans l'onglet serveur de l'application, et la scène est alors transmise du serveur vers tous les clients indiqués pour etre calculées.
 
Toutes les textures sont passées à travers le réseau, un chiffre déterminée aléatoirement est également transmis pour initialiser le générateur de nombre pseudos aléatoires de la même façon, avec la même séquence, afin d'avoir exactement la même répartition des photons pour tous les PC, c'est justement ce qui causait ce problème de différence de ton entre l'image générée par 2 PC différent : les photons n'étaient pas disperssés exactement de la même façon.
 
Voici le menu Réseau (à améliorer) :
 
http://geffd.free.fr/Coding/Raytracer2006/MenuClusterRaytracer.JPG
 
Voici la liste des propriétés modifiables pour un objet de type sphère :
 
http://geffd.free.fr/Coding/Raytracer2006/ListePropRaytracer.JPG
 
Je vais très certainement intégrer par la suite un éditeur de matériaux, ainsi qu'un importeur de fichiers obj (facettés, que l'on peut exporter via blender par exemple).
Une autre technique intéressante selon moi est l'"ambiant occlusing", généralement utilisée dans les scènes facettées, mais qui a sa palce dans le raytracing également.
 

Code :
  1. Le principe de l'"ambiant occlusing" est simple :
  2. 1 : on lance notre rayon depuis notre caméra vers une direction de la scène
  3. 2 : Ce rayon intersecte un objet
  4. 3 : On lance un nombre de rayon dont la direction est déterminée aléatoirement mais qui ai définie autour du cône qui entoure la normale au point d'intersection de l'objet. Ces rayonss on pour origine le point d'intersection
  5. 5 : On fait une moyenne des longueurs des rayons par rapports au nombre de rayons envoyés, cela nous donne un chiffre qui correspond au fait qu'il y'a plus ou moins d'objets devant le point d'intersection.
  6. Cela peut déterminer des zones d'ombres dans les coins par exemple, ou entre des objets proches.
  7. Pas besoin donc de photon mapping, le cout n'est pas trop important car il faut simplement faire des calculs d'intersection simple (sans notion de réflexion et de transmission).
  8. On peut prendre en considération également la transparence des objets intersecté pour modifier le coefficent de longueur.


 
J'ai implémenté cette technique qui en théorie est plutôt enthousiasmante, mais qui en réalité provoque des tâches horizontales :
 
http://geffd.free.fr/Coding/Raytracer2006/AmbiantOcclusingBug.png
 
voici le bout de code qui détermine cet ambiant occlusing en un point :
 

Code :
  1. //------Calcul de l'ambiant occlusion - Fonction de vecteur aléatoire pas assez uniforme
  2.                 int intNmbRay = 10;
  3.                 int intMaxLength = 35;
  4.                 float fltValue = 0.0f;
  5.                 for (int j = 0; j < intNmbRay; j++)
  6.                 {
  7.                     float fltCos = -1.0f;
  8.                     clsVector vecDir = null;
  9.                     //---L'angle entre le le vecteur normal au point d'intersection et le vecteur aléatoire doit etre inférieur à 85°,
  10.                     while (fltCos < 0.1f)
  11.                     {
  12.                         vecDir = Math3D.GetAleaVector(true);
  13.                         fltCos = Math3D.DotProduct(vecDir, vecNormal);
  14.                     }
  15.                     //---
  16.                     vecDir.Normalize();
  17.                     clsRay objRayOcclusion = new clsRay(objIntersection.ptIntersection, vecDir);
  18.                     //---Calcul les intersection avec les objets
  19.                     foreach (cls3DObject obj3DObject in col3DObjects)
  20.                     {
  21.                         if (obj3DObject.Actif)
  22.                         {
  23.                             obj3DObject.Intersect(objRayOcclusion);
  24.                         }
  25.                     }
  26.                     //---
  27.                     //---Trouve l'intersection la plus proche
  28.                     clsIntersection objInterOcclusion = objRayOcclusion.GetNearestIntersection();
  29.                     //---
  30.                     if (objInterOcclusion != null && objInterOcclusion.intLength < intMaxLength && objInterOcclusion.obj3DObjectIntersected != objCur3DObject)
  31.                         fltValue -= ((float)Math.Sqrt(intMaxLength) / (float)(objInterOcclusion.intLength*2)) / (float)intNmbRay;
  32.                 }
  33.                 fltDiffuseLightValue += fltValue;
  34.                 //------


 
A mon avis, le problème viens du fait que je passe par une fonction aléatoire pour déterminer les vecteurs, voici la formule de la fonction qui retourne un vecteur aléatoire :
 

Code :
  1. public static clsVector GetAleaVector(bool blnAllDirections)
  2.         {
  3.             Random rnd = new Random();
  4.             float fltE1 = (float)rnd.NextDouble();
  5.             float fltE2 = (float)rnd.NextDouble() * 2.0f * (float)Math.PI;
  6.             float fltX = (float)Math.Sqrt(fltE1) * (float)Math.Cos(fltE2);
  7.             float fltY = (float)Math.Sqrt(fltE1) * (float)Math.Sin(fltE2);
  8.             float fltZ = (float)Math.Sqrt(1 - fltE1);
  9.             if (blnAllDirections)
  10.             {
  11.                 float fltE3 = (float)rnd.NextDouble();
  12.                 if (fltE3 > 0.5f)
  13.                     fltZ = -fltZ;
  14.             }
  15.             clsVector vecVector = new clsVector(fltX, fltY, fltZ);
  16.             return vecVector;
  17.         }


 
A mon avis, si j'arrive à distribuer les vecteur d'une manière uniforme le tour sera joué ;)
En distribuant dans le sens d'une spirale par exemple, mais malheureusement, mais notions de maths sont trop élémentaires pour arriver à distribuer ces points dans un plan incliné (perpendiculaire à la normale, donc tangent à la surface au point d'intersection)
 
Voila, j'attends vos idées ;)
 
D'ailleurs j'y pense, ce système peut servir aussi à faire de l'interréflexion (les objets déposent de leur couleur sur les surfaces qui leur sont proches) , et peut etre même des tâches caustiques ;) à réfléchir donc ;)
 
Vous pouvez voir l'ensemble des images rendues pour l'instant ici :
 
http://geffd.free.fr/Coding/Raytracer2006/
 
Je diffuserait très certainement le code source, développé en C# 2.0 via Visual C# Express 2005, donc accessible à tous gratuitement, je ne sais pas si il compile avec mono, mais ca devrait passer je pense, donc très certainement compatible linux également.
Je l'ai exécuté sur une machine n'ayant que le framework .net 3.0, ca fonctionne bien également et même plus vite j'ai l'impression ;)
 
Donc je continue mon chemin et espère bien avoir des images ayant la qualité de celles de LeGreg rapidement ;)
Pour info, il y'a un raytracer bien codé et avec une doc PDF (en Français) très très bonne sur les illuminations indirectes :
 
Picasso Raytracer :  
 
http://membres.lycos.fr/nicoschmit [...] =RayTracer
 
A bientôt tout le monde ;)

n°1419415
_darkalt3_
Proctopathe
Posté le 04-08-2006 à 09:10:42  profilanswer
 

[:drapal]


Message édité par _darkalt3_ le 04-08-2006 à 11:26:23

---------------
Töp of the plöp
n°1431678
Vectteur
Hein ?
Posté le 25-08-2006 à 23:51:50  profilanswer
 

[:drapal]


---------------
ceci est un bloc de texte
n°1431702
LeGreg
Posté le 26-08-2006 à 01:28:27  profilanswer
 

/Rant on
Eh les gars, vous n'etes pas obligé de poster pour mettre un drapeau, hein..
Il y a un bouton en haut à droite qui dit : "activer la notification par email sur ce sujet"..
/Rant off
 
Merci !
LeGreg


---------------
voxel terrain render engine | animation mentor
n°1443689
ArthurDent
Posté le 17-09-2006 à 19:17:46  profilanswer
 

Tout d'abord merci à LeGreg pour ce superbe tutorial.
 
Voilà, je m'interresse plus particulièrement au photon mapping et je me demande si il était envisagable d'avoir un algo de rendu basé uniquement sur le photon mapping?
 
L'écran/oeil devient alors un objet de la scène. On lance les photons depuis les différentes sources de lumières et on ne s'interessent qu'à ceux venant frappé l'écran et on calcule le rendu en ne se basant que sur ces photons.
 
Voilà, est-ce que c'est n'importe quoi ou alors est-ce que c'est réalisable?

n°1443738
TBone
Pouet.
Posté le 17-09-2006 à 20:22:16  profilanswer
 

si je suis bien ce que tu décris, je crois que le raisonnement est incorrect.
 
si tu ne t'intéresses qu'aux rayons frappant ton oeil, tu vas perdre la grande majorité des rayons qui "peignent" la scène de manière générale.
 
imagine une lampe torche à gauche qui frappe une sphère métallique à droite. les seuls rayons qui t'intéresserait seraient ceux qui quittent la lampe, rebondissent sur la sphère et qui arrivent à ton oeil.
 
mais tu perds tous les autres rayons qui vont éclairer le sol, les murs... et pourtant, ils n'arriveront sans doute jamais à ton oeil.  
 
sans compter que tu vas augmenter très fortement le bruit dans ta scène


---------------
As the plane took off, the pilot turned to the co-pilot and said, “Have you ever flown solo?” Co-pilot: No. Typically I fly much higher than this.
n°1443762
ArthurDent
Posté le 17-09-2006 à 20:59:04  profilanswer
 

TBone a écrit :

si je suis bien ce que tu décris, je crois que le raisonnement est incorrect.
 
si tu ne t'intéresses qu'aux rayons frappant ton oeil, tu vas perdre la grande majorité des rayons qui "peignent" la scène de manière générale.
 
imagine une lampe torche à gauche qui frappe une sphère métallique à droite. les seuls rayons qui t'intéresserait seraient ceux qui quittent la lampe, rebondissent sur la sphère et qui arrivent à ton oeil.
 
mais tu perds tous les autres rayons qui vont éclairer le sol, les murs... et pourtant, ils n'arriveront sans doute jamais à ton oeil.  
 
sans compter que tu vas augmenter très fortement le bruit dans ta scène


 
si on voit un point de la scène, c'est qu'un rayon venant de ce point a frappé notre oeil, me trompe-je?

n°1443775
LeGreg
Posté le 17-09-2006 à 21:27:45  profilanswer
 

Update :  
Les articles ont été remis à jours et sont disponibles sur mon site web:
 
premiers pas:
http://www.massal.net/article/raytrace/page1.html
éclairage spéculaire (blinn-phong), post processing et antialiasing:
http://www.massal.net/article/raytrace/page2.html
textures (Perlin noise, cubic environment mapping, bump mapping)
http://www.massal.net/article/raytrace/page3.html
Flou (depth of field), Fresnel, blobs (isosurfaces):
http://www.massal.net/article/raytrace/page4.html
HDR, loi de beer, aberration chromatique:
http://www.massal.net/article/raytrace/page5.html
Global ilumination, photon mapping:
http://www.massal.net/article/raytrace/page6.html  
 
Le code et les commentaires y sont plus récents. Vous pouvez continuer à utiliser ce topic pour les questions
et commentaires.
 
Voilà, si vous voulez l'historique du sujet, vous pouvez continuer à lire la suite.
Fin de l'Update  
 
oui c'est faisable (forward tracing) et l'on pourrait dire que c'est ce qui se passe naturellement dans le monde réel (si l'on simule le déplacement des photons), mais peu intéressant, enfin de mon point de vue.
Bien entendu tout faire depuis le point de vue de l'utilisateur (backward tracing) a ses inconvénients aussi,
le photon mapping est donc un compromis assez efficace entre les deux (en fait la version présentée est
assez rustre, il est possible d'améliorer les choses avec une passe de final gathering).
 
LeGreg

Message cité 1 fois
Message édité par LeGreg le 12-07-2008 à 00:05:51

---------------
voxel terrain render engine | animation mentor
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  6  7  8  9  10

Aller à :
Ajouter une réponse
 

Sujets relatifs
c koi un nombre entier en base octale ou hexadécimale ??Phpbb et base de données
Formulaire de modification d'une base mysqlTransformer/Intégrer un XLS dans une base SQL/mySQL
[PHP] question de base sur la structure du if...then...else ?[SGBD] Base de données sans serveur ?
ResourceBundle basé sur un fichier situé à une url spécifiqueformulaire --> direction email à la place de la base mySQL
Temps de transfert Base Access ...SQL serveurplacé un element sous plusieurs catégorie dans une base de donnéés
Plus de sujets relatifs à : Article: un raytracer de base en C++


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