Comment éviter les valeurs de sous-pixels dans un jeu 2D indépendant de la résolution avec projection orthographique?

8

J'essaie de faire un rendu indépendant de la résolution des sprites en mouvement dans un jeu 2D. Mon plan est de travailler dans un système de coordonnées fixe dans mon monde (par exemple 960x540) et d'utiliser une projection orthographique pour augmenter ou diminuer la taille de la fenêtre. Je fais du letterboxing pour gérer différents formats d'image.

Selon la plupart des tutoriels, je suis libre d'utiliser les dimensions que j'aime pour le tronc de vue, mais j'ai trouvé que dans de nombreux cas, cela conduit au problème que je finis par utiliser des valeurs de sous-pixels dans la fenêtre. Par exemple, un sommet en (62,62) dans un système de coordonnées de 960 x 540 se termine en (51,6666667,51,6666667) sur une fenêtre avec les dimensions 800 x 450.

J'ai remarqué deux types de problèmes avec cela:

  • l'échantillonnage de texture change tout le temps pour les objets en mouvement en fonction de la position des sommets par rapport au centre des pixels
  • mes objets sont étirés horizontalement ou verticalement d'un pixel de temps en temps en raison de l'arrondissement

Quelle est la meilleure pratique pour éviter cela (tout en conservant une indépendance de résolution en termes de vitesses de déplacement, etc.)? Et quel serait le meilleur endroit pour résoudre ce problème? Avant de passer les sommets aux shaders ou à l'intérieur du vertex shader?

Eric
la source
Comment procédez-vous au redimensionnement et aux traductions pour les adapter à la nouvelle fenêtre? Des matrices? Mettre à l'échelle et déplacer manuellement les positions des objets?
Emir Lima
@EmirLima Je multiplie les coordonnées par une matrice combinée modèle-vue-projection à l'intérieur de mon vertex shader. Toute mise à l'échelle est effectuée par la matrice de projection orthographique.
Eric
vous pouvez arrondir ou plancher les cordes, (peut-être dans le vert shader)
t123
@ tm1rbrt Merci pour votre commentaire. Je pense que je devrais soit toujours au sol ou au plafond pour éviter le pixel 1 plus ou moins en largeur ou en hauteur. J'ai essayé de le faire à l'intérieur du vertex shader, mais l'imprécision dans les calculs rend cela difficile, voire impossible. J'ai fini par recouvrir ce qui aurait dû être des entiers parfaits avec l'entier précédent.
Eric

Réponses:

1

Pour arriver à votre question principale, d'influencer ou non les sommets avant ou pendant le shader, l'utilisation d'un shader est préférable. Si vous savez comment écrire une routine qui peut prendre en compte la fenêtre et le système de coordonnées, l'utilisation d'un shader est préférable car elle permet d'ajuster de nombreux sprites en parallèle. En outre, il garantit que les coordonnées "cosmétiques" restent séparées des coordonnées dans le jeu dans le code CPU afin que l'une n'influence pas l'autre.

Vous pouvez le faire dans le vertex OU le pixel shader. Dans le pixel shader, il est possible de décaler les texels pour les verrouiller sur les pixels de l'affichage.

Dans DirectX9, je devais le faire avec HLSL afin de contourner le fait que les coins de texel étaient situés à 0,5, 0,5 par rapport au pixel , ce qui rend les textures nettes semi-floues. La correction de cela modifie l'emplacement physique des texels sans déplacer les sommets.

Dans votre cas, le décalage variera d'une image à l'autre, alors passez les vraies coordonnées de l'image-objet au shader pour calculer le décalage décimal. N'oubliez pas de SERRER l'échantillonnage de texture pour éviter de vous envelopper dans les textures.

ChrisC
la source
3

Je pense que je stockerais deux ensembles de coordonnées.

  1. Celui utilisé pour dessiner vos objets DISPLAY POSITION et
  2. une seconde utilisée pour garder un TRUE POSITION.

De cette façon, vous pouvez dessiner des sprites avec des coordonnées arrondies pour éliminer la distorsion causée par la taille fixe de votre zone de vue.

Mais cela vous permet également de conserver l'emplacement exact sans influencer la logique de votre jeu. en raison de la nature des sous-pixels, je pense également que vous ne remarquerez même pas de divergence entre la vue et la logique du jeu.

Joe
la source