1

Zerosquare a souhaité poursuivre une discussion dérivée dans un nouveau sujet. La discussion initiale a eu lieu dans le sujet topics/154076-yarotweet-ou-le-topic-des-pensees-a-la-con/738#post-22126 tandis que la discussion dérivée continue dans le sujet topics/191693-le-raytracing-made-by-godzil où les messages en rapport ont été copiés.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

2

Fait sur ~2 semaines de boulot* sans y être dessus à 100%:

Godzil/DoRayMeGitHubA Quick and dirty Raytracer. Contribute to Godzil/DoRayMe development by creating an account on GitHub.


Du premier rendu:
ch7_test.png

A des choses de plus en plus compliqués:
ch11_reflection.png

ch11_test.png

ch14_test.png

ch16_test.png

christmasball.png

Anti flat earth:
uvmap_earth.png

Et le summum:
uvmap_skybox.png
seulement 2 objets dans la scene grin

* le depot est plus vieux je n'ai pas commencé tout de suis a bosser dessus.
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

3

(Attention, la page 737 augure généralement des projets qui crashent bien fort embarrassed)

Tu définis comment les formes? C’est des vertices style OBJ ?
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

4

Le traytracer a tout une série de primitive :

Sphere, Cube, plans, cone, cylindre et triangle.
Il est capable de charger des fichiers OBJ, je rajouterais le support des fichier STL plus tard, mais aucune des scene la n'utilise de fichier OBJ tout est fait a partir des primitive. Seule la boule de noel utilise de triangle pour les épines du sapin. Tout les autres images sont faites a partir des primitives.

L'image avec un truc qui ressemble vaguement a un dé utilise ce qu'on appelle CSG (Constructive Solid Geometry) ou tu prend des primitives et tu fait des operations entre elles (union, difference, intersection)
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

5

J'allais dire que ça m’étonnerait fort qu'un autel si détaillé ait été dessiné a partir de primitives,... puis j'ai regardé a nouveau pour vérifier... il est temps d'aller dormir.
avatar

6

Godzil > top
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

7

Sinon j'ai oublié de répondre:

Tu définis comment les formes?

Pour l'instant chaque scene a son propre executable, j'ai laissé les deux parties les plus chiantes pour la fin:

- Description des scenes
- Optimisation.

Il y a deja pas mal de choses qui servent à optimiser, j'en ai profité pour découvrir OpenMP, plutôt pratique pour ne pas avoir a se faire chier, mais la un truc en particulier est sous optimisé et rends le tout probablement 2 a 3x plus lent qu'il ne devrait en réalité.


Tiens pour le plaisir des stats pour l'image de la boule de noel (rendu en 800x600)

% time ./tests/christmasball_render
Rendering statistics:
Cones                   : 0
Cubes                   : 0
Cylinders               : 12
Groups                  : 231
Lights                  : 5
Planes                  : 0
Spheres                 : 6
Triangles               : 5280
Smooth Triangles        : 0
OBJ File                : 0
CSG                     : 0
==================================================
Pixel rendered          : 480000
Ray casted              : 813564281
Light Ray casted        : 1723760
Reflection ray casted   : 103703
Refraction ray casted   : 0
Intersect object created: 960276634
Intersection created    : 44913901
Malloc called           : 960276634
Realloc called          : 4644774
Bounding box missed     : 107769254
Min depth atteined      : 18
Max intersect count     : 101
==================================================
./tests/christmasball_render  408,79s user 3,83s system 622% cpu 1:06,28 total
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

8

Quand j'étais petit j'en avais fait un aussi. Il faisait spheres et plans, et j'avais eu la flemme de définir les normales pour des primitives plus complexes.

9

Les primitives tel que cube et triangle sont relativement simple au final, cylindre c'est quasi une sphere, mais pas tout a fait, cone est un peu plus compliqué on est d'accord.

Tout ce qui est pattern, CSG, sont pour l'un juste un changement sur la couleur de la primitive suivant un rituel assez simple, et les CSG sont juste de la suppression d'intersections potentielles suivant un autre rituel plutot simple.

Le plus compliqué a vrai dire est la transparence, enfin non pas la transparence en elle même, mais la réfraction, et la gestion du cas ou la refraction crée une zone d'ombre (le rayon rebondi entre deux couche sans jamais en sortir) et ou dans la realité on se retrouve avec la reflection qui se déclenche (suivant un truc machin couché sur papier par Mr Fresnel lui meme)
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

10

je sais plus si mon truc gérait la transparence.

11

~4 min de rendu sur mon MacBook Pro 2012

rMsy

Rendering statistics:
Cones                   : 0
Cubes                   : 1
Cylinders               : 0
Groups                  : 6230
Lights                  : 3
Planes                  : 0
Spheres                 : 0
Triangles               : 23490
Smooth Triangles        : 23490
OBJ File                : 1
CSG                     : 0
==================================================
Pixel rendered          : 480000
Ray casted              : 9588809784
Light Ray casted        : 2714514
Reflection ray casted   : 684176
Refraction ray casted   : 474342
Intersect object created: 4353032
Intersection created    : 41699064
Malloc called           : 4353032
Realloc called          : 5051195
Bounding box missed     : 136542307
Min depth attained      : 0
Max intersect count     : 28
==================================================

~24K triangles, transparence (meme si ce n'est pas evident, l'indice de refraction est assez élevé) et reflection, et plusieurs sources de lumière, ca fait pas mal de rayon a lancer et d'intersection a tester!

il faut en gros 1 rayon par pixel, puis sur le point d'intersection, 1 rayon par lumières sur la scene.

Si on intersectionne avec une surface qui est marqué comme reflective, on lance un autre rayon et on regarde ce sur quoi on tape, lz tout de manière récursive, parceque il faut après testé les lumières pour le point et la reflectivity du matériaux, etc...

Idem pour la refraction, l'angle est different de celui de la reflection (et va dépendre des difference d'indice de refraction entre le milieu avant l'intersection et celui après l'intersection. Et on fait ca aussi de manière recursive, et on continue soit jusqu'a ce que la pile explose (c'est pas bien sur sur certaines scenes grin) soit jusqu'a une limite de récursion qu'il est forcement recommandé de gardé petit en tout cas tant qu'on est pas sur le rendu final.


A ca on peux ajouter (ce n'est pas le cas sur cette scene) :
- le super sampling ou on lance plus d'un rayon par pixel pour en faire la moyenne
- La gestion de la distance focale, ou idem on va lancer plusieurs rayons par pixels (mais c'est different du super sampling parce que ca change globalement comment la caméra fonctionne) mais donne un rendu plus réaliste ou une partie de la scene est net, le reste flou, comme avec un vrai appareil photo
- Les lumières de "zones" et non ponctuelles comme utilisé dans la scene la: on ne lance pas qu'un seul rayon par lumière mais un nombre plus que certains dépendant de comment la lumière est configuré (plus il y a de point, et plus les ombres sont lissée, moins il y a de point et plus la transition de l'ombre est brutale)


Si on mixe le tout, ca peu faire un gros plein beaucoup de rayon a tester par pixel d'image, sans compter quand un rayon a la malchance de toucher plusieurs objets ca ralentit aussi pas mal le rendu.

Bref..

C'est lent grin

(la je travaille sur de potentielles optimisations, mais certains truc qui consomment le plus ne sont pas forcement très évident à optimiser, genre cette operation d'une matrice de 4x4 par un tuple de 4x1:

return Tuple(b.x * FastGet4(0, 0) + b.y * FastGet4(0, 1) + b.z * FastGet4(0, 2) + b.w * FastGet4(0, 3), b.x * FastGet4(1, 0) + b.y * FastGet4(1, 1) + b.z * FastGet4(1, 2) + b.w * FastGet4(1, 3), b.x * FastGet4(2, 0) + b.y * FastGet4(2, 1) + b.z * FastGet4(2, 2) + b.w * FastGet4(2, 3), b.x * FastGet4(3, 0) + b.y * FastGet4(3, 1) + b.z * FastGet4(3, 2) + b.w * FastGet4(3, 3));
difficile de vraiment optmiser un tel code plus que ce que le compilateur peur faire (gcc et clang semblent utiliser des instructions AVX pour ca) et meme la ca reste un de bout de code qui mange le plus de temps au final parce qu'il est appelé pour quasiment chaque intersection rayon/surface qui a actuellement un impact sur la scene vu que dans le cas le plus basique c'est un point de la surface d'un des objets qu'on veux dessiner;


L'operation est utilisé entre la matrice inverse de transformation d'un objet, et le point a la surface du dit objet.

Pour simplifier grandement les mathématiques d'intersection entre rayon et primitives, elle travaillent toutes dans un espace local et c'est le rayon qui est déformé suivant les transformations que la primitive subit dans la scene pour le rendu finale. Mais comme la primitive donne un point dans son espace, il faut convertir le point vers l'espace de la scene, d'ou la multiplication avec la matrice inverse de transformation du dit objet.

Par exemple faire que cette fonction puisse être inline (et deux autres qui sont beaucoup appelé) permet de gagner ~200s cumulé entre tous les coeurs.

C'est assez impressionnant o_O
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

12

C'est joli ! top

(tu penses qu'on ne te voit pas éditer sournoisement, mmm ? embarrassed)

13

top

Tu as essayé de regarder du côté des intrinsics AVX, pour gagner encore en perfs ?
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

14

Ah, tu as atteint à peu près la vitesse de la Jaguar en 3D 🤓

(Très très cool sinon top c’est marrant ce rendu par contre, pas "shaded" du tout, qui fait un peu pâte à modeler, ou sprite 3D pré-rendu sur Super Nintendo, comment ça se fait ?)
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

15

Faut définir des matériaux plus complexes, il a peut être pas encore eu le tps...

16

Dans le métro y a une mamie qui joue à un manic shooter sur son smartphone. Je salue la jouvence !
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

17

Zero: gcc et clang le font déjà de base avec les option d’optimisation de base (juste -O3, on peux ajouter -march=native pour utiliser le meilleur set pour le CPU courant), c'est assez impressionnant a vrai dire.

Sinon:

Brunni (./22121) :
c’est marrant ce rendu par contre, pas "shaded" du tout, qui fait un peu pâte à modeler, ou sprite 3D pré-rendu sur Super Nintendo, comment ça se fait ?

Il y a plein de facteurs qui rentrent en compte:
1 - tu zoom sur l'image pour voir ca
2 - il n'y a pas de super sampling (ou d'AA) donc quand tu zoom les bord sont super net et ça fait très artificiel. Prend la même image, met la a 100% et éloigne toi de l’écran, tu verras ça change pas mal. Et c'est lié avec le point 1
3 - Les lumières sont des "point light" aka un truc qui n'existe nulle part, un point infiniment petit qui diffuse uniformément de la lumière tout autour.

Prenons cette scène:

ch8_test.png

Comme tu peux voir il y a des ombres, c'est joli, mais leur netteté n'est pas naturelle. Pour ca il faut utiliser un autre type de lumiere comme celles de zones, ou on définie un "rectangle" d'ou la lumiere est diffusé, donc pour chaque point de l'image on va pas lancer un rayon de lumiere, mais 8, 16, 32, 1000 (c'est extrême mais pas non plus déconnant suivant le degré de realisme qu'on veux, mais ca a un prix. ca ralentit le rendu de beaucoup)

Quand on fait ca on peux obtenir ce genre de rendu:

arealight_test.png

C'est deja beaucoup mieux, mais elle reste un peu granuleuse car dans le cas de cette image pour eviter un rendu de 36h, la lumiere n'a que 8x8 zones.

Ce chapitre bonus du bouquin: http://raytracerchallenge.com/bonus/area-light.html donne des exemples de l'effet de la lumiere de zone avec peu de point et beaucoup de points ainsi que les difference de temps de rendu
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

18

Ah oui joli ! Merci pour l’explication !
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

19

Ceci dit il manque un truc tres important pour un rendu realiste, surtout avec des objets transparents:

La caustique

Si il y a untruc qu'un raytracer ne fait pas tel quel c'est ca. Et a vrai dire c'est plutot compliqué a implementer, et tres mauvais en terme de perfs.
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

20

Très intéressant !

Godzil (./17) :
Zero: gcc et clang le font déjà de base avec les option d’optimisation de base (juste -O3, on peux ajouter -march=native pour utiliser le meilleur set pour le CPU courant), c'est assez impressionnant a vrai dire.
Oui, le compilo peut vectoriser ton code automatiquement dans une certaine mesure, mais je pense que tu aurais des perfs encore meilleures en construisant ton algo directement sur la base d'instructions AVX.

bearbecue a été invitée sur ce sujet.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

21

Il utilise deja des instructions AVX grin

Je rigole pas quand je dit ca:

https://godbolt.org/z/TCdV6R

(le -march est justement pour forcer du code non générique)

Je doute franchement de faire du meilleur code que ce qu'il faut la, je n'ai honettement aucune idee de ce que code fait XD
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

22

Oui le compilo utilise AVX, mais je pense qu'on peut faire plus simple...

Pour comparaison (juste pour le nombre d'instructions) :
SSE/AVX matrix multiplyGistSSE/AVX matrix multiply. GitHub Gist: instantly share code, notes, and snippets.


J'ai pas creusé, mais je dirais que soit tes structures de données sont pas optimales pour AVX, soit le compilo n'a pas réussi à optimiser suffisamment.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

23

Regarde les commentaires, ce code est vieux, et les choses on bien changé compilateur-ement parlant,

Certains test plus recent montre que le "code fait main" est dans ce cas moins efficient pour certains cas, ou a peine mieux:

$ g++ -O3 -march=znver1 -o matmult-O3 matmult.cc
$ ./matmult-O3
all ok.
         ref: 14.60 cycles
         SSE: 14.50 cycles
    AVX_4mem: 18.84 cycles
       AVX_8: 17.89 cycles

$ ./test_matrix
all ok.
ref: 18.52 cycles
SSE: 25.33 cycles
AVX_4mem: 22.08 cycles
AVX_8: 20.33 cycles

>g++-9 -O3 -march=native perf.cpp -o bench
>./bench 
all ok.
         ref: 7.72705 cycles
         SSE: 10.37695 cycles
    AVX_4mem: 10.27856 cycles
       AVX_8: 6.47656 cycles
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

24

As-tu essayé avec genlib::raytrace ?

25

c'est le moteur de genlib::raytrace xD
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

26

ma modeste contribution, un projet vieux de 15 ans, fait a Epitech à l'époque
je viens juste de le porter de netbsd/x vers windows/sdl et avec un petit passage a pthread histoire que ça aille plus vite a calculer grin

Antialiasing réglé sur 4, Softshadow activé a 36 samples, 2 niveaux de réflection
Vg9o

(j'ai fait ça parceque je vais bientôt passer d'un i3 a un i5 donc je voulais mesurer le gain de vitesse avec un prog a moi cheeky )

27

C'est joli !
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

28

Oh un rtv1 ! grin

Hum sinon la fonction de multiplication de ta matrice, elle genere du code assez... comment dire... horrible grin
si tu stockes ta matrice transposee, ca va devenir trivial a vectoriser.

Ex:

Et au dela, oui il faut absolument inline ce genre de petites fonctions, apres les optimiser revient surtout a prendre en compte le contexte autour. genre est-ce que les fonctions d'intersection intersectent 1 rayon avec 1 objet? 'n' rayons avec 1 objet?
il y a moyen de reecrire la plupart de ces choses la pour que ca soit beaucoup plus SIMD-friendly si tu intersectes 4 rayons avec 1 triangle, (chaque vecteur 128-bits contient les 4 'x' de chacun des 4 rayons, les 4 'y', les 4 'z', et ca permet generalement de pas mal simplifier les calculs, c'est dans ce genre de cas que tu as de gros gains avec l'auto-vectorisation (et 8 rayons au lieu de 4 si tu utilises AVX)

ca peut aussi etre 1 rayon avec 4 ou 8 triangles.
avatar
HURRRR !

29

Ce n'est pas vraiement transpose, mais plutot changer la facon dont la matrice est stockée. Je n'avais pas pensé a ca tiens!
(oui dans l'absolu ca revien a transposer, mais c'est surtout changer la facon dont les choses sont stocké, pas un appel explicite a transpose)

Je devais etre fatigué ce jour la, et comme ca ne change rien fonctionnelement me suis pas pose la question grin
Je me demande pourquoi j'ai choisis ce sens, c'est l'inverse de ce que je fait d'habitude
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

30

Artemis (./26) :
ma modeste contribution, un projet vieux de 15 ans, fait a Epitech à l'époque
je viens juste de le porter de netbsd/x vers windows/sdl et avec un petit passage a pthread histoire que ça aille plus vite a calculer grin

Antialiasing réglé sur 4, Softshadow activé a 36 samples, 2 niveaux de réflection
Vg9o

(j'ai fait ça parceque je vais bientôt passer d'un i3 a un i5 donc je voulais mesurer le gain de vitesse avec un prog a moi cheeky )

Alors le gain de perfs?
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.