Je viens d'avoir une idée pour mon jeu en cours fait avec opengl en c ++: j'aimerais avoir un grand contour (5-6 pixels) sur plusieurs objets qui se chevauchent lorsque le joueur gagne quelque chose.
Je pensais que la meilleure façon était d'utiliser le tampon de pochoir, mais c'est quelques heures que j'essaie de faire un rendu hors écran du tampon de pochoir et je ne peux obtenir aucun résultat, donc probab. il y a d'autres techniques!
Voici ce que je veux obtenir:
Des idées?
Réponses:
Voici le code adapté d'un code de gabarit webGL que je travaille:
Je pense que j'ai utilisé cette approche dans les jeux RTS pour dessiner des halos autour des unités sélectionnées, mais c'était il y a longtemps et je ne me souviens pas s'il y a des accrochages et toutes les nuances.
la source
Commencez par trouver tous les groupes d'objets, où un groupe d'objets est une collection d'objets qui se chevauchent. La détection de collision standard devrait faire l'affaire. Attribuez à chaque groupe une couleur unique. N'importe quelle couleur ferait l'affaire.
Rendez tous vos objets en couleurs unies, en utilisant la couleur de groupe, à une texture.
Créez une nouvelle texture de contour avec les mêmes dimensions que la cible de rendu. Parcourez chaque texel de la cible de rendu et déterminez s'il s'agit d'une couleur différente des texels environnants. Si c'est le cas, changez le texel correspondant dans la texture de contour en la couleur de ligne souhaitée.
Enfin, prenez cette texture de contour et rendez-la sur le dessus de l'image que vous souhaitez dessiner à l'écran (vous pouvez bien sûr le faire en même temps que la détection de bord dans un fragment shader et éviter de créer la texture de bord dans le premier endroit).
Si vous effectuez cette étape sur le processeur en utilisant une boucle for pour parcourir les texels de la cible de rendu, cela sera assez lent, mais probablement assez bon pour tester et même utiliser dans certains cas. Pour l'utiliser en temps réel, il serait préférable de gérer cela dans un shader.
Un shader de fragment pour effectuer cette détection de bord pourrait ressembler à ceci;
Où la deuxième valeur dans la recherche texture2D est une coordonnée 2D par rapport à v_texCoord. Vous appliqueriez cela en rendant la première cible de rendu comme texture sur un quadrillage plein écran. Ceci est similaire à la façon dont vous appliqueriez des effets de flou en plein écran tels qu'un flou guassien.
La raison d'utiliser la première cible de rendu avec des couleurs unies est simplement de s'assurer qu'il n'y a pas de bord perçu entre différents objets qui se chevauchent. Si vous avez simplement effectué une détection des bords sur l'image à l'écran, vous constaterez probablement qu'il détecte également les bords aux chevauchements (en supposant que les objets ont des couleurs / textures / éclairages différents).
la source