3 votes

Comment dessiner une texture sans perspective sur un plan, en utilisant des shaders OpenGL ?

J'essaie de dessiner un personnage en 2D dans un environnement en 3D. J'utilise un plan orienté vers la caméra. Cela me donne le bon résultat seulement s'il n'y a pas d'intersection en profondeur avec les murs . Désactiver le test de profondeur n'est pas la solution, car l'avion doit toujours se trouver derrière d'autres murs, portes et objets.

A.) Plane facing camera - Plane intersects with wall and objects

J'ai ensuite rendu le plan perpendiculaire, ce qui me donne le résultat souhaité pour l'intersection du test de profondeur. Cependant, le personnage 2d est maintenant déformé à cause de la perspective, et semble lui donner une grosse tête et/ou un corps plus court. Ce n'est pas le résultat que je recherche.

B.) Plane is perpendicular - Perspective deforms 2d character

Idéalement, je veux pouvoir dessiner un plan perpendiculaire à l'intersection du test de profondeur souhaité, et utiliser un shader pour dessiner la texture sans perspective (et à l'échelle). Cela permet de conserver l'intersection de test de profondeur du plan (pour les murs, les portes, les objets, etc.) et me donne les proportions correctes pour le personnage 2D.

C.) Plane is perpendicular - Texture is drawn without perspective

Mise à jour de

Peut-être qu'une autre approche consiste à utiliser des pochoirs ? Idéalement, il serait bon de ne pas les utiliser.

  • Activez le test des stencils et définissez la fonction de test et les opérations pour écrire des 1 à tous les stencils.
  • Dessinez un plan perpendiculaire.
  • Définit la fonction stencil pour passer si la valeur du stencil est égale à 1.
  • Dessinez un personnage 2d face à la caméra.
  • Désactiver le test du stencil.

Mise à jour de

Peut-être dessiné comme une réflexion plate sur le plan sans utiliser les normales ? Comme une réflexion cubique ou sphérique, mais uniquement plate. Des idées ?

0voto

Joe O'Sullivan Points 1

Ce que vous pouvez faire, c'est utiliser votre solution de A) mais changer votre valeur Z (utilisée pour le test de profondeur) pour être dans une meilleure position.

Ainsi, à la fin de votre vertex shader, vous aurez quelque chose comme ceci :

gl_Position = projModelViewMatrix * vec4(position, 1.0);

Ce qui revient à convertir votre position 3D en une position dans l'espace de l'écran. Changer gl_Position.z changera la valeur utilisée pour le test de profondeur. Vous voulez que cette valeur soit légèrement plus proche de la caméra dans cette situation.

Il peut s'avérer compliqué d'obtenir une valeur correcte, mais en supposant que votre matrice de modèle est le point situé en bas au milieu de votre sprite, en mettant à zéro votre espace mondial Z,X et en ne conservant que l'axe Y de chaque vert, vous obtiendrez une position décente avec laquelle vous pourrez effectuer un test z.

gl_Position = projModelViewMatrix * vec4(position, 1.0);
gl_Position.z = projModelViewMatrix * vec4(0.0, position, 0.0, 1.0);

*Caveats : Non testé, je n'ai pas touché à glsl depuis un moment, je tape juste ça de tête.

Bonne chance !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X