Le demi-vecteur est utilisé dans l'éclairage spéculaire et représente la normale aux micro-imperfections de la surface qui provoquerait une réflexion de la lumière vers le spectateur. Lorsque le demi-vecteur est plus proche de la normale à la surface, davantage d'imperfections s'alignent sur la normale de la surface réelle. Des surfaces plus lisses auront moins d'imperfections pointant à l'opposé de la normale de la surface et produiront une lumière plus nette avec une chute de lumière plus importante lorsque le demi-vecteur s'éloigne de la normale normale qu'une surface plus rugueuse. La quantité de chute est contrôlée par le terme spéculaire, qui est la puissance à laquelle le cosinus entre le demi-vecteur et le vecteur normal est prise, de sorte que les surfaces plus lisses ont une puissance plus élevée. Nous l'appelons le demi-vecteur (H) car il est à mi-chemin entre le vecteur point à la lumière (vecteur de lumière, L) et le vecteur pointant vers le spectateur (qui est la position de l'œil (0,0 , 0) moins la position du vertex dans l'espace des yeux, voir le vecteur, V). Avant de calculer H, assurez-vous que le vecteur de la lumière et de l'œil se trouvent dans le même espace de coordonnées (OpenGL utilisé dans l'espace oculaire).
H = normalize(L + V)
Vous avez effectué le calcul correct, mais vos variables pourraient être nommées de manière plus appropriée. Le terme light_position n'est pas entièrement correct ici, puisque le tutoriel que vous avez cité est le tutoriel directionnel de la lumière, qui par définition, les lumières directionnelles n'ont pas de position. Le vecteur de lumière pour les lumières directionnelles est indépendant du sommet, donc ici, vous avez combiné quelques équations. Gardez à l'esprit, le vecteur de lumière est vers la lumière, donc opposée à l'écoulement des photons de la lumière.
// i'm keeping your term here... I'm assuming
// you wanted to simulate a light coming from that position
// using a directional light, so the light direction would
// be -light_position, making
// L = -(-light_position) = light_position
vec3 L = light_position;
// For a point light, you would need the direction from
// the point to the light, so instead it would be
// light_position - outVertex
vec3 V = -out_Vertex;
// really it is (eye - vertexPosition), so (0,0,0) - out_Vertex
vec3 H = normalize(L + V);
Vous dites Eye est seulement 1/out_Vertex.x, 1/out_Vertex.y, 1/out_Vertx.z? –
Non, mauvais choix de mots de ma part, ce que je veux dire, c'est que Eye = (-out_Vertex.x, -out_Vertex.y -out_Vertex.z) – Daniel