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
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
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.
Coïncidence fort à-propos , je lisais ça hier ^^
@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.
Ca n'est pas sale.
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.
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>
...dsl, la faute à Nooky :/
- 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
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 ?
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.
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?