Je voudrais partager mes souvenirs de mes tentatives pour faire du "moteur graphique 3D" "bricolage" presque à l'ère pré-Internet (comme s'il avait déjà été là quelque part, bien sûr, mais je n'en avais pas en fait). Aucune Amérique n'a pu être découverte, la révolution n'a pas eu lieu non plus, mais il y a eu beaucoup d'efforts, de tourments et d'éventails. Au fil des ans, la mémoire de nombreux événements est effacée, les détails disparaissent, les impressions s'estompent - avec de nombreux voyages, la boîte à disquettes a été perdue et il n'y a eu aucun artefact des événements décrits.
Contexte
Les 4 dernières années de scolarité ont eu lieu à l'école d'éducation physique d'Omsk, où un enfant (sauf l'éducation physique et un juron) a appris le langage C, qui, chevauchant l'intérêt pour les graphiques dans les jeux, m'a permis d'écrire quelque chose moi-même, en essayant de réaliser ce que j'ai vu dans les jeux de l'époque. . Il était déjà difficile de surprendre avec des graphismes 2D, mais Wolf 3D m'a bloqué pendant un moment. Un des camarades supérieurs a dit «oui, tout est sur les barreaux», et cela m'a permis de décoller. Puis j'ai réalisé que l'algorithme de Bresenham peut être appliqué à la mise à l'échelle de la colonne d'image et une sorte de parodie sur Wolf3D a commencé à fonctionner. Je ne cherchais pas du tout à créer quelque chose de jouable (quelle vulgarité!), J'ai aimé le processus de mise en œuvre d'algorithmes graphiques, le sentiment que vous savez comment cela se fait et que vous pouvez le faire. Lors des examens finaux, j'ai choisi de faire l'informatique et de présenter la partie «théorique» aux enseignants, très surpris par la présence d'une partie pratique. Mais une semaine avant l'examen, j'ai vu Descent - un vrai jeu en trois dimensions avec des textures. C'était quelque chose d'impossible, je savais qu'il y avait de la 3DS, mais il fallait beaucoup de temps pour rendre un dessin animé, puis il a volé sous nos yeux.
A la remise des diplômes, au lieu de repulper comme tous les enfants normaux, j'ai discuté avec des amis Duke Nukem (il est aussi chroniqueur), que j'aimais beaucoup pour son humour et sa variété. Et puis un gars m'a dit "regarde Quake". Quand j’ai regardé le kwaku, j’ai décidé que c’était suffisant pour le supporter, c’est impossible, c’est de vrais graphiques 3D, pas de colonnes - et je ne comprends absolument pas comment cela se fait.
J'étais habile en géométrie
Vous pouvez maintenant trouver des informations en 5 minutes, mais que faire alors? J'avais des livres sur les graphismes 3D, mais ils n'ont pas du tout clarifié la question. Dans la «Douma», tous les visages tournent sur l'écran en trapèze, tirer la texture se fait en étirant les colonnes. Mais en même temps, j'ai perdu de vue le fait que la non-linéarité se produit horizontalement, et en fait l'image dans la Douma n'est pas complètement réaliste. J'ai donc manqué le principe principal du graphisme 3D, découvert par Newton - "
linéarisez-le ". Ce qui deviendra la source de tous les problèmes et lancements ultérieurs.
Puisque nous savons déjà dessiner un trapèze, «dessinons» à l'écran chaque facette triangulaire. Oui, il ne peut pas être peint avec des colonnes, mais la géométrie n'est pas une chose très difficile, passons un rayon de la caméra à travers chaque pixel de l'écran et trouvons où il intersecte le visage. Il s'agit pratiquement de lancer de rayons, seulement léger! Tout étudiant écrira cette formule en 5 minutes. L'équation de la droite:
oĂą
,
ce sont les coordonnées du pixel sur le plan de l'écran,
c'est la distance de la caméra au plan de l'écran (caméra à zéro du référentiel),
- paramètre
L'équation de l'avion:
où n est normal, le paramètre (et donc les coordonnées) est facile à trouver:
Eh bien, comme c'est facile, venez au royaume de la
douleur de la division. L'ordinateur se plie bien, se multiplie assez bien (ce n'est rien de plus que des ajouts et des décalages), mais la division ... La division sur mon Pentium a pris 46 cycles d'horloge. Même si 320 à 200, même si rien de plus, alors pour chaque image, vous avez besoin de 3 millions de mesures. Et il n'y a que 100 de mon chanvre, ce qui signifie que vous ne pouvez pas aller plus vite que 30 fps en principe. Et si la résolution est augmentée de 2 fois? 7 fps? Mais le jeune passionné n'était pas gêné.
Eh bien, disons que nous avons calculé le point d'intersection avec la face, nous devons ensuite résoudre deux problèmes:
- décider de dessiner un visage dans ce pixel ou si un autre visage le chevauche
- trouver les coordonnées de texture
Arbre de tri
Bien sûr, je connaissais le Z-buffer. Mais croyez-moi, 99% des personnes qui connaissent mal le Z-buffer l'imaginent mal, tout comme je l'ai mal imaginé (il y aura une explication). Dans tous les cas, je voulais éviter les calculs inutiles (les divisions sont trop lourdes), j'ai donc décidé d'utiliser une autre technique, lue dans le livre - les arbres de partition d'espace binaire, ce sont aussi des arbres BSP. J'ai toujours aimé les arbres, la méthode de tri par un arbre m'a toujours fasciné par sa magie, et voici sa variation - j'ai débogué 8 heures en continu, mais j'ai pu!
La méthode a permis de trier les visages (en même temps, certains visages ont été coupés en parties) de sorte que lors de l'affichage, les visages «proches» étaient d'abord dessinés, puis distants. Par conséquent, si, lors du dessin du visage, j'ai vu que le pixel était déjà pris, alors nous pouvons passer en toute sécurité au pixel suivant, le problème d'ordre est résolu, il reste à tirer les textures.
Texture de papier peint de colle
Coordonnées U, V? Non, je n'ai pas entendu. Mais ne me blâmez pas, car lorsque vous collez le papier peint, vous ne pensez pas la même chose à leur sujet. Vous pensez qu'ici vous avez un bord du papier peint (vecteur de texture horizontal), ici vous avez l'autre bord du papier peint (vecteur de texture vertical), vous les posez sur le mur! J'ai donc, pour chaque face, commencé 2 vecteurs pour les bords de la texture et connaissant le point d'intersection, j'ai trouvé les coordonnées à l'intérieur de la texture.
Nous avons besoin d'un complot et d'effets.
Le rendu a gagné, mais pas vite, mais a gagné! J'ai pu faire des graphismes 3D! Mais que rendrons-nous? Nous avons besoin d'une sorte d'intrigue, de modèles, nous avons besoin d'une sorte de son.
Un marcheur ou un dépliant? Ce déambulateur est parti et ne permet pas de ressentir toute la beauté 3D, définitivement une mouche! Il y aura notre descente.
J'ai fait une plate-forme, mis plusieurs bâtiments dessus, dessiné des textures avec des fenêtres dessus, fait une fontaine de visages (cela semblait cool). Qu'allons-nous tourner? Ils ont tiré des clous dans le séisme, ce n'était pas cool. Pour une raison inconnue des culturologues à ce moment-là , le mot "boulon" (qui doit être martelé) était populaire, et j'ai réalisé que nous tirerions avec des boulons - il s'est avéré que c'était des vis - les fentes avaient l'air très bien sur les boulons enfoncés dans le bâtiment ".
L'ennemi? Eh bien, je ne pouvais pas faire de modèles de personnes, je l'ai fait ... une ambulance volante, presque cubique, a juste incliné un peu son pare-brise. Mais la texture a sauvé.
Sons. Les sons des coups de feu et des explosions et le cri que j'ai obtenu une machine volante que j'ai prise de Warcraft, la bande originale a commencé l'acoustique L'homme qui a vendu le monde - J'ai moi-même écouté du métal, mais je me suis senti désolé pour mes parents, qui ont dû écouter la même chose le soir pendant le débogage.
Dans Windows 95, les sons n'étaient pas mixés, mais elle, au profit de l'université, le professeur m'a parlé de multithreading et j'ai écrit le mixeur dans un flux séparé - un autre succès (Windows 98 sortira dans un an, où les sons sont mixés eux-mêmes et cette compétence secrète deviendra inutile).
Est-il possible de faire mieux? J'ai décidé de redécouvrir la linéarisation et j'ai pensé, que se passera-t-il si nous trouvons avec précision les coordonnées de texture pour les bords de la ligne, et l'intérieur sera fou? Je l'ai essayé - tout a commencé à fonctionner plusieurs fois plus vite, mais de graves distorsions ont commencé près des bâtiments - comme dans une salle de miroirs tordus. Correction de perspective - non, je n'ai pas entendu.
Eh bien, comme je ne l'ai pas entendu, il n'y a rien à voir avec cela, et j'ai rejeté cette option.
Presque la fin de l'histoire
Vers la fin de la première année, j'ai daigné suivre un cours spécial sur l'infographie et montré tout ce qui était au professeur. Nous avons probablement été également surpris par lui lorsqu'il a expliqué l'interpolation linéaire des coordonnées de texture et des normales, le calcul approximatif de l'illumination, l'estimation de l'erreur de perspective et sa correction, et je lui ai montré quelque chose qui fonctionnait vraiment.
Au cours de la deuxième année, j'ai essayé de tout refaire sur la base de nouvelles connaissances, mais l'année par défaut était 98, et j'ai vu le deuxième tremblement de terre sur l'accélérateur 3D - c'était fabuleusement beau. Ensuite, il n'y avait plus d'argent du tout, l'accélérateur était comme un vaisseau spatial, pour une raison quelconque, j'ai décidé que je ne l'aurais pas dans un avenir proche. Et l'intérêt pour la programmation graphique a commencé à s'estomper rapidement - mais j'ai été enthousiasmé par l'idée de traiter le son. Mais c'est une autre histoire
PS Les coordonnées de texture réelles changent de façon non linéaire, pour la vitesse, elles sont remplacées par des coordonnées linéaires. Mais qu'advient-il de la coordonnée Z, et pourquoi inversent-ils Z pendant la transformation? La réponse à cette question est donnée par le Z-buffer.