2010-09-19 14 views
4

http://www.lighthouse3d.com/opengl/glsl/index.php?ogldir2 indique que la moitié du vecteur dans le contexte OpenGL est 'Position de l'œil - Position de la lumière', mais il continue en disant 'heureusement OpenGL le calcule pour nous' [qui est maintenant obsolète]. Comment peut-on, en pratique, être calculé (un exemple simple serait grandement apprécié) [surtout, cela me demande ce qu'est "Eye" et comment il peut être dérivé].Qu'est-ce que Half vector dans GLSL moderne?

Au moment où je réussi à faire fonctionner les calculs spéculaires (avec un bon résultat visuel) avec la moitié vecteur étant égale à la lumière où la lumière est

vec3 Light = normalize(light_position - vec3(out_Vertex)); 

Maintenant, Je ne sais pas pourquoi cela a fonctionné.

[Si au moins je savais ce que « yeux » et comment il peut être dérivé pratiquement.]

Répondre

4

Dans le fragment shader les coordonnées du sommet peut être considéré comme un vecteur qui va de la caméra (ou le " oeil "du spectateur" au fragment courant donc en inversant la direction de ce vecteur nous avons alors le "Eye" -vector que vous recherchez. Lors du calcul du demi-vecteur, vous devez également être conscient de la direction du vecteur de la position de la lumière, sur la page Web que vous liez, ils ont ce point sur la surface, sur http://en.wikipedia.org/wiki/Blinn%E2%80%93Phong_shading_model son pointage loin de la surface.

+0

Vous dites Eye est seulement 1/out_Vertex.x, 1/out_Vertex.y, 1/out_Vertx.z? –

+0

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

4

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);