Comment créer plusieurs spots 2D?

12

Je cherche à créer un effet "spotlight" 2D qui permet de mettre en lumière plusieurs entités. C'est-à-dire, comme si plusieurs sprites tenaient des torches. Pour une seule entité (un projecteur), j'utilise une technique où je superpose un sprite dégradé et que le point central chasse cette entité. Cette technique fonctionne bien pour un seul projecteur. Voici une capture d'écran pour illustrer ce dont je parle:

Projecteur unique - Travaux

Effet Spotlight avec un projecteur

Le problème que je rencontre est que cette technique ne s'étend pas à plusieurs entités. Si je superpose une autre image de projecteur, je rencontre plusieurs problèmes. Voici une capture d'écran simulée:

Projecteurs multiples = problèmes

Effet Spotlight avec deux spots

Le problème le plus évident est les coins visibles. Cela pourrait être résolu en rendant l'image du projecteur gigantesque pour couvrir tout le niveau, mais cela ne semble pas correct. Le deuxième problème, plus insoluble, est que je multiplie efficacement l'obscurité avec cette technique. Ainsi, chaque sprite ajouté a pour effet d'assombrir tout le monde. De toute évidence, j'aborde ce problème de manière incorrecte.

Des idées?


Efforts continus

Il y a eu une discussion sur les options de mélange dans les commentaires. Voici ma pensée actuelle. Dans mon exemple de projecteur unique ci-dessus, j'utilise un fichier image qui ressemble à ceci: (j'ai remplacé la transparence par la couleur verte pour faciliter l'illustration)

Approche de transparence

Comme discuté ci-dessus, le problème est que le mélange alpha de cette image avec une autre image ne produira pas l'effet souhaité. Au lieu de cela, il produira ceci:

Superposition de deux cercles de transparence

Cela ne me semble pas être un problème d'options de mélange. Le problème, il me semble, est que ce type d'image a le masque de transparence et l'image (un carré noir) intégrés, alors qu'ils devraient être séparés.

Donc, au lieu d'une image noire avec une transparence découpée intégrée, je devrais utiliser des masques de transparence qui sont utilisés au moment de l'exécution contre le carré noir. En faisant cela, je ne peux toujours pas utiliser un masque de transparence blanc et noir traditionnel ou il rencontrera le même problème. Voici un exemple, cette fois le blanc et le noir représentent le blanc et le noir:

Masque de transparence

La solution, semble-t-il, serait d'appliquer un masque de transparence qui utilise lui-même la transparence. Quelque chose comme ça: (vert = transparent)

Masque de transparence avec transparence

De cette façon, plusieurs masques de transparence pourraient être mélangés alpha et ensuite utilisés comme un masque de transparence contre le carré noir. Voici un exemple de deux des masques de transparence alpha mélangés ensemble:

Deux masques de transparence avec transparence

Quoi qu'il en soit, c'est l'approche que je travaille à mettre en œuvre. Je publierai les résultats si cela fonctionne. Ce que je ne sais pas (actuellement), c'est si je peux utiliser un masque de transparence qui a lui-même de la transparence.

Cameron Fredman
la source
En y réfléchissant, il semble que je devrais déplacer les masques de transparence et les appliquer à une grande texture noire. Je ne sais pas comment cela serait fait.
Cameron Fredman
7
Je ne sais pas comment vous créez ou appliquez vos dégradés, mais cela pourrait être un problème de mélange, où si vous utilisez le bon mélange, cela fonctionnera bien. Nous aurions besoin de plus d'informations sur les textures.
dennmat
J'utilise AndEngine comme framework, et une grande partie du mélange se déroule en arrière-plan, bien qu'il existe un "setBlendFunction ()" disponible.
Cameron Fredman
En regardant ce à quoi vous avez lié, je dirais que vous voulez probablement la deuxième solution répertoriée en bas ou la troisième si cela ne fonctionne pas. Je ne suis pas clair sur andEngine, et ils ne semblaient pas avoir de documents, peut-être que si vous ne trouvez pas votre réponse dans ce fil, ils pourront peut-être aider davantage, car il semble qu'ils jouent déjà avec le mélange beaucoup d'options dans les coulisses.
dennmat
Bien que ce fil semble résoudre votre problème en premier lieu, avez-vous la version incluant ce changement?
dennmat

Réponses:

3

Conceptuellement, la solution à plusieurs projecteurs consiste à:

  1. Commencez avec un tableau entièrement noir pour conserver les valeurs d'éclairage pour chaque pixel de la scène.
    • Zéro représentera une zone de l'image sans aucune lumière.
    • 100% représentera une zone complètement saturée de lumière du jour.
    • Si vous voulez avoir de la fantaisie, vous pourriez avoir une valeur supérieure à 100% (disons, 200%) représentant une zone de l'image qui est sursaturée et brouille le tout dans un blob blanc aveuglant de pixels. Inquiétez-vous de cela plus tard, et limitez simplement les valeurs entre 0 et 100% pour le moment.
  2. Pour chaque source de lumière à l'intérieur de l'écran ou suffisamment près du bord que son halo ajouterait à la lumière, ajoutez les valeurs de lumière de cette source de lumière à votre tableau de valeurs de lumière pour les pixels de la scène.
  3. Utilisez le tableau de valeurs lumineuses résultant pour modifier les pixels de votre scène de telle sorte que:
    • Les pixels éclairés par 0% de lumière sont noirs.
    • Les pixels éclairés par 100% de lumière ont leur couleur normale.
    • Les autres pixels sont une couleur intermédiaire.
    • Vous semblez déjà savoir comment faire cette étape, à en juger par vos captures d'écran.

L'astuce consiste à comprendre que le mélange alpha peut effectuer une ou plusieurs de ces étapes. Le mélange alpha se réfère simplement à l'utilisation d'une carte / image alpha pour modifier les pixels d'une image ou d'une texture de manière simple. Cela signifie également généralement que ce sera un ensemble rapide de fonctions, ou implémenté avec des commandes matérielles spéciales, pour le rendre rapide. Vous pouvez le faire avec des tableaux réguliers et des commandes de langage normal, mais l'utilisation des fonctions spéciales de la bibliothèque alpha / blending est probablement meilleure. ... Et n'aura pas de bugs. Parfois, cela signifie rendre les pixels partiellement transparents, mais pour votre cas, cela signifie:

  • Ajout de valeurs alpha à chaque pixel, pour construire le tableau de valeurs lumineuses à partir de # 1.
  • Utilisation du tableau de valeurs lumineuses de # 1 pour résoudre les couleurs finales des pixels de l'étape # 3.

Je commencerais à rechercher la documentation de vos fonctions de mélange alpha pour voir quelles fonctionnalités elles fournissent pour combiner différents types de pixels. Je soupçonne qu'ils auront des fonctions pour chacune des étapes que vous devrez effectuer, mais ils peuvent être sous des noms qui ne sont pas évidents.

ET
la source
Je creuse cette réponse et je vais essayer. L'idée d'un objectif flare / flou pour des valeurs supérieures à 100% est également un bonus agréable et inspirant. Publiera des mises à jour avec les enseignements tirés du processus. Merci ET
Cameron Fredman