Rendu du panneau d'affichage sans distorsion?

8

J'utilise l'approche standard du panneau d'affichage dans Unity qui est OK, mais pas idéale:

transform.LookAt(camera)

Le problème est que cela introduit une distorsion vers les bords de la fenêtre, d'autant plus que l'angle du champ de vision augmente. Cela ne ressemble pas au panneau d'affichage parfait que vous verriez par exemple. Doom en voyant un ennemi sous n'importe quel angle et indépendamment de l'endroit où il se trouve dans l'espace d'écran.

De toute évidence, il existe des moyens de fusionner une image directement dans la fenêtre, centrée autour d'un seul sommet, mais je ne suis pas passionné par les shaders.

Quelqu'un a-t-il des échantillons de cette approche (GLSL si possible), ou des suggestions sur les raisons pour lesquelles cela n'est généralement pas fait de cette façon (par rapport à la méthode de transformation quadruple susmentionnée)?

EDIT: J'étais confus, merci Nathan pour les avertissements. Bien sûr, amener les quads à regarder la caméra ne les fait pas être parallèles au plan de vue - ce dont j'ai besoin.

Ingénieur
la source

Réponses:

4

Je suis confus par votre question car dans une projection en perspective standard, dessiner un panneau d'affichage parallèle au plan de vue n'introduit pas de distorsion. Cela revient à associer l'image à la fenêtre avec une certaine mise à l'échelle, où la mise à l'échelle dépend de la profondeur (distance perpendiculaire au plan de vue).

La "distorsion" que vous voyez peut se produire si le système oriente réellement les particules vers la caméra plutôt que vers le plan de vue; ce qui provoque une asymétrie près des bords de l'écran. Ou, vous voyez peut-être que l'échelle du sprite change lorsque vous faites pivoter la caméra, car lorsque la distance est mesurée par rapport au plan de vue plutôt qu'à la caméra, le sprite se rapproche et devient donc plus grand lorsqu'il disparaît de l'écran.

Nathan Reed
la source
1
@NickWiggill Je ne connais pas spécifiquement Unity, mais si vous voulez que les quads soient face au plan de vue plutôt que face à la caméra, vous définissez essentiellement la matrice de rotation du quad égale à la matrice de rotation de la caméra. Vous pourriez avoir besoin d'une rotation supplémentaire de 180 degrés en fonction de la façon dont les quads sont construits.
Nathan Reed
1

Je crois que vous pouvez définir la matrice 3x3 supérieure (en langage colonne) à l'identité pour ce faire. Je ne vois aucune raison pour laquelle vous ne pourriez pas faire cela dans le shader, mais vous pourriez faire plus de travail de cette façon. Vous perdriez de l'échelle (dans votre matrice de xformation) de cette façon.

Edit: cet article m'a été utile pour les panneaux d'affichage et les imposteurs:

http://www.flipcode.com/archives/Billboarding-Excerpt_From_iReal-Time_Renderingi_2E.shtml

Je ne sais pas à quel point c'est conventionnel, mais je l'appelle "imposteur" quand la perspective est maintenue et "panneau d'affichage" quand ce n'est pas le cas.

notlesh
la source
J'ai réalisé quelque chose. J'utilise Unity iOS / Android, et certains des anciens appareils sont OpenGL ES 1.1 - donc un pipeline fixe. Donc, le faire sans shader est la clé ici. Comment pourrais-je procéder sans le faire dans le shader?
Ingénieur
1
C'est probablement la façon la moins chère de le faire de toute façon. Dans mon code, j'ai un drapeau sur mes sprites qui dicte si le panneau d'affichage ou l'imposteur avant de faire des appels de tirage. Lorsque c'est le cas, je prends simplement la matrice actuelle, définit le 3x3 supérieur sur l'identité, puis met à jour la matrice actuelle.
notlesh
Ah ... j'apprécie le détail supplémentaire mais comme je n'ai pas accès aux appels GL (Unity résume ça), je pense que je suis plutôt foutu de cette approche.
Ingénieur
Vous ne pouvez pas obtenir ou définir la matrice actuelle? Je n'ai jamais utilisé l'unité ... Sinon, essayez peut-être de rechercher "billboarding d'unité" ou "
imposture d'