2015-08-10 10 views
0

J'ai fini d'ajouter de la lumière à mon objet. Mais j'ai la plupart d'un exemple d'Internet et je veux comprendre ce que je fais. Quelqu'un peut-il m'expliquer en détail ce que chaque étape du code fait?Appliquer de la lumière à un objet dans openGL

Programme Fragment,

  • LightColor: la lumière que nous avons besoin (j'ai pris ici rouge comme exemple)
  • Brillance: combien de lumière nous voulons utiliser, peut aussi changer l'image dans une sombre
  • gl_FragColor = pour écrire la couleur totale. Mais pourquoi faisons-nous texture2D (..) + facingRatio * ...?

Programme Vertex,

-Pourquoi gl_MultiTexCoord0.xy? - Et quelqu'un peut-il expliquer comment est calculée la direction de la lumière?

varying vec2 Texcoord; 
    uniform sampler2D baseMap; 
    uniform vec4 lightColor; 
    uniform float shininess; 
    varying vec3 LightDirection; 
    varying vec3 Normal; 
    void main(void) 
    { 
float facingRatio = dot(normalize(Normal), normalize(LightDirection)); 
gl_FragColor = texture2D(baseMap, Texcoord) + facingRatio * lightColor * shininess; 
    } 






varying vec2 Texcoord; 
uniform mat4 modelView; 
uniform vec3 lightPos; 
varying vec3 Normal; 
varying vec3 LightDirection; 
void main(void) 
{ 
    gl_Position = gl_ProjectionMatrix * modelView * gl_Vertex; 
    Texcoord = gl_MultiTexCoord0.xy; 
    Normal = normalize(gl_NormalMatrix * gl_Normal); 
    vec4 objectPosition = gl_ModelViewMatrix * gl_Vertex; 
    LightDirection = (gl_ModelViewMatrix * vec4(lightPos, 1)).xyz - objectPosition.xyz; 

} 

Répondre

0

Vertex shaders

je suppose une ancienne version d'OpenGL est utilisé et c'est pourquoi gl_MultiTexCoord0.xy est utilisé. Jetez un oeil à ce page pour comprendre multitexturing et la variable intégrée.

La variable LightDirection est facile à calculer, car elle se réfère simplement à un vecteur de l'objet en direction de la source lumineuse. Ainsi, vous pouvez soustraire la position de la lumière de la position actuelle (ici: objectPosition). Dans cet exemple, ceci est fait dans l'espace-oeil, ce qui a l'avantage que la direction de la vue est facile à calculer (c'est juste vec3 (0.0.0.0,1.0)).

Les autres lignes sont juste quelques transformations graphiques habituelles de l'espace-objet d'un sommet dans l'espace-oeil. Pour transformer la normale en l'espace-oeil, au lieu de la matrice modelview la matrice normale est nécessaire. C'est l'inverse et la transposée de la matrice modelview.

Fragment shaders

Le facingRatio définit la force doit être enlightend le fragment en cours. Ainsi, le produit scalaire entre la direction normale et la direction de la lumière est utilisé pour le mesurer. Dans la ligne suivante, la couleur du fragment est calculée en lisant une couleur pour ce fragment d'une texture et en y ajoutant la couleur de la lumière.