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?
la source
Réponses:
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.
la source
Je pense que je stockerais deux ensembles de coordonnées.
DISPLAY POSITION
etTRUE 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.
la source