Ce qui est normal en OpenGL?
J'ai entendu dire que je devrais utiliser les normales à la place des couleurs, car les couleurs sont obsolètes. (Est-ce vrai?) Les normales ont quelque chose à voir avec la réflexion de la lumière, mais je ne peux pas trouver un clair et intuitif explication. Ce qui est normal?
OriginalL'auteur mk. | 2011-05-06
Vous devez vous connecter pour publier un commentaire.
Un normal en général est un vecteur unitaire, dont la direction est perpendiculaire à une surface en un point précis. Par conséquent, il vous indique la direction dans laquelle une surface est confrontée. Les principaux cas d'utilisation pour les normales sont calculs d'illumination, où vous devez déterminer l'angle (ou pratiquement souvent son cosinus) entre la normale à un point de la surface et la direction d'une source de lumière ou d'un appareil photo.
Même si il est évident que le cas où la surface est en face de vous encore besoin de fournir cette information pour être en mesure de faire des calculs d'illumination, et les normales sont un peu le niveau moyen de le faire. Pour de simples plat de l'ombrage d'un maillage triangulaire, vous pouvez facilement calculer les normales à partir du triangle de sommets.
Pour plus d'ombrage réaliste, les normales le plus souvent varier en douceur. Ceci est souvent réalisé par interpolation des normales de la surface, soit par interpolation entre la face normales ou vertex normals. Face normales sont faciles à obtenir (comme le plat, ombragé cas), mais difficile à interpoler. Vertex normals sont faciles à interpoler (voir l'éclairage de Phong), mais pas si facile à calculer pour un maillage. C'est pourquoi vertex normals sont souvent calculés à l'avance et fourni avec le maillage.
En fait, il n'est pas nécessaire qu'un vecteur normal d'être unité de longueur. C'est une pratique de la propriété, mais par la définition la plus stricte d'un vecteur est normal tant qu'il est perpendiculaire à la surface de la tangente en un point. Lorsqu'une unité de longueur normale est, il est une forme particulière connue comme "l'unité de la normale".
OriginalL'auteur Thies Heidecke
Beaucoup de choses sont maintenant obsolètes, y compris les normales et les couleurs. Cela signifie simplement que vous avez à mettre en œuvre vous-même. Avec les normales, vous pouvez l'ombre de vos objets. C'est à vous de faire les calculs, mais il y a beaucoup de tutoriels sur, par exemple, Gouraud/éclairage de Phong.
Edit: Il y a deux types de normales: visage normales et les normales des sommets. Face normales point du triangle, vertex normals point à partir du sommet. Avec vertex normals vous pouvez obtenir une meilleure qualité, mais il ya beaucoup utilise aussi pour le visage normales, par exemple, ils peuvent être utilisés dans la détection de collision et des volumes d'ombre.
Prenez un morceau de papier et tracez une ligne. Dessinez ensuite la deuxième ligne qui est perpendiculaire à la première. La deuxième ligne est la première de la normale. Maintenant, imaginez que la première ligne est un triangle de la surface. La première ligne de bords sont des sommets.
Les normales sont unité de longueur des vecteurs. Ainsi, une normale (1, 0, 0) des points de la droite. Lorsque vous envoyez des sommets à être rendu, vous pouvez également envoyer des normales. Alors vous faites le calcul de l'éclairage dans le shader.
Non, ils ne le sont pas. Unité de normales unité de longueur des vecteurs, mais normales sont simplement les vecteurs sont perpendiculaires à la surface. Maintenant, puisque la majorité des applications de normales fonctionnent mieux lorsqu'elles sont unité de longueur, la plupart du temps, vous rencontrez un normal, il sera l'unité de la normale.
OriginalL'auteur SurvivalMachine
glNormal
exemple minimalglNormal
est obsolète OpenGL 2 méthode, mais elle est simple à comprendre, de sorte que nous allons examiner. Le moderne shader alternative est discuté ci-dessous.Cet exemple montre quelques détails de la façon dont
glNormal
fonctionne avec diffuse la foudre.Les commentaires de la
display
fonction d'expliquer ce que chaque triangle signifie.Théorie
En OpenGL 2 chaque sommet possède sa propre associé un vecteur normal.
Le vecteur normal détermine la luminosité du sommet est, qui est ensuite utilisé pour déterminer la luminosité du triangle.
OpenGL 2 utilisé le Phong modèle de réflexion, dans lequel la lumière est séparée en trois composantes: ambiante, diffuse et spéculaire. De ceux, diffuse et spéculaire composants sont affectés par les normal:
glNormal
définit le vecteur normal, qui est utilisé pour toutes les suivantes sommets.La valeur initiale de la normale avant de tous nous
glNormal
est0,0,1
.Vecteurs normaux doit avoir de norme 1, sinon les couleurs changent!
glScale
modifie également la longueur de normales!glEnable(GL_NORMALIZE);
fait OpenGL règlent automatiquement leur norme de 1 pour nous. Ce GIF illustre magnifiquement.Pourquoi il est utile d'avoir des normales par des sommets au lieu de par les visages
Les deux sphères ci-dessous ont le même nombre de polygones. L'un avec les normales aux sommets semble beaucoup plus lisse.
OpenGL 4 fragment shaders
Dans les nouvelles versions d'OpenGL API, vous passez à la direction normale de données pour le GPU que l'arbitraire d'un bloc de données: le GPU ne sais pas ce que cela représente pour les normales.
Ensuite, vous écrivez écrite à la main fragment shader, qui est l'arbitraire d'un programme qui s'exécute dans le GPU, qui se lit normal des données que vous lui transmettez, et met en œuvre quelle que soit la foudre de l'algorithme que vous voulez. Vous pouvez mettre en œuvre Phong efficacement si vous en avez envie, par la main le calcul de certaines point des produits.
Cela vous donne une flexibilité totale pour modifier la conception d'un algorithme, qui est l'une des principales fonctionnalités des cartes Graphiques modernes. Voir: https://stackoverflow.com/a/36211337/895245
Des exemples de ce qui peut être trouvé dans l'un des "modernes" OpenGL 4 tutoriels, par exemple https://github.com/opengl-tutorials/ogl/blob/a9fe43fedef827240ce17c1c0f07e83e2680909a/tutorial08_basic_shading/StandardShading.fragmentshader#L42
Bibliographie
merci pour les commentaires, quelle est la meilleure façon de le faire maintenant?
C'est en utilisant le vertex shader et puis de transmettre les données au fragment shader. Je vous conseille de lire à ce jeu génial tutorial:www.learnopengl.com
OriginalL'auteur Ciro Santilli 新疆改造中心 六四事件 法轮功