"POV-Ray rendra-t-il plus vite si j'achète la dernière et la plus rapide carte vidéo 3D ?"
Non.
Les cartes 3D ne sont pas faites pour le raytracing. Elles lisent les maillages de polygônes et les rendent. Cela n'a rien à voir, ou très peu, avec le raytracing. Les cartes 3D ne peuvent pas calculer les caractéristiques typiques du raytracing comme les réflexions, etc. Les algorythmes utilisés dans les cartes 3D n'ont rien à voir avec le raytracing.
Cela signifie que vous ne pouvez pas utiliser une carte 3D pour accélérer le rendu (même si vous le voulez). Le raytracing fait de nombreux calculs numériques, et c'est très vorace en FPU. Vous gagnerez plus de vitesse avec une FPU très rapide plutôt qu'avec une carte 3D.
Ce que fait le raytracing est : calculer 1 pixel de couleur et (optionnellement) le placer sur l'écran. Vous aurez très peu de bénéfice avec une carte vidéo rapide puisque seuls des pixels individuels sont affichés sur l'écran.
Cette question peut être divisée en 2 questions :
1) Quelle sorte de matériel dois-je choisir pour augmenter la vitesse de rendu ?
(Réponse de Ken Tyler)
La vérité est que les calculs nécessaires pour rendre des images sont à la fois complexes et voraces en temps. C'est un des types de programme qui placera votre FPU au maximum d'utilisation.
Les choses qui amélioreront la vitesse, en gros dans l'ordre d'apparition, sont :
2) Comment puis-je faire des scènes POV-Ray qui se rendront aussi vite que possible ?
Voici certaines choses qui peuvent accélérer le rendu sans compromettre la qualité de la scène :
+Q).#if) la majorité des sources de lumières, et ne laissez que le strict nécessaire pour voir la scène.#if) les objets lents (commes les superellipsoïdes) par de plus rapides (comme les boîtes).quick_color pour cela (elle fonctionnera quand votre qualité de rendu sera à 5 ou plus bas, ex. paramètre de ligne de commande +Q5).max_trace_level soit atteint, et c'est très lent.)max_trace_level, essayez de placer adc_bailout à quelque chose de plus grand que le 1/256 par défaut."Que valent les différentes sortes d'objets CSG en vitesse ? Comment les accélérer ?"
Il y a beaucoup de désinformation sur la vitesse des CSG. Une allégation très commune est que "la fusion est toujours plus lente que l'union". Cela n'est pas vrai. La fusion est parfois plus lente que l'union, mais dans certains cas elle est beaucoup plus rapide. Par exemple, considérons le code suivant :
global_settings {max_trace_level 40} camera {location -z*8 look_at 0 angle 35} light_source {<100, 100,-100> 1} merge { #declare Ind = 0; #while(Ind < 20) sphere {z*Ind, 2 pigment {rgbt .9}} #declare Ind = Ind+1; #end }
Il y a 20 sphères semi transparentes fusionnées ici. Un rendu de test prend 64 secondes. La substitution de la fusion par l'union prend 352 secondes (5.5 fois plus long). La différence en vitesse est notable.
Donc pourquoi la fusion est-elle plus rapide que l'union dans ce cas ? Bien, la réponse est probablement que le nombre de surfaces visibles joue un rôle important dans la vitesse de rendu. Quand les sphères sont réunies, il y a 18 surfaces internes, tandis que quand elles sont fusionnées, il n'y en a pas. POV-Ray doit calculer l'éclairage et l'ombrage de chacune de ces surfaces et c'est ce qui le ralentit. Quand les sphères sont fusionnées, il n'est pas utile de faire ces calculs pour ces 18 surfaces.
Donc est-ce que la fusion est toujours plus rapide que l'union ? Non. Si vous avez des objet complètement opaques, alors la fusion est légèrement plus lente, et dans ce cas vous devez toujours utiliser l'union. Cela n'a pas de sens d'utiliser la fusion avec des objets opaques.
Une autre allégation commune est que "la différence est très lente; beaucoup plus lente que l'union". Cela peut être aussi démonté. Considerez l'exemple suivant :
camera {location -z*12 look_at 0 angle 35} light_source {<100, 100,-100> 1} difference { sphere {0, 2} sphere {<-1, 0,-1>, 2} sphere {<1, 0,-1>, 2} pigment {rgb <1, 0, 0>} }
Cette scène demande 42 secondes de rendu, tandis qu'avec des unions elle prend 59 secondes (1.4 fois plus long).
La chose cruciale est la taille des surfaces à l'écran. Plus la taille est grande, plus le rendu est lent (parce que POV-Ray doit faire plus de calculs d'illumination et d'ombrage).
Mais l'une des déclarations est plus proche de la vérité : les différences sont habituellement lentes à rendre, spécialement quand les objets membres de la différence sont beaucoup plus grands que l'objet CSG résultant. Cela parce que l'encapsulage automatique de POV-Ray n'est pas parfait. Quelques mots sur l'encapsulage :
Supposons que vous avez des centaines d'objets (comme des sphères ou autre chose) formant un gros objet CSG, mais que cet objet est assez petit à l'écran (comme une petite maison par exemple). Ce sera réellement lent de tester les intersections rayon-objet pour chacun de ces objets pour chaque pixel de l'écran. Cela est accéléré par l'encapsulage de l'objet CSG avec une forme englobante (comme une boîte). Les intersections rayon-objet sont d'abord testées pour la boîte englobante, et ne sont testées sur les objets dans la boîte que si cette dernière est touchée. Cela accélère considérablement le rendu puisque les tests ne sont faits que sur cette petite zone où se tient l'objet CSG et nulle part ailleurs.
Puisque c'est assez simple de calculer automatiquement une boîte englobante correcte pour un objet donné, POV-Ray le fait et vous n'avez pas à le faire vous-même.
Mais cet encapsulage automatique n'est pas parfait. Il y a des situations où c'est très difficile à calculer. Une situation est lors des opérations CSG de différence et d'intersection. POV-Ray fait ce qu'il peut, mais quelque fois il fait un piètre travail. Cela peut être spécialement vu quand le résultat est très petit comparé aux objets membres de la CSG. Par exemple :
intersection { sphere {<-1000, 0, 0>, 1001} sphere {<1000, 0, 0>, 1001} }
(Cela est identique à une différence avec la seconde sphère inversée)
Dans cet exemple, les objets membres s'étendent de <-2001,-1001,-1001> à <2001, 1001, 1001> tandis que l'objet résultat est une petite lentille avec seulement 2 unités de long dans la direction x et peut-être 10 ou 20 unités dans les directions y et z. Comme vous pouvez le voir, il est très difficile de calculer les dimensions actuelles de l'objet (mais ce n'est pas impossible).
Dans ce type de cas, POV-Ray fait une énorme boîte englobante qui est inutile. Vous pouvez encapsuler ce type d'objet à la main (spécialement quand il a de nombreux objets membres). Cela peut être fait avec le mot clé bounded_by.
Voici un exemple :
camera {location -z*80 look_at 0 angle 35} light_source {<100, 200,-150> 1} #declare test = difference { union { cylinder {<-2,-20, 0>, <-2, 20, 0>, 1} cylinder {<2,-20, 0>, <2, 20, 0>, 1} } box {<-10, 1,-10>, <10, 30, 10>} box {<-10,-1,-10>, <10,-30, 10>} pigment {rgb <1, .5, .5>} bounded_by {box {<-3.1,-1.1,-1.1>, <3.1, 1.1, 1.1>}} } #declare copy = 0; #while (copy < 40) object {test translate -20*x translate copy*x} #declare copy = copy + 3; #end
Cela prend 51 secondes à rendre. En commentant la ligne 'bounded_by' le rendu passe à 231 secondes (4.5 fois plus lent).
Non, et sans doute jamais.
Il y a plusieurs bonnes raisons à cela :
Note : il y a certaines choses dans POV-Ray qui utilisent la simple précision (comme la gestion des couleurs). C'est un champ où quelque optimisation est possible sans dégrader la qualité de l'image.
| 2.4.7 Questions diverses |