À propos des graphiques 3D en mots simples

Partie 1. Introduction


Salut mon nom est chauve. Je travaille en tant que programmeur graphique depuis plusieurs années, donc bien que je ne sois en aucun cas un expert, il semble que je comprenne déjà beaucoup de choses sur tout ce qui concerne le travail avec les graphiques.

L'idée de cette série de messages plane depuis longtemps à la périphérie de mon esprit, et refait surface après avoir lu un article intéressant avec une analyse du dernier Deus Ex .

Il me semble que le graphisme, et surtout la complexité qu'il apporte dans les jeux modernes, est un sujet intéressant. Très peu de gens sont curieux de se plonger profondément dans tous ses détails, mais je crois qu'il y a des sujets qui intéressent tout le monde. Je pense que la plupart des gens qui ont joué à des jeux étaient curieux de savoir comment ces effets ont été obtenus, ou avec quelle technologie ils ont réussi à créer des graphismes incroyables dans un nouveau jeu.


De nombreux composants sont nécessaires pour créer même un jeu 3D simple, sans parler d'un projet comme Watch Dogs.

Je n'ai qu'une idée générale de ce qui doit être pris en compte dans cet article, mais cela dépendra des sujets qui susciteront l'intérêt. Cependant, l'idée principale est de créer une description générale de ce qui se passe à l'intérieur du jeu moderne sans effrayer aucun des lecteurs - je suppose que vous n'avez pas de connaissances en mathématiques et en programmation. Si vous connaissez la différence entre le CPU et la carte graphique, et que vous distinguez la RAM du disque dur, ce sera suffisant, et je vous expliquerai le reste.

Cet article sera développé conformément à sa vidéo pas à pas Chip & Ironicus's Let's Play of Watch Dogs , afin de structurer légèrement la présentation. Le jeu est bien connu pour ses graphismes (et les opinions à ce sujet peuvent être complètement opposées), et il y a de nombreux aspects qui peuvent être considérés avec des exemples séparés. Je parlerai peut-être d'autres jeux.

Je commencerai par expliquer les bases qui sont à peu près les mêmes pour chaque jeu, mais je vais également examiner certaines des techniques et des effets visuels de Watch Dogs.

J'utiliserai un outil appelé RenderDoc , que j'ai écrit pendant mon temps libre. Il est utilisé pour déboguer les problèmes graphiques - l'outil vous permet de décomposer un cadre graphique en parties, et grâce à cela, nous verrons comment il se réunit.


Cette animation montre une partie d'un cadre qui est progressivement créé en cours de rendu avec une carte graphique.

La plupart des gens savent que l'infographie (et les graphiques de toute autre vidéo) se compose d'une série d'images fixes, chacune étant affichée pendant une certaine fraction de seconde. Au cinéma, traditionnellement utilisé 24 images par seconde (images par seconde, FPS), en télévision la fréquence est à peu près la même, environ 24-30 images. Dans les jeux, le FPS peut être modifiable car beaucoup de travail est effectué dans chaque image. Une chute de fréquence en dessous de 30 n'est pas souhaitable, bien qu'elle se produise assez souvent. Habituellement, la limite supérieure pour les jeux sur console est de 60 FPS. Les développeurs cherchent à implémenter une fréquence de 30 ou 60, qui dépend des objectifs du jeu. Sur un PC, avec un affichage avec une fréquence d'images élevée, vous pouvez atteindre 90, 120 ou même plus. La raison de ces nombres spécifiques est la synchronisation verticale (vsync), dont nous discuterons ci-dessous.

Mentalement, nous pouvons regarder cette tâche du côté opposé - au lieu de regarder à quel point la fréquence FPS est élevée, nous regardons le peu de temps alloué pour chaque trame. Si nous voulons que le jeu fonctionne avec une fréquence de 30 FPS, alors nous n'avons que 33 millisecondes pour terminer tout le travail nécessaire au cadre. À 60 FPS, le temps est deux fois moins élevé - environ 17 millisecondes. Même pour un ordinateur, cette période n'est pas très longue, compte tenu de la quantité de travail à faire. Pour vous donner une idée des quantités, alors, selon des estimations approximatives, la balle se déplace d'environ 1 mètre par milliseconde.

Nous parlerons principalement des PC car cette plateforme est ouverte, et je ne peux pas parler de consoles sans craindre de violer les accords de non-divulgation (NDA). Quoi qu'il en soit, je parlerai essentiellement de ce qui n'est pas très différent sur les consoles, mais si quelque chose diffère encore, je le soulignerai. Pour les plates-formes mobiles, la plupart des différences entre le matériel / consoles PC et le matériel mobile ne sont pas pertinentes pour le sujet de mon article.


Honnêtement, j'ai mis cette photo ici pour que vous compreniez que l'article n'aura pas seulement du texte.

C'est cette tâche qui nous intéresse - nous ne nous soucierons pas de la façon dont tous ses calculs d'IA sont effectués, ni de la façon dont la simulation physique est effectuée pour déplacer des objets. Les limites de la discipline appelée «programmation graphique» sont assez floues, mais je dirai que la programmation graphique commence lorsque nous avons toutes les informations nécessaires pour construire un cadre: nous savons ce qui se passe, toutes les textures et modèles sont en mémoire (pas sur disque) ), les animations sont déjà animées, la physique est comptée, et il suffit de dessiner un cadre fini pour l'afficher à l'écran.

J'ajoute que je considérerai un jeu 3D avec un rendu assez traditionnel, comme Watch Dogs - de nombreux principes de base s'appliquent aux jeux 2D, mais il est un peu plus difficile de démontrer des concepts sur eux. Je vais également expliquer (en particulier aux programmeurs graphiques) que je m'efforce principalement de comprendre, donc, peut-être, j'utiliserai des explications plutôt douteuses si elles me permettent d'atteindre mon objectif.

Partie 2. En quoi consiste le cadre


La plupart du temps, nous examinerons un seul cadre et parlerons des blocs de construction que le jeu utilise pour créer un cadre fini. Aussi dans cette partie, il y aura plusieurs nouvelles belles photos.

Il existe plusieurs façons d'assembler un cadre à partir de blocs de construction. L'image finie que le joueur voit n'est pas rendue instantanément. Il a été dessiné tout de suite il y a de nombreuses années, mais les moteurs graphiques modernes utilisent presque toujours une sorte de prétraitement. Avant d'afficher le cadre fini à l'écran, le moteur graphique dessine de nombreuses images intermédiaires de différents types qui aident à calculer l'image finale.

Ces images dépendent fortement du type de moteur et des techniques que le programmeur graphique doit appliquer. Par exemple, s'il veut que la lumière du soleil crée les ombres correctes, alors un type d'image sera nécessaire pour les ombres. Il peut également avoir besoin des reflets corrects sur la voiture conduite par le joueur, et pour cela aussi, il a besoin d'une autre image avec des reflets.







Divers exemples d'images intermédiaires utilisées dans la construction du cadre Watch Dogs.

Dans cet article, je ne considérerai pas chacune des images utilisées dans le cadre Watch Dogs, mais uniquement les images de base, afin que vous puissiez apprendre quelque chose. Il s'agit d'un domaine dans lequel la recherche graphique est constamment en cours et de nouvelles techniques émergent. Les innovations surviennent également à des niveaux plus petits, mais lorsque le marketing vous parle de nouvelles fonctions graphiques, il fait généralement référence à de telles améliorations.



Chacune de ces images intermédiaires est également construite à partir de fragments encore plus petits. Chaque objet de la scène ou un groupe d'objets associés est créé séparément en tant que modèle texturé . Lors du développement d'un jeu, les artistes construisent ces modèles dans un éditeur 3D et créent toutes les ressources nécessaires pour eux. Ces modèles sont ensuite placés dans le monde à l'aide de l'éditeur de niveau et une ville virtuelle est progressivement construite à partir d'eux.

Probablement, presque tout le monde le sait, et si vous avez regardé le développement de graphiques 3D en temps réel au cours des 20 dernières années, vous savez à quel point les modèles sont devenus plus complexes aujourd'hui. Aux toutes premières étapes de la formation des graphiques, la cartographie des textures était un processus coûteux et, si possible, elle était éliminée en peignant des objets de la même couleur. Les textures ont été laissées uniquement aux éléments tels que les yeux ou les visages qui avaient vraiment besoin de détails.

Le modèle 3D est entièrement constitué de triangles interconnectés qui forment la forme de l'objet. Chaque triangle a trois points appelés sommets, et puisque les triangles sont connectés les uns aux autres, les sommets peuvent être partagés par plusieurs triangles. Nous y reviendrons plus tard car les sommets et triangles sont suffisamment importants. Il convient également de rappeler que certains objets, par exemple des personnages ou des arbres, doivent être animés avant le rendu. Le modèle est créé sous une forme statique standard et des animations sont appliquées dans chaque image. Nous y reviendrons également.


Il s'agit d'un modèle 3D de la tête d'Aiden Pierce après animation. Les triangles sont visibles car ils sont dessinés à plat et non lissés, comme c'est généralement le cas.

Pour ajouter plus de détails au modèle 3D, les textures sont superposées. Les textures sont des fichiers d'image plats réguliers, généralement carrés ou de taille simple, tels que des rectangles avec un rapport de 2: 1. Les textures sont superposées au modèle 3D à l'aide d'un processus plus complexe, dont je parlerai plus en détail ci-dessous, mais conceptuellement, il est similaire au processus d'emballage d'un cadeau. Au lieu d'un simple motif répétitif de papier d'emballage, l'image correspond exactement à la taille de l'emballage. Si vous avez vu des modèles en papier à assembler avec de la colle, le principe est le même.

Cette analogie est plus appropriée que vous ne le pensez, car ces textures sont généralement créées en «déroulant» un modèle 3D dans un flan plat, comme cela se fait avec un modèle en papier, après quoi une texture est dessinée par-dessus. Ce déploiement est souvent effectué automatiquement, mais dans le cas d'objets particulièrement complexes, il peut être effectué manuellement.


Il s'agit de la texture correspondant au modèle de tête Aiden Pierce illustré ci-dessus. Il y a des parties pour les dents et la langue. Notez que la zone au-dessus de son front n'est pas texturée car elle est recouverte en permanence par la casquette de baseball légendaire Aiden Pearce ™.

Remarque


Lors du dépliage, certaines parties de l'objet qui nécessitent plus de détails augmentent, tandis que d'autres diminuent.

Très souvent, ils parlent de différents "skins" de modèles, en particulier dans le cas de personnages personnalisables. Aujourd'hui, ce qu'on appelle une «peau» fait généralement référence à de petits changements dans le modèle - une nouvelle ceinture ou un chapeau différent - mais initialement ce terme est né parce que le même modèle a été utilisé, mais la texture a changé (ou «peau» - se traduit littéralement par "Skin") pour créer un personnage qui a l'air différent. Même aujourd'hui, avec l'aide de telles textures, vous pouvez créer une grande variabilité des PNJ ou des objets, ce qui économise du temps et de l'argent - vous n'avez pas besoin de créer de nombreux modèles 3D uniques. Les différents vêtements que Aiden peut porter ne sont souvent que des textures différentes du même modèle.


Voici un bref extrait de la rotation de la tête 3D. Surimpression seule texture, et rien de plus.

Dans le cadre que nous considérons, il y a environ 1700 objets rendus dans la partie de rendu principale. Certains d'entre eux seront les mêmes modèles - des objets tels que des fleurs dans des pots et des poubelles ne sont jamais réellement créés séparément, c'est un modèle ou plusieurs modèles placés à différents endroits. Cependant, la quantité approximative d'objets dessinés pour compléter le cadre est proche de 4700 - cela nous donne une idée du travail supplémentaire à effectuer en plus du rendu de tous ces modèles.

Regardons un autre exemple d'un objet - une casquette de baseball portée par Aiden.



Il s'agit d'un modèle de casquette de baseball texturé et texturé. On peut voir que la texture est constituée de parties distinctes qui sont connectées au modèle.

Remarque


La visière et la partie principale de la casquette de baseball sur la texture ne se touchent pas, car le scan peut être assez compliqué et, si nécessaire, peut être effectué en plusieurs parties différentes. Parfois, texturer un modèle de forme complexe sans problèmes et coutures visibles nécessite une bonne quantité de compétences.

Les mêmes principes que nous avons vus avec la tête d'Aiden s'appliquent à la casquette. En fait, si nous ignorons la texture et les nombres spécifiques nécessaires pour effectuer le déballage, le principe est toujours le même.

Pour montrer ce qui peut mal se passer pendant le développement et pour montrer comment vous pouvez vous amuser lors de la programmation graphique, nous pouvons effectuer une petite expérience. Étant donné que la plupart des textures ont une taille carrée standard et que la méthode d'emballage et de dépliage des textures sur le modèle est également la même, pourquoi ne pas jouer avec elles un peu? Que se passe-t-il si nous appliquons la texture de la tête d'Aiden à un modèle de casquette de baseball?


Déjà pas très similaire à la casquette de baseball légendaire Aiden Pierce.

Là où il y avait un logo sur la texture de la casquette de baseball, l'oreille et les dents sont situées sur la texture de la tête. Là où il y avait une visière, il n'y avait que des cheveux sur la texture de la tête. La superposition est exactement la même, mais une texture différente est utilisée. Bien sûr, cet exemple sera une erreur dans le jeu, mais pensez à ce qui peut être fait si vous animez la texture ou la faites scintiller - dans les jeux, ces choses sont utilisées pour divers effets que vous pouvez maintenant remarquer. En particulier, le jeu Saint's Row 4 utilise des effets similaires similaires pour la "simulation".

Il sera également utile de réfléchir aux conséquences de cela - les jeux combinent très soigneusement des paires de modèles et de textures, c'est-à-dire que les modèles les plus uniques doivent correspondre à leurs propres textures uniques.

Bien sûr, cette règle n'est pas absolue - dans certains cas, pour économiser de l'espace, la texture est un motif répétitif standard qui peut être utilisé pour de nombreux objets. Les ensembles d'objets liés - par exemple, les marchands de journaux - peuvent utiliser la même texture pour différents journaux, chaque journal occupant une petite fraction de la texture.

Néanmoins, cela signifie que pour construire l'image finale, tous les blocs de construction doivent être présents, c'est-à-dire que de nombreux modèles et textures requis peuvent être obtenus. Dans la partie suivante, nous expliquerons pourquoi certains aspects, tels que la réflexion, sont très difficiles à mettre en œuvre correctement. Je parlerai également de la façon dont les jeux utilisent de petites astuces pour gagner du temps et des ressources.

Partie 3. Ce que vous n'avez pas besoin de dessiner


Souvent, la programmation graphique consiste à équilibrer une douzaine de contraintes différentes pour obtenir le compromis parfait. Dans la dernière partie, nous avons vu que chaque fois qu'une scène est dessinée, elle est assemblée à partir de nombreux petits blocs de construction - personnes, voitures, panneaux de signalisation, bâtiments. Tout ce qui est à l'écran est composé de composants individuels qui doivent être dessinés. Il y a plusieurs opérations d'équilibrage subtiles dont nous discuterons ici.

Le processeur central et la carte graphique fonctionnent ensemble pour rendre le cadre. Le reste du jeu est exécuté dans le CPU, il décide donc quels objets doivent être dessinés dans l'image actuelle, où la caméra regarde et quelles animations sont jouées. Une carte graphique est un «cheval de bataille» qui effectue tout le travail complexe impliqué dans le rendu des pixels, c'est pourquoi il s'agit d'un appareil spécialisé distinct.

Il s'avère que le CPU et la carte graphique ont des limitations sur la vitesse ou la quantité de calculs, mais ce sont différents types de restrictions.

En général, le CPU s'intéresse davantage à sa propre partie du travail: combien d'objets devons-nous dessiner au total? Quelle est la différence entre ces objets - est-ce 100 lumières identiques ou 100 buissons / plantes / arbres? Ces objets sont-ils animés, se déplacent-ils dynamiquement et lesquels sont statiques ou immobiles?

La première chose que nous faisons pour réduire la charge autant que possible est de ne dessiner que ce qui est visible à l'écran. Cela semble évident, mais la mise en œuvre nécessite un travail minutieux. N'oubliez pas que nous construisons chaque cadre à partir de zéro, donc dans chaque cadre, nous devons regarder chaque objet et déterminer s'il est visible ou non. Cela signifie que dans chaque jeu, il y a un vide noir partout suivant le joueur, et quand il ne regarde pas les objets et les personnes, ils cessent d'exister.


Dans cette animation, nous faisons tourner la caméra, montrant le vide derrière le joueur. Les téléspectateurs attentifs remarqueront qu'il n'est pas complètement vide ...

Il est difficile de développer des règles pratiques dans ce cas, mais en général, vous pouvez dessiner environ 1000 objets dans la scène sans vous soucier du manque d'espace. Cependant, si vous avez besoin de restituer 5 000 objets, pensez à utiliser des astuces. N'oubliez pas que dans la plupart des jeux où le joueur peut contrôler la caméra, nous ne pouvons pas savoir sous quel angle il se penchera, vous devez donc économiser de l'espace pour manœuvrer.

Il s'avère qu'il existe de nombreuses astuces qui vous permettent d'utiliser presque complètement une ressource valide, et elles sont particulièrement importantes dans des jeux comme Watch Dogs. Plus vous vous rapprochez des frontières et plus vous pouvez obtenir de qualité visuelle à partir du même nombre d'objets, meilleur sera le jeu.

Même si vous regardez ce qui se trouve devant vous dans la scène, cela ne signifie pas qu'il est nécessaire de dessiner toute la ville. S'il y a un énorme bâtiment à gauche ou à droite, tout ce qui se trouve derrière devient invisible, vous ne pouvez donc pas le dessiner. De même, certains objets au loin deviennent très petits, nous n'avons donc pas à nous soucier de dessiner de minuscules plantes et arbustes au loin.


Cette animation montre que si vous marchez le long de la rue plus loin que ce que nous voyons, alors il n'y a rien dans les rues latérales, mais à une grande distance les détails deviennent plus petits.

En fait, il y a encore beaucoup d'objets dans cette scène qui s'avéreront par conséquent invisibles. Beaucoup reste à explorer dans ce domaine et diverses techniques sophistiquées doivent être appliquées. Vous devez toujours faire des compromis, mais si vous pouvez passer un peu de temps ou trouver un moyen très intelligent pour éviter de rendre 100 objets sans presque aucun effort supplémentaire, nous pouvons rendre la scène encore plus complexe ou plus dense.

De plus, il y a un autre petit problème. Dans certains cas, nous devons dessiner un bâtiment à peine visible à l'écran et qui va bien au-delà. Cela gaspille des ressources. Nous pouvons toujours diviser ces objets en plusieurs parties, puis chaque partie peut être dessinée ou sautée, c'est-à-dire qu'il y aura moins de déchets. Cependant, nous avons maintenant augmenté le nombre total d'objets dessinés lorsqu'ils sont à l'écran et créé le problème inverse!

Cet exemple est l'un des centaines, mais il est facile d'expliquer sur lui quelles décisions doivent être prises et quelles expériences faire pour trouver le point d'équilibre parfait pour chaque jeu.

Étant donné que l'action de notre tir de Watch Dogs a lieu dans la ville, nous pouvons le regarder d'en haut pour comprendre approximativement ce qui est dessiné exactement. Dans cette image statique, il est particulièrement visible que Watch Dogs effectue le travail tous les trimestres.


Maintenant, nous nous éloignons pour montrer la zone visible devant la caméra (désolé pour l'installation pour gagner du temps).


Une zone de visibilité approximative de la caméra est superposée à l'image. La largeur de ce triangle dépend du champ de vision - parfois dans les jeux, c'est une option personnalisée, parfois une valeur constante.


Voici un affichage filaire de la scène, le champ de vision de la caméra est limité au blanc.



Certains d'entre vous pourraient déjà penser à une petite astuce qui vous permettrait de contourner la restriction du rendu d'un certain nombre d'objets - pourquoi ne pas faire des objets une combinaison très complexe de tout dans une petite zone, jusqu'aux feuilles individuelles? Ensuite, dessiner 1000 objets sera plus que suffisant.

Mais ici, nous sommes confrontés à un ensemble de limitations complètement différent - les cartes graphiques ont des performances limitées et plus l'objet est complexe, plus il faudra de temps pour le dessiner. Autrement dit, même un objet, s'il est assez complexe, peut réduire la fréquence d'images du jeu à 20 FPS. Y compris c'est pourquoi j'ai dit que la limite sur le nombre d'objets est assez floue.

Le temps passé sur un objet dépend de la complexité et du détail des modèles et des textures, ainsi que de la sophistication de l'éclairage et des ombres. C'est aussi pourquoi les jeux qui tentent d'implémenter des graphiques plus complexes ou sophistiqués ont tendance à utiliser des scènes moins complexes et détaillées - l'équilibrage décale les échelles dans un sens ou dans un autre, afin que vous puissiez vous offrir plus d'espace de manœuvre, en sacrifiant ce qui n'est pas si important pour le jeu .


Il s'agit d'une sorte de carte thermique, montrant dans quelles parties de la scène il existe des modèles particulièrement complexes. Remarquez combien de problèmes les arbres et la végétation peuvent causer.

Il existe un autre ensemble de techniques appelé «niveau de détail» (LOD), qui est spécifiquement conçu pour résoudre de tels problèmes. Semblable au fait que nous pouvons optimiser le nombre d'objets, en coupant tout ce qui n'est pas nécessaire, nous pouvons augmenter l'offre de «complexité», en éliminant les inutiles.

L'un des trucs est en fait bien connu - cela change la résolution des textures. Ce sujet recoupe généralement de nombreux autres, donc je vais essayer de l'expliquer de manière accessible.

Les textures dans les jeux sont généralement des rectangles avec des tailles égales à la puissance de deux - 512, 1024, 2048, 4096. Il y a plusieurs raisons à cela, mais l'un des avantages de ceci est que vous pouvez prendre une texture de taille 1024x1024 et en créer facilement une version plus petite avec une taille de 512x512 .

Pour les raisons que j'expliquerai ci-dessous, il est toujours nécessaire que la texture ait toutes sortes de versions plus petites. C'est-à-dire qu'une texture d'une taille de 1024x1024 aura des versions plus petites de 512x512, 256x256, 128x128, 64x64, 32x32, 16x16, 8x8, 4x4, 2x2 et 1x1. Cependant, l'un des avantages de cela est que si des objets distants sont petits sur l'écran, leur appliquer une texture 1024x1024 signifie un gaspillage de ressources. Nous pouvons économiser en utilisant des versions plus petites de la même texture.

De même, même les objets proches peuvent être considérés comme peu importants et utiliser des textures plus petites pour eux.

Remarque


Habituellement, lorsqu'un joueur s'approche d'un objet, la plus grande texture est utilisée, mais comme la plupart des gens l'ont vu dans un jeu particulier, cela ne se produit pas toujours et les textures semblent trop floues avant le chargement. Cela se produit généralement car les textures ne peuvent pas être chargées à partir d'un DVD ou d'un disque dur directement dans la mémoire de la carte graphique pour le rendu. Le plus souvent, cela se produit lorsqu'un joueur change brusquement de position, par exemple, pendant la réapparition, le chargement d'un nouveau niveau ou un mouvement très rapide. Dans tous les autres cas, les textures sont généralement chargées progressivement, en train de déplacer le lecteur à travers le monde.

Vous pouvez également appliquer ce processus de simplification aux modèles utilisés dans le jeu, bien qu'il soit beaucoup plus difficile à faire. En créant des versions simplifiées d'objets complexes, vous pouvez vous assurer qu'à grande distance, ils ne rongent pas une partie d'un approvisionnement limité en complexité.

Grâce à des objets simplifiés et des modèles rognés, vous pouvez économiser beaucoup d'argent et vous devez utiliser cette approche dans n'importe quel jeu comme Watch Dogs. Mais en même temps, cela peut être un énorme gaspillage de ressources. Il est nécessaire de prendre une décision très réfléchie et équilibrée sur le nombre de versions simplifiées des modèles nécessaires. S'il y en a trop peu, vous ne pourrez pas économiser trop ou il y aura des sauts de qualité notables lors de leur modification. S'il y en a trop, vous perdrez de la mémoire et passerez les heures-homme nécessaires pour créer des objets.


C'est ainsi que les objets et les personnages complexes regardent à distance lorsqu'ils ne se distinguent pas de leurs versions très détaillées.



J'espère que vous avez maintenant une idée des problèmes que les programmeurs graphiques, les artistes et les concepteurs de niveaux essaient de combiner avec la plus haute vitesse graphique. Sur consoles, cette équation est un peu plus facile à résoudre que sur PC, car l'équipement est constant.

Dans la partie précédente, j'ai dit que j'expliquerai pourquoi il est très difficile de mettre correctement en œuvre des réflexions et d'autres choses similaires. La raison est assez simple - les réserves de productivité et de ressources dont je ne cesse de parler ne changent pas selon que vous avez une réflexion ou non. Si vous voulez créer un reflet qui peut à nouveau afficher toute la scène, vous devez refaire tout le travail dont j'ai parlé. De plus, les réflexions dépendent beaucoup de l'angle sous lequel nous les regardons, donc pour obtenir des réflexions précises pour chaque objet réfléchissant, elles doivent être les leurs!

Cela peut devenir incontrôlable très rapidement, et généralement les jeux dans lesquels il y a des réflexions se permettent certaines libertés ou hypothèses. Les jeux créent très rarement des reflets dans des environnements complexes, le maximum qu'il peut être est un miroir dans la salle de bain, où il n'y a pas tellement d'objets, la complexité de la scène est petite, et donc vous pouvez vous permettre des dépenses supplémentaires. Les vrais reflets du jeu ne seront peut-être que sur des surfaces inégales ou ondulées de l'eau, de sorte que même une scène très rugueuse et peu détaillée suffit pour créer des reflets convaincants.

Il est généralement difficile d'éviter complètement les surfaces réfléchissantes, c'est pourquoi les jeux utilisent des images pré-rendues de l'environnement immédiat, ce qui donne un résultat «raisonnablement bon». Mais ils ne résistent pas à un examen attentif, et si vous regardez attentivement les reflets, vous verrez que c'est une imitation. Il existe des techniques modernes qui aident à créer des reflets dans certaines conditions, et peut-être plus tard j'en parlerai, mais de telles images pré-rendues («pré-rendues») sont toujours nécessaires.


Cette image rendue est appelée «carte de cube». Ce n'est pas tout à fait exact par rapport à l'endroit où se trouve Aiden, mais il est assez proche de lui.

Watch Dogs restitue les reflets en temps réel. Je n'ai pas enquêté sur ce problème en détail, mais je pense qu'ils sont toujours rendus lorsque le personnage est dans la rue, et sont principalement utilisés pour obtenir ses reflets exacts sur la voiture dans laquelle il est assis, pour améliorer l'image et lui donner un léger sentiment de réalité . Puisque le joueur est toujours concentré sur sa voiture et son environnement immédiat, le fait d'une réflexion incorrecte sur d'autres voitures est à peine perceptible.

Il existe de nombreuses approximations disponibles pour accélérer le rendu de ces réflexions. Par exemple, beaucoup moins d'objets sont rendus dans la réflexion que dans la scène réelle - environ 350 au total - et beaucoup d'entre eux sont très simplifiés par rapport aux versions complètes. Je soupçonne que des objets complexes, tels que des personnes, sont complètement rejetés quelle que soit la distance, mais je n'ai pas testé cette théorie. De plus, il n'y a pas d'ombres sur ces objets, et l'éclairage est très simple - seulement celui qui vient du soleil et du ciel. Les réflexions sont rendues à partir du sol comme dans une lentille «fisheye», c'est-à-dire que les réflexions de la terre elle-même sont impossibles, et ce qui est à côté a très peu de détails.

Mais même avec toutes ces simplifications, les réflexions ne répondent qu'à ce qui était prévu. Si vous conduisez sous les rails, vous pouvez obtenir le bon reflet avec une vue sur la voiture, ce qui en pratique ne fonctionnerait pas.

Cette décision était intentionnelle et difficile à prendre. Le stock est une valeur constante, donc si vous laissez de la place à ces réflexions, vous devez sacrifier autre chose.


Voici une vue très «louche» de la scène autour d'Aiden avec une vue de dessous, faite pour les reflets. Vous pouvez naviguer le long des deux feux et rails du train.



Il y a une autre partie du travail que je veux mentionner ici - les ombres. Plus tard, j'ai l'intention de parler du fonctionnement des ombres, car c'est un sujet intéressant, mais maintenant la chose la plus importante est de se rappeler que les ombres sont très similaires aux réflexions. Chaque source de lumière projetant une ombre doit restituer une image de scène de son point de vue. Cette fois, il n'y a pas beaucoup de façons de simplifier le travail - pour le calcul correct des ombres, chaque source de lumière doit avoir cette image.

Remarque


, . , «» , . , , .

La source d'éclairage la plus évidente et la plus importante est le soleil (ou la lune, si la chose se passe la nuit). Étant donné que le soleil est immense, 3 à 5 images sont généralement rendues pour lui, et non une, comme dans le cas des phares ou d'une lampe de poche.

Malheureusement, c'est l'un des cas où Watch Dogs ne peut pas servir de bon exemple. Le calcul des ombres dans le jeu est assez compliqué et, il me semble, est spécialement optimisé pour le cas des ombres dans la ville. Par conséquent, je ferais mieux de passer à Far Cry 4 et de considérer le calcul des ombres sur l'exemple d'une image de ce jeu.


Voici une scène de Far Cry 4 que j'utilise comme exemple.


Voici une image avec des informations sur les ombres de cette scène - chacune d'entre elles nécessite un rendu complètement nouveau de la scène.

Par conséquent, lorsque nous devons ajouter une projection d'ombre à la source de lumière, nous devrons rendre la scène une fois de plus. Ici, vous pouvez également utiliser certaines des approximations utilisées dans le cas des réflexions, mais elles sont beaucoup plus petites. Vous pouvez ignorer les objets petits ou éloignés, mais gardez à l'esprit que ces objets ne semblent pas projeter d'ombres. Vous pouvez rendre l'image très petite, mais les ombres seront granuleuses et peu détaillées. Habituellement, il n'est pas possible d'utiliser une version très simplifiée de l'objet, car il semblerait alors que l'objet se projette une ombre sur lui-même, ou que des écarts apparaissent entre l'objet et son ombre.

Une autre conséquence très facile à ignorer est la nécessité de créer des images d'ombrage pour chaque source de lumière. Dans de nombreux cas, il est possible de simplifier les sources d'éclairage en les combinant - dans Watch Dogs, cela se produit avec les phares de voiture.

Lorsque les deux lumières sont allumées, une seule source de lumière est dessinée, mais elle a une forme spéciale, à cause de laquelle elle ressemble à deux rayons. Si les phares ont des ombres, ce n'est pas si facile à faire, et ce sera beaucoup plus visible - lorsque le joueur passe devant la voiture, la lumière viendra de quelque part entre les deux phares. Vous devrez peut-être alors séparer les phares, mais en même temps, non seulement il y aura des coûts supplémentaires pour le calcul des ombres, mais vous devrez également dessiner un nouvel éclairage.



La principale chose que je voulais souligner avec tout cela était le compromis. Nous pouvons certainement nous débarrasser de toutes ces approximations, mais nous devrons dépenser nos réserves de ressources pour cela, c'est-à-dire sacrifier autre chose. Chaque développeur de jeu doit décider sur quoi il est important pour lui de se concentrer dans le jeu, et ce qui impressionnera ou gênera le plus le joueur.

Partie 4. Déplacer les pics


Dans cette partie, je parlerai davantage des détails techniques de l'animation d'objets dans la scène.

Les programmeurs graphiques parlent souvent du «pipeline graphique». Les graphiques 3D sont un peu comme une chaîne de montage avec un mouvement clairement défini d'une étape à l'autre, mais cela ne fonctionne pas avec un seul objet à la fois.

Toutes les cartes graphiques modernes ont approximativement la même bande transporteuse, elles ont un équipement spécial et un logiciel qui sont directement flashés «en silicium» pour maximiser la vitesse du convoyeur. Bien sûr, il existe de nombreuses variantes entre les différents fabricants et familles de cartes graphiques, mais nous n'avons généralement pas à nous soucier de leur fonctionnement à ce niveau.

Remarque


Si vous êtes intéressé par la façon dont tout fonctionne au niveau matériel abstrait, alors je recommande une série d'articles de Fabian Giesen sur le pipeline graphique . Cette série d'articles est beaucoup plus détaillée et nécessite beaucoup plus de compréhension que mon article.

Je vais sauter de nombreux détails pour expliquer des principes intéressants et importants. Dans cette partie, nous allons examiner la première partie du pipeline, appelée Vertex Shader .

Les shaders se sont généralisés il y a environ 16 ans, après la sortie de DirectX 9, dans laquelle des shaders de vertex et de pixels sont apparus. Pour expliquer ce que sont les shaders et les comparer avec ce qu'ils étaient, je vais parler du travail qu'ils font.


La tête de squelette d'Aiden est à nouveau avec nous.

Permettez-moi de vous rappeler que dans la partie 2, nous avons examiné les modèles à partir desquels le monde du jeu est créé. Ces motifs sont constitués de points individuels appelés sommets qui sont connectés en triangles. J'ai dit que je vous en parlerais plus tard, et maintenant je tiens ma promesse.

Étant donné que tout dans le monde du jeu se compose de sommets, tout ce qui doit être fait avec ces modèles doit être effectué avec des sommets. En ce qui concerne la carte graphique, tout ce qu'elle voit est une longue liste de sommets. Pour elle, il n'y a rien de tel que l'exécution d'animations, le balancement des feuilles d'arbres ou tout autre concept abstrait.

Regardons un exemple simple de ce que nous devons faire - déplacer et positionner des objets dans le monde. Pour commencer, prenons un cas simple, pas un personnage.

Lors de la création d'objets dans des éditeurs 3D comme Maya et 3D Studio Max, les artistes construisent toujours à partir de leur propre monde. Ces objets ne sont pas créés immédiatement dans l'entourage de Chicago, leur environnement ressemble plutôt à une "salle blanche vide" de la matrice. Chaque objet est situé au centre du vide absolu.


Voici un feu de circulation dans le jeu quelque part sous les rails, et il est situé dans son propre monde.

Lors de l'enregistrement sur disque, le modèle n'a aucune idée où il se trouvera dans le monde et quand il sera téléchargé et transféré sur la carte graphique. Cela signifie que lorsque vient le temps de dessiner des objets, nous devons le déplacer de notre propre monde vers la scène que nous dessinons. Cela se produit avec chaque objet dessiné, et même des objets immobiles tels que des bâtiments et des ponts se déplacent également de leur propre monde vers la scène dans chaque image.


Ici, nous voyons plusieurs feux de circulation déjà placés dans une scène finale partiellement construite.

Comme je l'ai mentionné ci-dessus, les seules choses avec lesquelles nous pouvons travailler sont les pics. Nous ne pouvons pas simplement dire à la carte graphique: "Pouvez-vous placer ce feu de circulation sous le pont? Et puis en mettre un autre un peu plus loin? Super! "

Par conséquent, au lieu de dire à la carte graphique ce qu'elle doit faire avec l'objet lui-même, nous devons dire quoi faire avec tous ses sommets. Il s'avère que dans ce cas, tout devient très simple. Si nous changeons tous les sommets exactement de la même manière et qu'ils restent immobiles les uns par rapport aux autres, cela revient à déplacer un objet dans son ensemble. Tout ce que nous devons faire est de comprendre ce que le «changement» est appelé transformation.

Remarque


Les calculs mathématiques de tout cela ne sont pas particulièrement compliqués, mais dépassent le cadre de l'article. Si vous avez déjà étudié l'algèbre linéaire, vous savez probablement tout ce dont vous avez besoin - en gros, tout se résume à la multiplication matricielle des vecteurs.

Avant l'apparition des vertex shaders, les options possibles pour transformer les sommets dans la carte graphique étaient très limitées. Des objets en mouvement et en rotation étaient disponibles, ainsi que certaines autres opérations, mais rien de particulièrement redondant ou compliqué.

Les vertex shaders sont de petits programmes informatiques qui s'exécutent sur une carte graphique. Ils prennent un sommet, effectuent toutes les actions nécessaires avec lui et émettent un sommet de sortie. Ils peuvent non seulement le déplacer, mais aussi les faire sauter de haut en bas, s'éloigner du sommet le plus proche, osciller en fonction du vent, s'animer et bien plus encore.

J'ai pris l'un des vertex shaders utilisés dans Watch Dogs et je l'ai expérimenté un peu pour montrer ce qu'il fait. C'est un travail assez laborieux, mais j'ai réussi à trouver le vertex shader utilisé pour les personnages et à le changer. Il existe un autre vertex shader utilisé pour la peau, par exemple, pour les visages et les mains, mais vous comprendrez rapidement le principe.


J'ai fait un changement très simple qui ajoute un pli au modèle de personnage, mais tout le reste est utilisé comme d'habitude.

L'animation ci-dessus montre que les personnages sont étrangement déformés. Cela nous ramène au principe "si vous déplacez chaque sommet, cela revient à déplacer tout l'objet". La modification apportée au vertex shader ne fonctionne que pour un sommet à la fois, mais comme ils fonctionnent tous avec la même distorsion, l'effet est appliqué à l'objet entier.

Vous pouvez également apporter des modifications à la partie de la transformation, qui est responsable de «se déplacer simplement en place», de sorte qu'au lieu de placer le personnage au bon endroit, elle le soulève au-dessus du sol. Cela n'est pas simulé à l'aide de la physique, donc cela n'a rien à voir avec la gravité ou les collisions avec d'autres objets - si nous voulons, nous pouvons faire planer tout le monde dans les airs.


Dans cette animation, nous avons fait monter et descendre progressivement le vertex shader.

Évidemment, tout cela n'est pas très constructif, mais cela nous donne une idée générale du fonctionnement des vertex shaders - si nous voulions maintenant animer les feuilles des arbres pour qu'elles se balancent, nous ferions la même chose. Ce n'est qu'au lieu de s'élever et de s'abaisser qu'ils oscilleraient dans la direction du vent. Ensuite, nous pouvons changer la force du vent pour que les arbres se balancent plus ou moins.


Ici, nous voyons ce qui se passe lorsque tout augmente d'environ sept fois.

Je simplifie un peu, mais la tâche de la plupart des vertex shaders est de «déplacer les objets en place». L'exception concerne tous les objets animés - les personnes, les animaux, ainsi que les objets tels que les cordes qui se balancent, les vêtements flottant, etc.



L'animation des gens est liée à l'idée d'utiliser un squelette et une «peau». Un squelette est une simple description d'un personnage en mouvement. À ce stade, nous ne nous soucions pas des boucles, des chapeaux ou des jeans qui ne sont pas animés - seuls les mouvements importants les plus appropriés pour le squelette humain sont importants pour nous.


Un simple squelette d'une figure humaine est montré ici. Il n'a pas été repris de Watch Dogs, car le squelette est difficile à visualiser en dehors de l'éditeur 3D.

Image sous licence Attribution-ShareAlike CC BY-SA © équipe MakeHuman 2001-2014


Il s'agit d'une pose instantanée ou d'une pose en T qui montre à quoi ressemble un personnage sans utiliser d'animations.

Les animations - courir, marcher, sauter - ne s'appliquent qu'à ce squelette. Cela rend l'ensemble du processus très simple, car nous devons considérer seulement une centaine d'os au lieu de milliers et milliers de sommets.

Après avoir créé le squelette, chaque sommet est attaché à un ou plusieurs os dans cette pose statique, et cette connexion est appelée «skinning». Au moment de Half-Life 1, lorsque cette technologie a commencé à être utilisée, chaque sommet n'était associé qu'à un seul os. De nos jours, ils peuvent même joindre quatre os, tandis que chaque os reçoit un poids, dont dépend le degré d'influence de l'os sur l'apex. Grâce à cela, vous pouvez obtenir une animation plus fluide, permettant aux os de se croiser dans différentes zones sans créer d'angles vifs lors du déplacement des bras ou des jambes.


Il s'agit du squelette illustré ci-dessus avec l'os de la cuisse tourné. Les couleurs montrent le poids de l'os de la hanche par rapport aux sommets du modèle.

Image sous licence Attribution-ShareAlike CC BY-SA © équipe MakeHuman 2001-2014

Cette technologie a ses limites, en particulier dans les endroits où les vêtements et la peau sont comprimés ou étirés dans des charnières, par exemple, sur les coudes et les épaules. C'est un moyen d'animation imparfait mais très efficace. La limitation la plus sérieuse est qu'il est très difficile de créer des animations de visage convaincantes de cette manière. Vous pouvez créer de nombreux «faux» os sur votre visage, par exemple pour les sourcils et autour de la bouche, mais ce ne sera qu'une approximation approximative des muscles et de la peau.

Une autre caractéristique importante de cette technique est que la comparaison des sommets et des os est très spécifique et est liée à la façon dont cette comparaison est effectuée. Il est possible d'utiliser des animations pour plusieurs modèles différents, mais chaque modèle individuel dans lequel vous souhaitez utiliser le squelette doit être associé à des os. La raison en est que les animations déplacent les sommets de leur position d'origine par rapport à leurs squelettes. Si les sommets ne sont pas dans les positions attendues, des problèmes surviendront.


Si le modèle ne correspond pas au squelette utilisé par elle, les animations seront complètement incorrectes.


Si nous rendons le personnage deux fois plus large, nous obtenons un effet similaire aux «beignets suralimentés» de Drake , mais il est à noter que les animations plus proches des pinceaux deviennent incorrectes, car c'est là qu'elles sont les plus éloignées de leurs positions d'origine.

La première animation peut vous sembler étrange - de telles animations glitch se produisent très souvent dans les jeux. Habituellement, ils sont causés par le fait que des animations incorrectes sont appliquées au squelette ou que le modèle utilise le mauvais squelette. Comme dans le cas des textures et des modèles, le squelette, le skinning et le modèle doivent être comparés très soigneusement, sinon les résultats se révéleront rapidement tristes.

J'espère que vous avez une idée de l'objectif des vertex shaders et que vous comprenez comment les animations sont utilisées pour transformer un modèle statique en personnage vivant.

Source: https://habr.com/ru/post/fr430930/


All Articles