Dans cette troisième partie, où nous examinerons plus en profondeur la création de jeux 3D, nous nous concentrerons sur ce qui peut arriver au monde 3D une fois le processus de coin terminé et la scène pixellisée. La structuration est l'une des étapes les plus importantes du rendu, bien que les couleurs d'une grille bidimensionnelle de blocs colorés soient calculées et modifiées, tout ce qui se passe.

La plupart des effets visuels observés dans les jeux d'aujourd'hui dépendent de l'utilisation intelligente des textures - les jeux sans elles seraient ternes et sans vie. Alors allons-y et voyons comment cela fonctionne!

Comme toujours, si vous n'êtes pas prêt à plonger profondément dans les tissus, ne paniquez pas - vous pouvez commencer Rendu de jeu 3D 101. Mais une fois que vous avez maîtrisé les bases, lisez la suite pour notre prochain regard sur le monde des graphiques 3D.

Épisode 0: Rendu de jeu 3D 101
Expliquer les graphiques

Épisode 1: Fonctionnement du rendu de jeu 3D: rendu d'angle
Une plongée plus profonde dans le monde des graphismes 3D
Partie 2: Fonctionnement du rendu de jeu 3D: pixellisation et lancer de rayons
De la 3D au Flat 2D, POV et éclairage
Partie 3: Fonctionnement du rendu de jeu 3D: texturation
Bilineer, filtrage trilinéaire, anisotrope, cartographie des tubercules et plus

Commençons simplement

Choisissez les jeux 3D les plus vendus des 12 derniers mois et ils partageront tous une chose en commun: cartes de texture (ou juste textures). C'est un terme très courant, la plupart des gens créeront la même image en pensant aux textures: un simple carré plat ou un rectangle contenant une image d'une surface (herbe, pierre, métal, vêtements, visage, etc.).

Mais lorsqu'elles sont utilisées en plusieurs couches et assemblées à l'aide d'une arithmétique complexe, l'utilisation de ces images de base dans la scène 3D peut produire des images étonnamment réalistes. Pour voir comment cela est possible, sautons-les complètement et voyons à quoi les objets du monde 3D pourraient ressembler sans eux.




Comme nous l'avons vu dans les articles précédents, le monde 3D est composé de coins - des formes simples qui sont déplacées puis colorées. Ceux-ci sont ensuite utilisés pour créer des primitives, qui sont ensuite compressées dans une grille de pixels 2D. Puisque nous n'utiliserons pas de textures, nous devons colorier ces pixels.




Une méthode utilisable est appelée ombrage platimplique de prendre la couleur du premier sommet du matériau primitif, puis d'utiliser cette couleur pour tous les pixels couverts par la forme dans le raster. Cela ressemble à ceci:




De toute évidence, ce n'est pas une théière réaliste, au moins la couleur de la surface est fausse. Les couleurs sautent d'un niveau à l'autre, il n'y a pas de transition douce. Une solution à ce problème pourrait être d'utiliser quelque chose appelé Ombrage Gouraud.




Il s'agit d'un processus qui prend les couleurs des coins et calcule comment la couleur change le long de la surface du triangle. Mathématiques utilisées interpolation linéaireBien que cela puisse paraître fantaisiste, en réalité, si la couleur d'un côté primitif est 0,2 rouge et l'autre côté est 0,8 rouge, cela signifie que le milieu de la forme a une couleur comprise entre 0,2 et 0,8 (soit 0,5).

C'est relativement simple à faire et le principal avantage est la rapidité. De nombreux premiers jeux 3D utilisaient cette technique car le matériel qui effectuait les calculs était limité par ce qu'ils pouvaient faire.




Mais même cela a ses problèmes, car si une lumière pointe vers le centre même d'un triangle, ses coins (coins) peuvent ne pas être en mesure de le capturer correctement. Cela signifie que les reflets causés par la lumière peuvent être complètement négligés.




Alors que les ombres Flat et Gouraud font partie de l'arsenal de rendu, les exemples ci-dessus sont des candidats évidents pour l'utilisation de textures pour les améliorer. Et pour mieux comprendre ce qui se passe lorsqu'une texture est appliquée sur une surface, nous reviendrons dans le temps ... jusqu'en 1996.

Un bref historique du jeu et du GPU

Quake est un jeu historique sorti il ​​y a 23 ans Logiciel id. Bien que ce ne soit pas le premier jeu à utiliser des polygones et des textures 3D pour rendre l'environnement, ce fut l'un des premiers jeux à les utiliser tous aussi efficacement.

Une autre chose qu'il a faite a été de montrer ce qui peut être fait avec OpenGL (l'API graphique en était encore à sa première révision) et cela a également aidé à vendre le premier produit de carte graphique. Verite Commentaire ve 3Dfx Vudu.

Par rapport aux normes actuelles, Voodoo était extrêmement simple: pas de support graphique 2D, pas de rendu d'angle et juste les bases du rendu des pixels. C'était pourtant une beauté:

Il avait une puce entière (TMU) pour prendre un pixel d'une texture, puis une autre puce (FBI) pour le mélanger avec un pixel du raster. Cela pourrait prendre quelques actions supplémentaires comme créer des effets de brouillard ou de transparence, mais c'était presque cela.

Si nous prenons un aperçu de l'architecture derrière la conception et le fonctionnement de la carte graphique, nous pouvons voir comment ces processus fonctionnent.

La puce FBI prend deux valeurs de couleur et les ajoute ensemble; l'un de ceux-ci peut être une valeur d'une texture. Le processus de mélange est assez simple mathématiquement, mais diffère légèrement entre ce qui est exactement mélangé et l'API utilisée pour exécuter les instructions.

Ce que nous regardons Offres Direct3D En termes de fonctions de fusion et d'opérations de fusion, nous pouvons voir que chaque pixel est d'abord multiplié par un nombre compris entre 0,0 et 1,0. Cela détermine dans quelle mesure la couleur du pixel affectera l'apparence finale. Les deux couleurs de pixels qui sont ensuite ajustées sont ajoutées, soustraites ou dupliquées; Dans certaines fonctions, l'opération est toujours une expression logique dans laquelle quelque chose comme le pixel le plus brillant est sélectionné.

L'image ci-dessus est un exemple de la façon dont cela fonctionne dans la pratique; facteur de pixel utilisé pour le pixel gauche alpha valeur. Ce nombre est transparent pixels.

Le reste des étapes consiste à appliquer une valeur de brouillard (prise à partir d'une table de nombres créée par le programmeur, puis à faire le même calcul de mélange); faire des vérifications et des ajustements de visibilité et de transparence; avant d'écrire finalement la couleur du pixel dans la mémoire de la carte graphique.

Pourquoi une leçon d'histoire? Malgré la relative simplicité du design (en particulier par rapport aux géants modernes), le processus explique les bases de la texturation: obtenir des valeurs de couleur et les mélanger pour que les modèles et les environnements regardent à quoi cela devrait ressembler dans une situation donnée.

Les jeux d'aujourd'hui font toujours tout cela, la seule différence étant la quantité de texture utilisée et la complexité des calculs de mélange. Ensemble, ils simulent les effets visuels vus dans les films, ou comment la lumière interagit avec différents matériaux et surfaces.

Les bases de la texturation

Pour nous, une texture est une image 2D plate appliquée aux polygones qui composent les structures 3D dans le cadre affiché. Pour un ordinateur, ce n'est rien de plus qu'un petit bloc de mémoire sous la forme d'un tableau 2D. Chaque entrée du tableau représente une valeur de couleur pour l'un des pixels de l'image de texture (mieux connue) remplissage de texte - pixels de texture).

Chaque sommet d'un polygone a 2 coordonnées (généralement sen, v) vous indique quel pixel de la texture est associé à lui-même. Les sommets eux-mêmes ont 3 ensembles de coordonnées (X ve Z) et le processus d'attachement de texte aux coins. mappage de texture.

Pour voir cela en action, revenons à un outil que nous avons utilisé plusieurs fois dans cette série d'articles: WebGL de rendu en temps réel outil. Pour l'instant, z coordonner autour des coins et garder le tout dans un plan plat.

De gauche à droite, nous avons la texture sen, v coordonnées mappées directement aux coins des sommets x, y coordonnées. Puis les coins supérieurs y leurs coordonnées ont augmenté, mais la texture est étirée vers le haut car la texture leur correspond toujours directement. Dans l'image à l'extrême droite, cette fois en changeant de texture: u les valeurs ont augmenté, mais cela provoque l'écrasement et la réapparition du tissu.

Parce que bien que la texture soit maintenant effectivement plus longue, plus u sa valeur doit entrer dans le primitif - principalement la texture est partiellement répétée. C'est une façon de faire quelque chose vu dans de nombreux jeux 3D: trépéter. Des exemples courants de cela peuvent être trouvés dans des scènes avec des paysages rocheux ou herbeux ou des murs de briques.

Maintenant, préparons le terrain pour être plus primitif et nous allons remettre la profondeur en jeu. Ce que nous avons ci-dessous est une vue de paysage classique, mais la texture de la caisse est copiée et répétée parmi les primitives.

Maintenant, cette texture de poitrine est de 66 kilogrammes au format gif original et a une résolution de 256 x 256 pixels. La résolution d'origine de la partie du cadre couverte par les textures de caisse est de 1900 x 680, donc en termes de «zone» de pixels uniquement, cette zone ne devrait pouvoir afficher que 20 textures de caisse.

Évidemment, nous avons plus de 20 chemins, autant de textures de caisse en arrière-plan très Plus petit que 256 x 256 pixels. En effet, ils sont et ont traversé un processus réduction tissulaire (oui, c'est un mot!). Essayons à nouveau maintenant, mais cette fois, il s'est approché de l'un des coffres.

Notez que la texture ne mesure que 256 x 256 pixels, mais ici, nous pouvons voir qu'une texture fait plus de la moitié de la largeur de l'image de 1900 pixels de large. Il est passé par quelque chose appelé texture agrandissement des tissus.

Ces deux processus de texture se produisent toujours dans les jeux 3D, car toutes les textures appliquées aux primitives doivent être mises à l'échelle avec des polygones lorsque la caméra se déplace autour de la scène ou que les modèles se rapprochent de plus en plus. Mathématiquement, ce n'est pas un gros problème, en fait, même les puces graphiques intégrées les plus simples clignotent à un tel travail. Cependant, la réduction et l'élargissement des tissus posent en quelque sorte de nouveaux problèmes à résoudre.

Entrez des mini textures

Le premier problème à résoudre concerne les textures distantes. Si nous regardons en arrière la première image du paysage de la poitrine, ceux juste à l'horizon n'ont que quelques pixels. Il est inutile d'essayer de presser une image de 256 x 256 pixels dans une si petite zone pour deux raisons.

Tout d'abord, une texture plus petite prend moins d'espace mémoire sur la carte graphique, ce qui est utile pour essayer de tenir dans une petite quantité de cache. Cela signifie qu'il est moins susceptible d'être retiré du cache et que l'utilisation répétée de ce tissu bénéficiera pleinement des performances des données actuellement dans la mémoire à proximité. La deuxième raison pour laquelle nous venons un instant car cela dépend du même problème pour les textures zoomées.

Une solution courante à l'utilisation de gros tissus écrasés par de petits primitifs, couplage. Ce sont des versions réduites de la texture originale; Le moteur de jeu lui-même peut être construit (en utilisant la commande API correspondante pour les faire) ou préfabriqué par les concepteurs de jeux. Chaque niveau de texture mipmap a la moitié des dimensions linéaires du précédent.

Pour la texture de la caisse, quelque chose se passe: 256 x 256 → 128 x 128 → 64 x 64 → 32 x 32 → 16 x 16 → 8 x 8 → 4 x 4 → 2 x 2 → 1 x 1.

Les mipmaps sont tous emballés ensemble donc la texture est toujours le même nom de fichier, mais maintenant plus grande. La texture est conditionnée de telle manière que sen, v Ses coordonnées déterminent non seulement quel texel sera appliqué à un pixel de l'image, mais aussi à partir de quelle mipmap. Les programmeurs encodent ensuite le moteur de rendu pour déterminer le mipmap à utiliser en fonction de la valeur de profondeur du pixel carré, c'est-à-dire que s'il est trop élevé, le pixel est éloigné de sorte qu'un petit mipmap peut être utilisé.

Les lecteurs aux yeux acérés ont peut-être vu les inconvénients des mipmaps, et cela se fait au détriment des textures plus grandes. La texture d'origine de la caisse est de 256 x 256 pixels, mais comme vous pouvez le voir dans l'image ci-dessus, la texture avec les mipmaps est maintenant de 384 x 256. Oui, il y a beaucoup d'espace libre, mais l'augmentation totale d'au moins une des tailles de tissu est de 50%, quelle que soit la façon dont vous l'emballez dans des textures plus petites.

Cependant, cela ne s'applique qu'aux mipmaps prédéfinis; Si le moteur de jeu est programmé pour les reproduire correctement, l'augmentation ne peut jamais être supérieure à 33% par rapport à la taille de la texture d'origine. Vous obtenez ainsi des avantages en termes de performances et des améliorations visuelles pour une augmentation relativement faible de la mémoire dans les mipmaps de texture.

Vous trouverez ci-dessous une comparaison marche / arrêt des mipmaps de texture:

Sur le côté gauche de l'image, les textures de la caisse sont utilisées `` telles quelles '', ce qui donne un aspect granuleux et le soi-disant motifs de moiré une façon. Tandis que sur la droite, l'utilisation de mipmaps entraîne une transition beaucoup plus douce à travers le paysage où la texture de la caisse change en une couleur cohérente à l'horizon.

Cependant, est-ce que quelqu'un veut des textures floues qui gâchent l'arrière-plan de son jeu préféré?

Bilineer, trois lignes, anisotrope - tout est grec pour moi

Processus de sélection d'un pixel à partir d'une texture à appliquer à un pixel dans une image. échantillonnage de textureet dans un monde parfait, sa taille, son emplacement, sa direction, etc. peu importe, ce serait une texture qui correspond exactement à sa primitive. En d'autres termes, l'échantillonnage de texture n'est rien de plus qu'un processus de mappage pixel à pixel 1 par 1.

Comme ce n'est pas le cas, l'échantillonnage de texture doit prendre en compte un certain nombre de facteurs:

  • Le tissu a-t-il été agrandi ou réduit?
  • La texture est-elle originale ou une mipmap?
  • Sous quel angle la texture est-elle affichée?

Analysons-les un par un. Le premier est assez clair: si la texture est agrandie, il y aura plus de texte recouvrant trop le pixel dans la primitive; Avec le rétrécissement, ce sera l'inverse, chaque texel devrait maintenant couvrir plus d'un pixel. C'est un peu un problème.

Deuxièmement, il laisse les textures à un angle, car les mipmaps sont utilisés pour survoler le problème de l'échantillonnage de texture avec des primitives distantes. Et oui, c'est aussi un problème. Pourquoi? Parce que toutes les textures sont créées avec «face ouverte» pour une vue ou sont toutes de type mathématique: la normale de la surface de texture est la même que la normale de la surface affichée sur la texture.

Par conséquent, avoir trop peu ou trop de texture et avoir une texture en biais, filtrage de texture. Si vous n'utilisez pas ce processus, voici ce que vous obtenez:

Ici, nous avons remplacé la texture de la caisse par une texture de la lettre R pour montrer plus clairement à quel point elle pourrait être gâchée sans filtrage de texture!

Les API graphiques telles que Direct3D, OpenGL et Vulkan offrent toutes les mêmes types de filtrage de plage, mais utilisent des noms différents pour elles. En fait, tout se passe comme suit:

  • Échantillonnage au point le plus proche
  • Filtrage de texture linéaire
  • Filtrage de texture anisotrope

À toutes fins utiles, échantillonnage au point le plus proche S'il ne filtre pas, c'est parce qu'il s'agit du pixel le plus proche du pixel, ce qui nécessite que les textures soient échantillonnées (c'est-à-dire copiées à partir de la mémoire), puis mélangées avec la couleur d'origine du pixel.

Voici le filtrage linéaire à la rescousse. Obligatoire sen, v Les coordonnées du texel sont envoyées au matériel pour l'échantillonnage, mais au lieu d'obtenir le texel le plus proche de ces coordonnées, l'échantillonneur quatre texels. Ceux-ci sont directement au-dessus, en dessous, à gauche et à droite de celui sélectionné à l'aide de l'échantillonnage ponctuel le plus proche.

Ces 4 textiles sont ensuite mélangés selon une formule pondérée. Par exemple dans Vulkan la formule:

T "Couleur", f Pour égoutté et 1 à 4 sont quatre textiles échantillonnés. valeurs alpha ve bêta à quelle distance du point défini par sen, v les coordonnées proviennent du milieu du tissu.

Heureusement, toute personne impliquée dans des jeux 3D, qu'elle joue ou crée des jeux, se produit automatiquement sur cette puce de traitement graphique. En fait, la puce TMU de 3dfx Voodoo a fait cela: échantillonné 4 singuliers puis les a mélangés. Direct3D appelle cela bizarrement filtrage bilirear, Cependant, depuis l'époque de la puce TMU de Quake et Voodoo, les cartes graphiques n'ont pu effectuer un filtrage biliraire qu'en un seul cycle d'horloge (si la texture tient confortablement dans la mémoire proche, bien sûr).

Le filtrage linéaire peut être utilisé avec les mipmaps, et si vous voulez vraiment avoir de la fantaisie avec votre filtrage, vous pouvez prendre 4 textes d'une texture, puis 4 autres du niveau mipmap suivant et les combiner. Et le nom de Direct3D pour ça? trilinéaire filtration. Quoi tri à propos de ce processus? Votre supposition est aussi bonne que la nôtre ...

La dernière méthode de filtrage mentionnée est appelée anizotrop. Il s'agit en fait d'un ajustement du processus effectué en filtrage biliraire ou trilinéaire. Initialement degré d'anisotropie la surface primitive (et étonnamment complexe) - cette valeur modifie le rapport hauteur / largeur de la primitive en raison de son orientation:

L'image ci-dessus montre le même carré principal avec des côtés d'égale longueur; Mais à mesure qu'il s'éloigne de notre perspective, il ressemble à un rectangle carré et sa largeur augmente au-dessus de sa hauteur. Ainsi, la primitive de droite a une plus grande anisotropie que celle de gauche (et dans le cas du carré, le degré est exactement nul).

La plupart des jeux 3D d'aujourd'hui vous permettent d'activer le filtrage anisotrope, puis d'ajuster son niveau (1x à 16x), mais qu'est-ce que cela change réellement? Le paramètre contrôle le nombre maximum d'échantillons de texels supplémentaires prélevés par échantillon linéaire d'origine. Par exemple, supposons que le jeu utilise un filtrage biliraire anisotrope 8x. Cela signifie qu'au lieu de prendre simplement 4 valeurs de texte, il renverra 32 valeurs.

Le clair que l'utilisation du filtrage anisotrope peut remarquer:

Faites simplement défiler un peu vers le haut et comparez le point d'échantillonnage le plus proche pour un filtrage trilinéaire anisotrope 16x maximum. Si doux, presque délicieux!

Mais il doit y avoir un prix à payer pour toute cette belle saveur de texture de beurre, et c'est définitivement la performance: tout filtrage trilinéaire anisotrope maximum apportera 128 échantillons d'une texture pour chaque pixel rendu. Même pour le meilleur des derniers GPU, cela ne peut pas être fait en un seul cycle d'horloge.

Si nous obtenons quelque chose comme AMD Radeon RX 5700 XTChacune des unités de texture à l'intérieur du processeur peut désactiver 32 adresses de texels dans un cycle d'horloge, puis charger 32 texels de la mémoire (chacune de 32 bits de taille) dans un autre cycle d'horloge, puis en mettre 4 ensemble. Par conséquent, il a été mélangé pour 128 échantillons de texel nécessitant des cycles d'au moins 16 heures.

Maintenant, la fréquence d'horloge de base du 5700 XT est de 1605 MHz, donc seize boucles ne prennent que 10 nanosaniye. Ceci est pour chaque pixel dans une image 4K uniquement une l'unité de texture ne prendrait encore que 70 millisecondes. D'accord, peut-être que la performance n'est pas si importante!

Même en 1996, les goûts de 3Dfx Voodoo étaient assez élégants en ce qui concerne la gestion des textures. Un texel filtré biliraire par cycle d'horloge pouvait être donné au maximum et signifiait que 50 millions de texs pouvaient être coupés chaque seconde pendant que la puce TMU oscillait à 50 MHz. Un jeu fonctionnant à 800 x 600 et 30 fps ne nécessite que 14 millions de texte filtré biliraire par seconde.

Cependant, tout cela suppose que les textures sont dans la mémoire proche et qu'un seul texte est mappé sur chaque pixel. Il y a vingt ans, l'idée de devoir appliquer plus d'une texture à un principe était presque totalement étrangère, mais maintenant c'est monnaie courante. Voyons pourquoi ce changement s'est produit.

Éclairer le chemin vers des images magnifiques

Pour vous aider à comprendre comment le tissage est devenu si important, jetez un œil à cette scène de Quake:

Cette image sombre était la nature de ce jeu, mais vous pouvez voir que l'obscurité n'est pas la même partout - les taches sur les murs et le sol sont plus lumineuses que les autres pour donner une sensation d'éclairage globale dans cette zone.

Les primitives qui composent les côtés et le sol ont la même texture qui leur est appliquée, mais il existe une deuxième texture appelée. carte lumineusesont mélangés avec des valeurs de texel avant d'être mis en correspondance avec des pixels carrés. Pendant les jours de Quake, les cartes lumineuses étaient précalculées et créées par le moteur de jeu et utilisées pour générer des niveaux de lumière statiques et dynamiques.

L'avantage de leur utilisation était que des calculs d'éclairage complexes étaient effectués sur des textures plutôt que sur des coins, améliorant spécifiquement l'apparence d'une scène et coûtant peu de performances. Ce n'est évidemment pas parfait: comme vous pouvez le voir sur le terrain, la frontière entre les zones éclairées et celles dans l'ombre est très nette.

À bien des égards, une carte de lumière n'est qu'une autre texture (rappelez-vous qu'ils ne sont rien de plus que des tableaux de données 2D), donc ce que nous examinons ici est l'utilisation précoce de ce que l'on appelle. multi-tissus. Comme son nom l'indique, il s'agit d'un processus dans lequel deux textures ou plus sont appliquées à un principe. L'utilisation de cartes légères dans Quake était une solution pour surmonter les limites de l'ombrage Gouraud, mais à mesure que les capacités des cartes graphiques se développaient, les applications multi-lecteurs augmentaient également.

3Dfx Voodoo, comme les autres cartes de son âge, était limité à tout ce qu'il pouvait faire dans un rendu passer. Il s'agit essentiellement d'une séquence de rendu complète: de la manipulation des coins à la pixellisation de l'image, puis au changement des pixels en un tampon d'image final. Il y a vingt ans, les jeux avaient presque toujours une passe.

En effet, cela coûte cher en termes de performances, car vous souhaitez traiter les coins deux fois, appliquez simplement plus de texture. Quelques années après Voodoo, nous avons dû attendre qu'il soit disponible pour pouvoir rendre les cartes graphiques ATI Radeon et Nvidia GeForce 2 multi-tirages en une seule passe de rendu.

Ces GPU avaient plus d'une unité de texture par segment de rendu de pixel (en d'autres termes, ligne de tuyau) c'était donc un jeu d'enfant d'apporter un texel filtré biliraire à partir de deux textures séparées. Cela a rendu le light mapping encore plus populaire et a changé les valeurs de lumière en fonction des changements dans l'environnement du jeu, rendant les jeux entièrement dynamiques.

Mais il y a beaucoup plus à faire avec plusieurs textures, alors jetons un coup d'œil.

Il est normal de multiplier la hauteur

Dans cette série d'articles sur le rendu 3D, nous n'avons pas expliqué en quoi le rôle du GPU correspond vraiment à l'ensemble (nous le ferons, pas encore!). Mais si tu reviens Épisode 1et regardez tout le travail complexe sur le traitement des coins, vous pourriez penser que c'est la partie la plus difficile de l'ensemble de la matrice pour le processeur graphique.

Cela fait longtemps et les programmeurs de jeux ont fait de leur mieux pour réduire cette charge de travail. Cela signifiait atteindre le sac d'astuces visuelles et supprimer autant de raccourcis et d'astuces que possible, donnant la même apparence visuelle d'utiliser beaucoup de coins partout, mais de ne pas en utiliser beaucoup pour le démarrer.

Et la plupart de ces astuces cartes d'élévation ve cartes normales. Les deux rapportent que ce dernier peut être créé à partir du premier, mais pour l'instant, regardons simplement une technique appelée: cartographie des tubercules.

Le mappage de relief implique l'utilisation d'un tableau 2D appelé carte de hauteur, qui ressemble à une version unique de la texture d'origine. Par exemple, dans l'image ci-dessus, une texture de brique réaliste est appliquée sur 2 surfaces planes. La carte de texture et de hauteur ressemble à ceci:

Les couleurs de la carte de hauteur représentent les normales de la surface de la brique (nous avons couvert ce qu'est la normale Épisode 1 de cette série d'articles). Lorsque la séquence de rendu atteint le point d'application de la texture de brique à la surface, une série de calculs est effectuée pour ajuster la couleur de la texture de brique à la normale.

En conséquence, bien que les briques soient toujours parfaitement plates, elles semblent plus 3D. Surtout si vous regardez attentivement les bords des briques, vous pouvez voir les limites de la technique: la texture a l'air un peu pliée. Mais pour une astuce rapide pour ajouter plus de détails à une surface, le bump mapping est très populaire.

Une carte normale est comme une carte de hauteur, mais les couleurs de cette texture sont la normale elle-même. En d'autres termes, aucun calcul n'est requis pour convertir la carte d'élévation en normale. Vous vous demandez peut-être comment les couleurs peuvent être utilisées pour représenter une flèche dans l'espace. La réponse est simple: chaque texel est R, G, B valeurs (rouge, vert, bleu) et ces nombres sont X ve Z valeurs pour le vecteur normal.

Dans l'exemple ci-dessus, le diagramme de gauche montre comment la direction de la normale change sur une surface rugueuse. Pour représenter les mêmes normales dans une texture unie (diagramme du milieu), nous leur attribuons une couleur. Dans notre cas, R, G, B augmenter les valeurs de (0,255,0) pour plat, puis les quantités de rouge pour la gauche et de bleu pour la droite.

Notez que cette couleur n'est pas mélangée avec le pixel d'origine - elle indique au processeur dans quelle direction la normale fait face afin que la caméra puisse calculer avec précision les angles entre les lumières et la surface texturée.

Les avantages du relief et de la correspondance normale brillent vraiment lors de l'utilisation de l'éclairage dynamique dans la scène, et le processus de rendu calcule les effets des changements de lumière par pixel, et non pour chaque coin. Les jeux modernes utilisent désormais une pile de textures pour améliorer la qualité de la magie.

Ce mur d'aspect réaliste est une surface incroyablement plate - les détails sur la brique et le mortier ne sont pas réalisés à l'aide de millions de polygones. Au lieu de cela, seulement 5 textures et beaucoup de mathématiques intelligentes font le travail.

La carte d'élévation a été utilisée pour générer la carte normale afin de simuler la façon dont les briques projettent elles-mêmes des ombres et tous les petits changements de la surface. La texture de rugosité a été utilisée pour modifier la façon dont la lumière reflète différents éléments du mur (par exemple, une brique nivelée réfléchit plus uniformément qu'un mortier rugueux).

La carte finale, étiquetée AO dans l'image ci-dessus, fait partie d'un processus appelé occlusion ambiante: c'est une technique que nous examinerons plus en détail dans un article ultérieur, mais pour l'instant ce ne sont que des ombres.

La correspondance des textures est cruciale

La texturation est absolument essentielle pour la conception de jeux. Obtenez la version 2019 de Warhorse Studio Le royaume vient: le salut - Un RPG à la première personne situé dans la Bohême du XVe siècle, un ancien pays d'Europe du Moyen-Orient. Les designers ont tenu à créer un monde le plus réaliste possible pour la période en question. Et la meilleure façon de donner vie à l'acteur il y a des centaines d'années est d'utiliser chaque vue de paysage, bâtiment, ensemble de vêtements, cheveux, objets du quotidien, etc. C'était pour avoir le bon look.

Chaque texture unique de cette image unique du jeu a été créée par les artistes et leur utilisation par le moteur de rendu contrôlé par les programmeurs. Certains ont de petits détails basiques et prennent peu de place pour filtrer ou traiter d'autres textures (ailes de poulet, par exemple).

D'autres sont de haute résolution et montrent beaucoup de détails fins; Il est filtré de manière anisotrope et mélangé avec des cartes régulières et d'autres textures - il suffit de regarder le visage de l'homme au premier plan. Les différentes exigences pour texturer chaque élément de la scène ont été expliquées par les programmeurs.

Tout cela se passe dans de nombreux jeux maintenant, car les joueurs attendent plus de détails et de réalisme. Les textures grossiront et seront davantage utilisées sur une surface, mais le processus d'échantillonnage du texte et de son application aux pixels sera essentiellement le même qu'à l'époque de Quake. La meilleure technologie ne meurt jamais, quel que soit son âge!