Si les tuiles étaient un peu plus de tuiles. Dépasser les limites de l'imagination naïve

image



Quiconque a déjà réfléchi au fonctionnement de la partie graphique d'un accélérateur rétro 2D, représente approximativement la façon dont il dessine ces fameux tuiles, qui, d'ailleurs, de la définition ne doivent pas nécessairement être rectangulaires. Le carrelage est une question de carrelage. Oui, le plus souvent les développeurs de l'API matérielle le comprennent et les méthodes sont donc appelées drawRect et non drawTile. Tout rectangle peut en effet être une tuile, mais l'inverse n'est pas vrai! Et ici la question se prépare: pourquoi les accélérateurs 2D n'accélèrent constamment que recto ... La réponse simple à cette question est que tout le reste est trop compliqué pour un simple matériel. Mais ici, je dirais. Au moins une extension simple mais hautement fonctionnelle de cette abstraction de base peut être proposée, la suivante.



Je n'ai pas écrit à Habr depuis longtemps. Parce que tout le temps je voulais le faire parfaitement ... j'ai une telle maladie. Habr lui-même, quant à lui, a considérablement abaissé la barre, et je n'écris toujours pas et n'écris pas. Par conséquent, l'article d'aujourd'hui est né sans préparation d'une simple conversation avec un ami. Cependant, il y a des amis avec qui vous voulez parler profondément et en profondeur.



Que ce soit, peut-être, mon retour à la régularité. Si une telle lecture plus ou moins facile, avec une peinture précipitée, mais suffisamment suffisante pour la clarification, la narration n'est pas surchargée de détails, mais toujours avec un accent conceptuel, et comme une lampe, comme une fois, viendra à un lecteur de haber coûteux.



En d'autres termes, je recherche aujourd'hui un compromis entre la qualité du contenu et le temps que je peux y consacrer. Espoir de compréhension.



Alors, commençons…



Considérez pour un exemple la fonction générale de copier une zone rectangulaire arbitraire. Nous voyons qu'il ne s'agit que d'une double boucle à travers les lignes et à travers les éléments des lignes:



image



Notez que ce bloc de code est généralement répété de manière triviale en x4 combinaisons de sens de traversée des deux boucles pour implémenter des réflexions:



image



Une autre x2 combinaisons est donnée par la permutation de l'ordre par dst [x] [y], reflétant le long de l'axe y = x.

En cours de route, ces 8 options de réflexions sont toutes des rotations possibles par multiples de 90gr avec toutes leurs réflexions de miroir de gauche à droite.



Et maintenant, voyons comment, même avec des ajouts minimes, cet élément de base pourrait être considérablement modifié.



Peut-être que cela n'est jamais venu à l'esprit de personne, mais pourquoi une tuile ne peut-elle pas être, par exemple, un parallélépipède? Pour l'avenir, je dirai que cette extension entraîne un surcoût minimal, car pour mettre en œuvre cela, vous devez ajouter seulement quelques incréments par ligne: à



image



la suite de la combinaison avec la permutation x / y, nous obtenons un parallélépipède avec une paire de côtés toujours orientée le long d'un orthogonal, et les deux autres seront à un angle ... Que nous donne cette bagatelle reçue à bon marché? Eh bien, tout d'abord, la possibilité d'utiliser trois projections fixes:



image



si l'incrément n'est pas une constante, mais un nombre fractionnaire, l'angle de décalage peut devenir libre. Qui peut être parfaitement utilisé à la fois pour les effets de balancement des carreaux dans la molette latérale:



image



Et pour la construction de murs dans l'espace des projections isométriques:



image



Et rappelez-vous que parler fractionnaire ne signifie pas nécessairement un support flottant! Ce qu'un programmeur gâté moderne commence parfois à oublier. float est fractionnaire avec virgule flottante, mais ici, il est complètement inutile. En fait, tout processeur avec des registres doubles, où le haut de la paire peut être lu comme une valeur séparée, a un «support» pour le point fixe fractionnaire (point fixe). De plus, dans ce cas, AUCUNE instruction supplémentaire ne sera ajoutée. (Enfin, sauf que la pente sera réglée en 256 temps) Donc tout est gratuit, prenez les gars!



Une autre étape similaire que le lecteur attentif devrait demander inductivement est la répétition de cette fonctionnelle à la deuxième limite de l'énumération de la boucle intérieure. Après tout, nous pouvons découpler l'incrément de fin séparément. Et puis, dans le cas général, nous pourrons dessiner tous les trapèzes couchés avec la base sur l'un des orthogonaux (comme cas particulier des triangles):



image



Et que diable nous ont-ils abandonné? Vous penserez, mais vous devinerez immédiatement que dans deux de ces appels de dessin, vous texturez simplement un plan à partir d'hexagones orientés orthogonalement ou de losanges orientés en diagonale à partir d'un ensemble de tuiles préparé pour cela. Des cas de carrelage assez courants dans l'industrie du jeu, d'ailleurs.



À l'époque de J2ME
J2ME , . , ,



Ce serait formidable d'avoir un support matériel pour eux sur l'accélérateur:



image



ce qui est décrit plus loin est plus une fonctionnalité bonus, car vous pouvez mieux le mettre en œuvre à dessein. Cependant, si l'on parle, entre autres, uniquement de remplir la primitive avec uniquement de la couleur (ou un motif plat), pour quelques ajouts simples à l'espace de jeu existant ...



La même paire d'appels de dessin peut constituer n'importe quel triangle qui n'est pas limité aux particuliers (il est simplement coupé en deux par une ligne orthogonale le long du milieu point, c'est très similaire à son algorithme de dessin classique) Et à partir de là, vous pouvez déjà construire des constructions en perspective. À propos, à partir des trapèzes eux-mêmes, par exemple, une projection 3D fixe verticalement DOOM1 de la forme est obtenue élémentairement à bas prix:

image



Si vous le souhaitez, vous pouvez essayer de peindre avec du remplissage, même quelque chose de plus ou moins gros voxel. Selon les degrés de liberté de la projection, les dépenses de tirage plus ou moins appellent. Les deux premières projections en perspective ci-dessous sont fixes, mais chacune a 4 vues symétriques - pour un total de 8 angles d'affichage. Le troisième est un cas courant et n'est fixé que verticalement. En tournant autour de l'axe vertical, il alternera entre le premier et le second:



image



Il est préférable de diviser les figures en trapèzes en morceaux plus allongés le long de l'orthogonale de la coupe, dans la mesure du possible, car la fonctionnalité d'appel supplémentaire, bien que peu coûteuse, est associée à des itérations du seul cycle externe, dont il est souhaitable qu'il y en ait moins. En fait, cela est vrai même pour dessiner l'algorithme de base du rectangle - le dessin horizontal est plus efficace que le dessin vertical.



Il est possible d'effectuer une texturation en perspective sur la fonctionnalité bonus dans ces appels, mais cela nécessite la mise en œuvre d'une mise à l'échelle fractionnaire et est associé à l'introduction de coefficients de divergence supplémentaires pour src, et de coefficients de décimation, qui, de plus, devront être calculés en dynamique en 3D de manière plutôt tordue, ce qui n'est pas conseillé pour cela architecture simple.



Eh bien, mettant fin à la vengeance devant Habr pour mon propre intérêt, je ne peux toujours pas m'empêcher d'expliquer brièvement d'où vient algébriquement toute cette magie des coefficients d'incrémentation. La formule de la droite y = kx + b, qui est enseignée dans les écoles, nous envoie deux bonjour ici deux fois à la fois. Tous les coefficients se sont avérés utiles à leur place:



image



pourquoi n'ai-je pas rencontré d'accélérateurs matériels 2D avec une telle implémentation de tuiles, je ne peux que deviner:



  • Le concept de Tile était un modèle tellement rigide dans la pratique que personne ne pensait pouvoir faire un peu plus ... obtenir beaucoup plus.
  • Soit personne ne voulait dépenser ne serait-ce que quelques cycles d'horloge sur de telles fonctions, car ils n'analysaient pas les conséquences généralisées décrites, soit les développeurs d'alors avec des jeux simples n'ont pas créé de demande pour eux. Néanmoins, il y avait mode7 (un algorithme de triche pour implémenter la texturation en perspective, via la sortie de morceaux de sprites rectangulaires sur du matériel avec prise en charge de la mise à l'échelle fractionnaire)
  • Ou je ne suis pas assez vieux et j'ai besoin de vieillir ...



All Articles