Vous allez en connaître un rayon

Il est faux de dire qu’on peut remplacer le Z-buffer par un tri des polygones. Ca marcherait très partiellement. Pour dire qu’un polygone n’est pas visible du tout, il faut déjà en être certain, il ne suffit pas de dire qu’il est derrière, il peut être décalé à gauche par rapport à un autre polygone, il aura être plus loin que celui ci, il sera visible (mais des méthodes existent et sont utilisées, mais c’est surtout qu’un polygone dans le cas du rendu n’a qu’une face, alors déjà si le polygone est pas tourné du bon coté, c’est qu’à priori il est caché par les autres polygones du même objet). Ensuite il y a tous les polygones partiellements visibles, et ceux là, à part le Z-buffer, y’a pas vraiment de solution miracle (redécouper le polygone en fonction des polygones qui sont devant, ouhlala, bonjour les calculs).

Ensuite; je pense sincèrement que le glas de la bidouille commence à sonner, laissant place au gaspillage de ressources (oui parceque toutes ces bidouilles n’ont qu’un but, faire pas trop moche très très vite).
Java a le vent en poupe, .Net est à la fête. Tout cela suit la même logique (on essaye de faire propre, même si ça coute un peu de puissance)

La même sanction va probablement toucher dans le futur proche (5 ans disons) les applications graphiques grand public.
On nous sort des cartes avec de plus en plus de techniques bidouillées dans le seul but de s’approcher d’un rendu réaliste. Il arrive cependant un moment où le niveau de détail demandé remet en cause les anciennes bidouilles. Aujourd’hui un rétroviseur dans un jeu, c’est un “trou” dans l’affichage où la vue d’une caméra qui regarde derrière est déssiné, mais si on donner la sensation d’être bousculé dans la voiture, ça devient plus difficile à faire (une bidouille de plus). Le nombre de bidouilles à supporter devient au bout d’un moment tellement grand qu’il faut des processeurs très gros avec des conditions et des branchements logiques de partout.
Aujourd’hui on veut voir le grain de peau, des cheveux, des poils, des vetements froisés, des ombres réalistes, des réflexions, etc.

Bien sur on peut continuer à grossir les processeurs (méthode éprouvée par Intel jusqu’ici, vas-y que j’te rajoute du jeu d’instructions), ou alors on revient à du tout petit processeur qui ne sait faire que quelques opérations mais qui sait les faire super vite et à partir desquels on peut tout faire (les RISC). Un des avantages du raytracing, en plus, c’est que le calcul de chaque pixel est totalement indépendant, on peut donc faire tout en parallèle.
Comme je l’ai dit, pour faire du raytracing, basiquement, on a besoin principalement d’accélerer le calcul de l’intersection et de la normale de quelques surfaces bien connues (triangle, cercle, sphere, nurbs,…), et aussi de quelques fonctions sur le traitement des couleurs. Il me semble que cela suffit, non ? Le reste (que faire du résultat de l’intersection) étant du resort d’un autre processeur plus générique pour gérer le bumpmapping, faire des effets de lumières un peu zarbi pour donner du style, etc etc
Une autre partie de ce processeur à instructions réduites peut être consacré au calcul de caustiques, radiance, etc.

L’idée est très séduisante, mais que je sache les RISC n’ont toujours pas la belle vie dans le marché grand public pour les processeurs centraux… et je doute que cela arrive un jour pour les processeurs graphiques (à moins qu’un grand du marché s’y mette).
En revanche, je me refuse à pronostiquer le succes d’une telle puce dans le monde professionnel.

Heu, je crois qu’il y’a méconnaissance du raytracing, pasque je lis des trucs bizares, ou alors, on se comprends mal mais…

[quote=« gring, post:40, topic: 30269 »]Je vois ce que tu veux dire… Effectivement, une scène avec des réflexions de réflexions, ça finit par devenir un véritable labyrinthe…

Mais si tu y réfléchis bien, la technique du Z-buffer existe parce qu’il est plus rentable de redessiner plusieurs fois un pixel plutôt que de trier les polygones en fonction de leur distance par rapport à un point.

Or, le raytracing, c’est du calcul d’intersection entre chaque rayon et le premier polygone qu’il croise. Du coup, le tri des polygones est obligatoire à chaque réflexion (et il faut mettre en place des optimisations ou l’on découpe l’espace à la truelle pour diminuer le nombre de polygones à trier, en fonction de l’endroit d’ou part le rayon). Quand un matériau est réfléchissant, le nombre de rayons à lancer est faible parce que les rayons qui ont beaucoup d’influence sont regroupés autour du rayon de Snell Descartes. Pour un matériau mate, l’angle dans lequel il faut lancer des rayons est beaucoup plus important…[/quote]
Tu a raison de dire que le Z-Buffer est plus rentable… actuelement :
Le raytracing, c’est effectivement basé sur la recherche de la surface la plus proche en intersection avec le rayon. Sauf que le tri des polygones et loin d’être la meilleur facon de trouver le plus proche.

On va utiliser un parcours de structure organisée (généralement un arbre binaire, mais pas forcément) pour chercher « au bon endroit ». La structure n’a besoin d’être réorganisée qu’a chaque mouvement (et encore, pas completement), et, structurée de manière spaciale, on découpe facilement le travail. Au final, la recherche de la surface est au max en O(log(poly)). Et un groupe complexe peux être groupé dans une bounding box pour simplifier (si pas d’intersection avec la bounding box, pas besoin de chercher dedans).

Autre chose : sur les surfaces mattes, on lance généralement qu’un rayon vers chaque source lumineuse. Si on veux un réalisme sur la lumière, on va plutot utiliser des mécanismes de radiosité (ou de photonmapping).

On viens donc de voir qu’il n’y a pas de tri des polys…

[quote]Tu as donc effectivement raison, dans certains cas, le raytracing n’est pas beaucoup moins rentable… Dans une scène ou on a de gros objets convexes et courbes, les algos de type z-buffer sont beaucoup plus efficaces parce qu’il y a beaucoup de polygones pour peu de surfaces cachées, alors que dans le cas ou il y a plein de petits objets brillants qui gesticulent dans tous les sens (genre une nuée de criquets en métal), le ratio surfaces cachées/nombre de polygones rend le raytracing plus séduisant.
(en gros, plus le chemin des rayons est chaotique et disjoint, plus il est rentable de les calculer individuellement plutôt que de créer des environnement maps)

Alors, effectivement, d’un point de vue humain, le raytracing est plus attirant, dans le sens où un moteur de raytracing suit quelques règles physiques simples, qu’il est compact et plus lisible, alors qu’un moteur temps réel comme on les fait aujourd’hui est un immense dédale de bidouilles adaptées à chaque cas particulier, moins lisibles mais plus rapides à éxecuter…[/quote]

Le problème est pas tout a fait là. Disons surtout que ce n’est pas du tout le même genre de calculs. Le rendu en ZBuffer est très linéaire dans le traitement des données, et peux s’effectuer en traitement de flots de données en parallèle (SIMD). Que ca soit la partie géométrique ou la rasterisation : tu fouts tes polygones d’un coté et les pixels arrivent dans les buffers en sortie. Les algos de raytracing actuels sont souvent récursifs (avec une pile, donc), avec pas mal de branchements conditionnels (cars prévus pour tourner sur des processeurs très génériques).

Merci pour vos réponses, c’est très instructif…

C’est pourtant ce qui était fait avant l’avènement des cartes 3D… on regroupait les triangles en objets plus ou moins convexes, on les triait en fonction de leur position sur l’axe Z, et on les dessinait à partir du fond en priant pour qu’il n’y ait pas de collision…

[quote=« urdle, post:41, topic: 30269 »]Ensuite; je pense sincèrement que le glas de la bidouille commence à sonner, laissant place au gaspillage de ressources (oui parceque toutes ces bidouilles n’ont qu’un but, faire pas trop moche très très vite).
Java a le vent en poupe, .Net est à la fête. Tout cela suit la même logique (on essaye de faire propre, même si ça coute un peu de puissance)

La même sanction va probablement toucher dans le futur proche (5 ans disons) les applications graphiques grand public.[/quote]

J’aime bien ton analyse. C’est très vrai pour tout ce qui est bureautique, vu la puissance des ordis aujourd’hui…

D’après ce que j’ai compris, depuis Quake 1, les moteurs graphiques d’intérieurs marchent par « portails », à savoir que le monde est divisé en pièces séparées par des portes. La pièce où se trouve la caméra est intersectée avec le frustrum de l’écran pour sélectionner les triangles à afficher. Ensuite, on découpe les parties des autres pièces qui sont visibles au travers des portes en les intersectant avec les frustrums générés par la caméra et par les portes. Finalement, les « portails » que l’on peut voir dans Prey (ou même dans les Serious Sam), et le cas du rétroviseur ne sont pas tellement différents…

Les processeurs que l’on a aujourd’hui sont microcodés (du moins les Intel, et j’imagine que les AMD aussi), c’est à dire qu’ils présentent un très grand jeu d’instructions complexes, mais en réalité, ils ont une structure RISC en interne, c’est à dire qu’une instruction complexe va être divisée en plein de petites instructions élémentaires qui seront exécutées sur plusieurs cycles. Du coup, c’est pas mal, on a le beurre et l’argent du beurre, on n’encombre pas le bus mémoire avec plein de petites instructions RISC…

[quote=« urdle, post:41, topic: 30269 »]Comme je l’ai dit, pour faire du raytracing, basiquement, on a besoin principalement d’accélerer le calcul de l’intersection et de la normale de quelques surfaces bien connues (triangle, cercle, sphere, nurbs,…), et aussi de quelques fonctions sur le traitement des couleurs. Il me semble que cela suffit, non ? Le reste (que faire du résultat de l’intersection) étant du resort d’un autre processeur plus générique pour gérer le bumpmapping, faire des effets de lumières un peu zarbi pour donner du style, etc etc
Une autre partie de ce processeur à instructions réduites peut être consacré au calcul de caustiques, radiance, etc.[/quote]

C’est déja ce que font les cartes 3D non? Une fois que chaque triangle a été projeté dans l’espace 2D de l’écran, il faut bien savoir à quel endroit sur la texture correspond chaque pixel et par conséquent calculer l’intersection entre le rayon issu de l’écran et le triangle 3D…

C’est très intéressant, j’imagine que les moteurs de raytracing doivent diviser l’espace en un arbre de bounding boxes imbriquées les unes dans les autres… comme les moteurs physiques non? ça voudrait dire que les circuits dédiés raytracing auraient bcp de choses en commun avec ceux des cartes physiques…

L’idée que j’avais en tête, c’est l’ombre d’une plante avec des centaines de feuilles sur une surface mate… là, impossible de ne se satisfaire que de quelques rayons… ( Je ne connaissais pas la technique de photonmapping, c’est hyper intéressant pour le temps réel. Mettre au point des photonmapping déformables pour suivre les mouvements de la plante, ça ferait un super sujet de thèse)

Effectivement, c’est très optimisable. Faut quand même trier les bounding boxes, et les polygones des objets complexes quand on les traverse… Dans le cas de la plante, j’imagine des bounding boxes autour des grosses branches et des sous branches, pour finir avec des grappes de feuilles…

En tous cas, merci de m’instruire B)

Bonjour. B)
Afin de convaicre les septiques du rendu RTRT, comparé aux rendus OGL ou D3D, il serait profitable de tester différents moteurs 3D rendant la même scène, pour comparer. On verrait que la qualité de la lumière est du coté du RTRT, mais que la vitesse et la résolution du coté de l’accérération matérielle.
Mon opinion est que les jeux auront 2 rendus possibles, à choisir. B)