2010-09-26 7 views
8

J'apprends à utiliser des cartes normales (éclairage par pixel?) Dans des graphiques 2D avec OpenGL. Nouveauté de la cartographie normale, j'ai réussi à enrouler ma tête autour de l'opérateur Sobel et la génération de cartes normales (principalement grâce à this), ce qui crée un tableau (2D) de normales à partir d'un tableau (2D) de pixels Les données.Comment appliquer une carte normale dans OpenGL?

(La plupart des tutoriels et les discussions du forum que j'ai trouvé étaient spécifiques à la 3D utilise et logiciel de modélisation. Je vise à mettre en œuvre moi-même cette fonctionnalité, en C++.)

  • Que dois-je faire une fois que je avez-vous la carte normale ? Je dois l'enregistrer avec OpenGL?
  • A-t-il besoin d'être associé avec la texture, si oui, comment fait-il ?
  • Comment est-il mappé à un quad texturé 2D ?
  • (Est-ce quelque chose que je peux faire sans shaders/GLSL?)

Répondre

6

Je vous recommande de regarder:

This nvidia presentation on bumb mapping

Je ne l'ai pas regardé pendant un certain temps, mais je me souviens qu'il passe au-dessus de la plupart des détails dans la mise en œuvre d'un shader bump map, devrait obtenir un quelques idées en cours d'exécution.

This other nvidia tutorial for implementing bump mapping in the cg shader langauge

This bump mapping tutorial might also be helpful. Je sais que tout cela n'est pas pour une cartographie normale complète, mais c'est un bon début.

De même, bien qu'il existe des différences dans les langages de shader, il ne devrait pas être trop difficile de convertir les formulateurs entre eux si vous voulez utiliser GLSL.

Comme ybungalobill dit, vous pouvez le faire sans shaders, mais à moins que vous travaillez sur un projet éducatif (pour vos études) ou un dispositif embarqué particulier, je ne sais pas pourquoi diable vous voudrait - mais si vous avez besoin de this est l'endroit où vous voulez regarder, il a été écrit avant les shaders, et mis à jour pour les référencer plus tard.

+0

Merci, la présentation nVidia et les 3DKingdoms sont super. J'ai vu un paulsprojects un, mais j'étais perdu quand il a commencé sur des cartes de cube. – zyndor

5
  • Que dois-je faire une fois que j'ai la carte normale?
  • Ai-je besoin de l'enregistrer avec OpenGL?

Oui, vous devez le charger en tant que texture.

  • -t-il besoin d'être associé à la texture, si oui, comment est-il fait?

Si vous voulez dire associé à la texture de couleur, alors non. Vous devez créer une texture qui contient la carte normale afin de l'utiliser plus tard avec OpenGl.

  • Comment est-il mis en correspondance avec un quad texturé 2D?

Votre carte normale est juste une autre texture, vous le liez et carte comme toute autre texture. La carte normale stocke les normales dans les coordonnées de l'espace tangent, donc pour calculer l'éclairage par pixel, vous devez connaître la position relative de la source de lumière dans le système de coordonnées de l'espace tangent. Ceci est fait en définissant des paramètres supplémentaires par sommet (normal, tangent, binormal), en calculant la position de la source lumineuse dans les coordonnées de l'espace tangent et en interpolant cette position le long des triangles. Dans le fragment shader, vous recherchez la normale dans la carte normale et effectuez le calcul d'éclairage souhaité en fonction des paramètres interpolés.

  • (Est-ce quelque chose que je peux faire sans Shaders/GLSL?)

Oui, vous pouvez utiliser des extensions existantes pour programmer les fonctions de combinaison de l'environnement multi-texture. Je ne l'ai jamais fait moi-même mais ça a l'air d'enfer.

+0

super, multitexturing est ce que j'avais dans mon esprit (et oui, je vais aller avec shaders =)). Merci! – zyndor

1

le sujet est assez vieux, mais je vais le répondre pour tout débutant qui pourrait demander une aide ici:

1) & 2)

votre carte normale est comme une texture régulière diffuse, vous besoin de le charger à partir du disque, créez votre texture2D comme vous le feriez avec une texture diffuse, et le verrouiller avec les autres textures pour l'envoyer aux shaders. Donc, pour résumer, les cartes normales, les cartes de hauteur, etc. ne sont pas différentes lorsque vous les manipulez côté CPU ... elles les chargent toujours, créent la texture et les verrouillent.

3)

cartes normales sont juste un moyen de stocker Normales de chaque fragment dans une texture. Il est préférable de les utiliser avec la texture diffuse correspondante, car c'est ainsi que vous fausserez les petits détails. Néanmoins, ce n'est pas toujours nécessaire dans certains cas ... par exemple, la dernière fois que je travaillais sur un moyen de rendre l'eau ... J'ai utilisé une carte dudv, et une carte normale, mais pas la carte diffuse correspondante. utilisé pour rendre dans les textures pour atteindre la réflexion.

4)

cartes normales sont mises en correspondance avec la même texture que les coordonnées de la texture diffuse ... cela signifie que si vous avez une coordonnées Wich quad sont 0, 0, 0, 1, 1, 0, 1; 1 ce sont les coordonnées que vous utilisez pour mapper les deux textures.

5)

vous pouvez le faire sans shaders, je suppose ... vous pouvez même le faire sans OpenGL si vous voulez ... shaders sont conçus pour ce genre d'opérations, et il sera plus facile de fais ça avec les shaders.Ainsi, les cartes normales sont des textures qui codent des vecteurs normaux en couleurs ... un vecteur normal est un vecteur 3D et les couleurs sont également des vecteurs 3D. Lorsque vous utilisez l'éclairage, vous envoyez habituellement vos normales du vertex shader au fragment shader ... le fragment shader va interpoler la valeur du vertex normal pour trouver une approximation du propre vecteur normal du pixel. cela est fait par défaut ...

Avec les cartes normales, vous n'utilisez pas un vecteur normal de sommet, mais le vecteur normal codé dans la texture. D'abord, vous devrez convertir le calcul d'éclairage de l'espace du monde en espace tangent. Cela se fait dans le vertex shader. Ensuite, vous allez échantillonner votre carte normale dans le fragment shader comme une texture habituelle. Vous obtiendrez une couleur RVB de votre pixel. vous devrez convertir cette valeur en un vecteur normal, c'est-à-dire la multiplier par 2 et soustraire 1, c'est-à-dire, rgb * 2 - 1, puis l'utiliser comme vecteur normal dans le calcul d'éclairage.

Questions connexes