MMMmmmmmmmhhhmmmmmmhmm.....Warning: This blog has no brain; Use your own. (le blog de skaven)
Retour au blog <<

Nextgen Rendering

Mercredi 17 septembre 2008 à 10 h 12
Actuellement, nos cartes graphiques sont des rasterizers.
Cette technique existe depuis à peu près 25 ans. Popularisée par SGI et Opengl, reprise par DirectX et 99% des API de rendu.
La rasterization consiste à prendre un lot de triangles et pour chacun, les dessiner de haut en bas (raster) dans l'ordre auxquels ils arrivent au rasterizer.
Ca induit des problèmes (tri de faces transparentes, overdraw,...) Et ça en simplifie plein.
Depuis 25 ans, ça marche comme ça. La seule petite révolution est le passage du pipe fixe en pipe programmable. C'est juste palliatif à un manque de liberté.
Si on veut rendre une sphère parfaite, on doit la trianguler. Après avec les shaders et une normal map, on peut lisser le lighting pour que la lumière surface de la sphère soit cohérente.
Mais les bords resteront droits.

Alors, que proposent larrabee et consœurs?
Dans le principe, c'est super simple.
Actuellement, nos objets sont constitués de triangles, le rasterizer les convertit en pixel.
Dans le futur, nos objets seront ce que l'ont veut. C'est nous qui déciderons de comment les rendre.
La rasterization devient un sous-ensemble.
C'est d'ailleurs très important puisqu'on ne peut pas passer directement d'une solution à l'autre d'un point de vue économique.
La transition se fera comme pour les shaders.

Concrètement, ça veut dire quoi?
Et bien, on va pouvoir coder nos propres routines de rendu (puisqu'au final, c'est toujours des pixels qu'on calcule).
Rendu par raycasting, voxel, nurbs,....tout ce que tu veux.
C'est un peu comme si tu devais faire un renderer au CPU. On retourne à la belle époque du démomaking du début des années 90.
Tant que c'est parallélisable, ce sera super.

Quand est-ce qu'on commence?
Maintenant et pas maintenant :D
Si tu es codeur, tu peux t'amuser à faire un raycaster avec CUDA. Ou du rendu de nurbs...ou du voxel....
Le principal est d'orienter ses algos pour qu'ils soient le plus parallélisables possible.
Si tu es graphiste, continue avec zbrush, modo,...c'est à mon avis le seul maillon de la chaîne de production qui ne va pas trop bouger

La chaîne de production?
Si les données à rendre changent, la chaîne de production va changer aussi.
Dans quelques années, les concepts de triangles, textures,...risquent de disparaitre.
Le concept même de géométrie risque de disparaitre au profit de concept de volume/matière.
Tout ça va prendre du temps. Je pense 10 ans pour passer totalement de l'un à l'autre et 10 de plus pour être bien stable et que cette hightech devienne courante.
Ça se fera progressivement. Par exemple un algo de terrain rajouté dans un moteur existant. Un peu comme Carmack qui itère sa technologie en rajoutant une grosse technique tous les 2/3ans.

Far west?
Ça risque de l'être un peu pendant un moment. Il va falloir refaire un paquet de renderer et des choses comme le skinning vont changer mais je n'ai aucune idée de quelle tête ça va avoir.
Il y aura sans doute autant de techniques de prod/rendu que de moteur 3D.
Ça va être l'effervescence après des années de stabilité (depuis la sortie de DX9 en fait).

En fait, inutil d'aller plus loin que de la recherche tant qu'il n'y a pas d'API normalisée qui marche chez les différents constructeurs. Ou au moins des specs.

En fait, le 1er hardware ayant cette philosophie est la PlayStation3.
Jusque peu de temps avant sa sortie, la PS3 n'avait pas de chip de rasterization(le RSX, le chip fait par nVidia). Les développeurs ont commencé à gueuler et Sony s'est ravisé.
Pour faire du rendu sur les 1ers draft de PS3, il fallait utiliser les SPU. Les SPU sont des unités du CELL qui ne font pas grand chose mais qui vont très très vite.
C'est surtout la gestion mémoire qui fait chier dessus (cf d'autres billets que j'ai fait).
Bref. Recoder un renderer from scratch en laissant tomber 80% des algos que l'industrie maitrise (shadows, triangulation...) est une chose. Il aurait sans doute fallut modifier un paquet de choses dans la chaine de production aussi. Et la, les développeurs ne le veulent pas.


Prenons l'exemple d'un algo qui passerait bien sur larrabee, PS3SPU, CUDA,... : Le Tile rendering.
C'est une technique assez vieille popularisée sur certains chip PowerVR (dreamcast, Hercules Kyro).
- On découpe l'image en petits carrés (8x8 ou 16x16pixels).
- Pour chaque carré, on regarde par un frustum culling les objets qui sont visibles dans ces petites fenêtres.
- On trie pour chaque carré les objets du plus proche au plus lointain.
- Pour chaque carré, on fait le rendu (raycast).
- Pour un carré, on arrête de piocher dans la liste des objets quand le carré est rempli (ou qu'une autre condition se vérifie)
On pourrait imaginer un CPU/GPU derrière chaque petit carré puisque cet algo est très bien parallélisable.
Dans notre exemple, l'objet à rendre est à prendre au sens large. Ca peut être une collection de triangles, de nurbs, du voxel,...

Aujourd'hui, j'écoute ca: Digitalism - Pogo
Mercredi 17 septembre 2008 à 10 h 30
Ca c'est du coté du code pure et du rendu. Penses-tu que ça peut changer fondamentalement les autres éléments de la création, comme l'éditeur par exemple ?

par exemple, les concepts de texture et celui de triangle vont disparaitre. Dans mon éditeur, tout ce que je manipule est soit du triangle soit de la textures. Tout le processus de level design actuel revient à créer des millions de triangles et à mapper des tonnes de textures par dessus. Par quoi penses-tu qu'on pourrait remplacer ce fonctionnement, si on en passe par là. Le jour où l'on va dépasser cet stade de rendu, nul doute que la technologie du level designer devra aussi évoluer pour permettre d'utiliser pleinement tout ce bordel, sinon on va se retrouver au même niveau que les créateurs de Voxelstein : Créer un niveau normal avec un éditeur traditionnel, et le voir renduc omplètement différent par le moteur.
Mercredi 17 septembre 2008 à 10 h 49
Twilight of the GPU: an epic interview with Tim Sweeney
Coïncidence fort à-propos , je lisais ça hier ^^
par Goeple
Mercredi 17 septembre 2008 à 10 h 51
Woot ! Un article qui parle de technique que j'ai reussi à comprendre ! Ca c'est l'avenir...
@jeanjeanlebanni
par skaven
Mercredi 17 septembre 2008 à 11 h 14
Je l'ai lu aussi. Ca m'a fait comprendre pas mal de trucs. Et j'ai donc essayé de synthétiser dans ce billet. Je n'avais rien compris d'après les reports de Carmack.

@Hellkeeper:
C'est déjà plus ou moins le cas dans certains editeur de levels actuels. Tu crée des murs et des sols. Et pas des triangles.
On pourrai imaginer que dans le futur, quand tu crée une pièce, tu crées 4 volumes de matière (par matière, j'entends propriétées physiques et de rendu) et non 4 boites.
par Nooky
Mercredi 17 septembre 2008 à 11 h 54
"frustum culling"

Ca n'est pas sale.
par KaKeK.
Mercredi 17 septembre 2008 à 12 h 20
Quand jai lu ces deux mots barbares accolés, j'ai eu un peut peur que ca tourne en Carmack-style.

Mais en fait non, le billet est trés agréable a lire. Il a la qualité des bon écrits de vulgarisation : a la fin, on a l'impression d'avoir compris un truc compliqué, même si on sait qu'une grande partie de ce qui le rend complexe est passé sous silence, et du ocup on se sent intelligent.
par REALIZE
Mercredi 17 septembre 2008 à 12 h 23
C'est justement à quoi je pensais en cours de philo hier, pourquoi on utilise que des triangles, et c'est quand que ça changera. Merci pour l'article :)
par -V-
Mercredi 17 septembre 2008 à 15 h 25
Coïncidence fort à-propos, j'étais à sa conf la semaine passée (CEDEC).
Moi il y a deux aspects qui m'intéressent: la diversité que ça peut amener dans le rendu temps réel, et au delà, l'énergie nécessaire à l'adoption des nouvelles tech dans les prochaines années. Voir à quel point un pipeline et un moteur sont complètement restreints à une technique, je ça trouve carrément dément. </me happy>
@-V-
par skaven
Mercredi 17 septembre 2008 à 16 h 49
Tu as essayé de faire des trucs avec CUDA?
par divide
Mercredi 17 septembre 2008 à 16 h 56
genre... le frustrum culler ?


...dsl, la faute à Nooky :/
Mercredi 17 septembre 2008 à 20 h 03
C'est tout de même compréhensible pour la PS3. Pour supporter les outils et faciliter le développement dans son état actuel, autre chose qu'une rasterization HW me parrait difficile dans le concret. Mais c'est marrant, c'est plutôt dans les esprits en ce moment de se passer du système actuel, cf discussion avec un collège quelque semaines en arrière sur le rendu avec uniquement des propriétés, voir du fréquentiel.
par LeGreg
Mercredi 17 septembre 2008 à 20 h 27
The 90s just called..
Mercredi 17 septembre 2008 à 20 h 54
Oui, et je pense qu'on risque d'être désagréablement surpris par le peu de personne sachant faire ça en """soft""".
@OctoBinz
par skaven
Mercredi 17 septembre 2008 à 21 h 33
Pas si sur pour ces différentes raisons:
- Il va y avoir une couche d'émulation de rasterization qui va rester active au moins 5ans
- De toute cette liberté software, il va y avoir une ou deux technos qui sortir du lot. De la, ca deviendra 1 standard et donc maitrisée par plus de monde.
- Actuellement, bien coder un GPU (batching, parralélisation, bons algos,...) n'est pas à la portée de tout le monde
@Realize
Jeudi 18 septembre 2008 à 00 h 28
Pourquoi on utilise des triangles ? C'est très simple : c'est la figure géométrique la plus simple qui soit, donc la plus facile à calculer. De plus, prend une face carré, et déplace un de ses sommets. Si tu le bouge de manière à ce qu'il ne soit plus dans le même plan que les autres sommets, le moteur va péter un plomb parce qu'il cherche une face plate qui ne peut pas être plate. Avec trois points, tu as forcément un plan parfaitement droit, raison pour laquelle les moteurs subdivisent toutes les faces de ce qu'ils affichent en triangles (quand les objets ne sont pas carrément importés sous forme triangulées, comme les static-mesh de Unreal).

Skaven>> Tu parles des éditeurs de quel genre ? Dans Radiant par exemple, tu ne manipulepas directement du BSP, mais une représentation abstraite de ce qui, une fois compilé, sera le BSP (les maudits fichiers .map et les milliers de trucs qui en sortent au moment de la compilation. Dans UnrealEd, tu manipule des brush non triangulés qui ne seront découpés que lorsque le moteur les chargera en mode jeu après avoir buildé la map (ce qui permet de faire halluciner le moteur en recoupant des brush jusqu'à ce qu'il considère l'éxterieur du monde comme l'interieur etinversement. Très drole, et puis ça plante).
Ou alors tu parles carrément d'un éditeur de type non BSP, façon Maya, 3DS max ou autres, qui utilisent des principes purement géométriques et pas l'idée de BSP. Des maps en mods NURBS, ce genre de chose ?

Pour réagir ce que dit Sweeney, l'un des rares types qui puisse parler avec Carmack en disant "tu" et en échangeant des astuces, sur les incorporations de ce genre de truc sur le processeur et le grand retour du mode software sans accélération matérielle (un type quand même foutrement intelligent et bon malgré la nullité des derniers jeux utilisant son moteur... Un vrai Carmack bis donc), Comme il le dit, Unreal 1 c'est vraiment un des tout derniers jeux qui se consacrait pleinement au rendu software. Après, on a dérivé vers DirectX, OpenGL etc...
Les processeurs actuels doivent déjà être bien assez puissant pour faire tourner à une vitesse plus que décente la plupart des jeux jusqu'à disont, fin 2001/début 2002. Ce serait surement assez révolutionnaire d'avoir une architecture qui ferait tourner le tout de manière optimisée sur de nouveaux processeurs, sans compter qu'un CPU actuel pédale allègrement plus vite qu'un GPU.

Un architecture hybride qui ferait tourner un coeur de la même manière qu'un CPU et un autre comme un GPU ne signerait-il pas la fin des cartes graphiques ? Est-ce possible d'ailleurs ? Vu mes pauvres connaissances en micro-électronique, je n'ai aucune idée de la faisabilité de ce genre de truc. Est-ce qu'on peut donc faire accomplir des instructions fondamentalement différentes par deux coeurs (au besoin en passant par une émulation GPU sur le coeur graphique) ? Et est-ce que ce serait viable en terme de performances ?
par -V-
Jeudi 18 septembre 2008 à 04 h 01
@skaven
CUDA j'ai pas encore touché, par faute de temps c'est resté sur ma todo_list, noyé au milieu d'innombrables autres trucs. Sinon je bosse plutôt sur les tools en ce moment.
@Hellkeeper
par skaven
Jeudi 18 septembre 2008 à 09 h 29
"sans compter qu'un CPU actuel pédale allègrement plus vite qu'un GPU. "
C'est pas vrai pour tout. tu as compté le nombre de multiplications matricielles qu'un CPU et un GPU peuvent faire en 1 seconde?
Jeudi 18 septembre 2008 à 12 h 13
Pas testé non plus CUDA, mais juste regardé les samples. Eh ben putain....
Hellkeeper
par channie
Vendredi 19 septembre 2008 à 12 h 39
Les éditeurs de levels ne devraient pas trop changer dans la représentation visuelle de tes brushes. Le compilo par contre changera (il ne sortira plus du BSP mais autre chose). C'est le plus simple imho :)
Toutes les personnes enregistrées peuvent poster un commentaire dans ce blog.

Commenter

Tags autorisés : [b] [/b], [i] [/i], [u] [/u], [code] [/code], [img]Adresse d'une image[/img], [url=Adresse d'un site web] [/url]
Vous pouvez aligner vos images à droite ou à gauche en modifiant le tag [img] comme ceci : [img right] ou [img left].

Pour vos vidéos/animations flash : [video]Adresse d'une animation[/video], pour préciser la largeur et hauteur : [video width=100 height=200]...[/video]