Laboratoire 07

Éclairage en GLSL

La lumière est un facteur très important pour rendre une scène 3D aussi réaliste que possible. Avec les propriétés matérielles d'un objet, la lumière détermine le mode d'affichage de l'objet dans la scène 3D.

Il existe plusieurs modèles empiriques pour calculer la réflexion de la lumière en un point d'une surface: Phong (1975), Blinn-Phong (1977), Oren-Nayar (1994), Cook-Torrance (1981), Lambert (1760), etc.

Il existe également plusieurs modèles d'ombrage, qui spécifient la méthode de mise en œuvre du modèle de calcul de réflexion de la lumière. Plus précisément, le modèle d'ombrage spécifie où le motif de réflexion est évalué. Si nous voulons calculer l’illumination pour une surface polygonale:

  • dans le modèle d’ombrage Lambert, une seule couleur est calculée pour un polygone de surface.
  • Dans le modèle d'ombrage de Gouraud (1971), une couleur est calculée pour chaque extrémité d'un polygone. Ensuite, les couleurs des fragments de polygones sont calculées par interpolation entre les pics (interpolation linéaire des couleurs des pics pour les fragments sur les côtés et interpolation linéaire entre les couleurs des extrémités de chaque segment interne, pour les fragments internes du polygone). Le calcul des couleurs de crête peut être effectué dans le vertex shader.
  • Dans le modèle d'ombrage de Phong (1975), une normale pour chaque sommet d'un polygone est calculée. Ensuite, pour chaque fragment, une normale est déterminée par interpolation entre les normales aux pics. Ainsi, une couleur est calculée pour chaque fragment de polygone (dans fragment shader)

Figure 1. Différents motifs d'ombrage: Lambert (une couleur par primitive), Gouraud (une couleur par pic), Phong (une couleur par fragment).

Dans ce laboratoire, le modèle d'ombrage de Gouraud sur le modèle de réflexion de Phong sera discuté.

Modèle de Phong pour calculer la réflexion de la lumière

En tant que modèle de réflexion, nous continuerons à présenter un modèle qui étend le modèle de réflexion de Phong et contient les 4 composants pouvant être utilisés pour calculer l'éclairage. Pour obtenir la couleur en un point d'une surface, nous aurons les composants suivants:

  • Le composant émissif
  • La composante ambiante
  • Le composant diffusé
  • La composante spéculaire

La contribution de chaque composant est calculée en combinant les propriétés du matériau de l'objet (le facteur de luminosité, la couleur du matériau) et les propriétés de la source lumineuse (la couleur de la source lumineuse, la position de la source lumineuse).

Ainsi, la couleur finale d'un point appartenant à une surface est:

     couleur = émissive + ambiante + diffuse + spéculaire

Dans ce qui suit, nous présentons brièvement ce que les 4 composantes représentent et comment elles peuvent être calculées.

Le composant émissif

Cela représente la lumière émise par un objet et ne prend en compte aucune source de lumière. Si un objet avec une certaine couleur émissive se trouvait dans une scène complètement sombre, il apparaîtrait exactement avec cette couleur.

Une utilisation courante du composant émissif consiste à simuler la luminosité d'un objet.

Nous avons comme suit:

     emisiva = Ke

  • Ke - la couleur émissive du matériau

La composante ambiante

C'est la lumière reflétée par les objets de la scène tellement de fois qu'elle semble venir de partout.

Ainsi, la lumière ambiante ne provient pas d'une direction particulière, mais semble venir de toutes les directions. Pour cette raison, la composante environnementale est indépendante de la position de la source de lumière.

La composante environnementale dépend de la couleur du matériau environnemental de la surface de l'objet et de la couleur environnementale de la lumière.

Semblable à la composante émissive, la composante environnementale est une constante (le modèle peut être étendu en attribuant à chaque lumière ambiante une couleur ambiante).

Nous avons comme suit:

     ambiental = Ka * couleur AmbientalGlobal

  • Ka - la constante de réflexion environnementale du matériau
  • couleur AmbientalGlobal - la couleur ambiante de la lumière

Le composant diffusé

Cela représente la lumière réfléchie par la surface de l'objet de manière égale dans toutes les directions.

La quantité de lumière réfléchie est proportionnelle à l'angle d'incidence du rayon lumineux avec la surface de l'objet.

Nous avons comme suit:

     diffuse = Kd * couleurLumière * max (dot(N,L), 0)

  • Kd - constante de réflexion diffuse du matériau
  • colorLumina - la couleur diffuse de la lumière
  • N - surface normale (normalisée)
  • L - vecteur de la direction de la lumière incidente (normalisé)
  • L – vectorul direcției luminii incidente (normalizat)
  • $max(N\cdot L, 0)$ – produit scalaire N⋅ L représente la mesure de l'angle entre ces 2 vecteurs; donc, si jeest supérieur à π/ 2 la valeur du produit scalaire sera inférieure à 0, cela signifie que la surface ne reçoit pas de lumière (la source de lumière est derrière la surface) et donc la formule qui assure que dans ce cas la surface ne reçoit pas de lumière diffuse

La composante spéculaire

Un réflecteur parfait, par exemple un miroir, réfléchit la lumière dans un seul sens R, qui est symétrique à Lpar rapport à la surface normale. Par conséquent, seul un observateur situé exactement dans cette direction percevra le rayon réfléchi.

Le composant miroir représente la lumière réfléchie par la surface de l'objet uniquement autour de cette direction, $R$.

Le modèle de Phong se rapproche de la diminution rapide de l'intensité de la lumière réfléchie lorsque $\alpha$ se développe à travers $cos^n \alpha$, où $n$ est l'exposant de la réflexion spéculaire du matériau (brillance).

Ainsi, nous avons: $spéculaire = K_s \cdot culoareLumina \cdot primesteLumina \cdot (max(V\cdot R, 0))^n$

     speculaire = Ks * couleurLumière * reçoitLumière * pow(max(dot(V, R), 0), n) # GLSL

Une autre formulation du modèle de Phong est basée sur le vecteur médian, noté H. Il fait des angles égaux à L et avec V. Si la surface était orientée de telle sorte que sa normale aurait la direction de H, l’observateur percevrait alors une lumière spéculaire maximale (car elle se situerait dans la direction du rayon réfléchi).

Le terme qui exprime la réflexion spéculaire est dans ce cas: $(N_u \cdot H_u)^n$

     pow(dot(Nu, Hu), n) # GLSL

  • $H_u = (L_u + V_u)$ (Normalized)

Lorsque la source de lumière et l’observateur sont à l’infini, utilisez le terme $N_u\cdot H_u$ est avantageux parce que $H_u$ c'est constant.

Comme on peut le voir, comparé aux 3 autres composants, le composant miroir dépend également de la position de l'observateur. si l'observateur n'est pas dans une position où il peut voir les rayons réfléchis, il ne verra pas de réflexion spéculaire pour cette zone. En outre, il ne verra pas de réflexion spéculaire si la lumière est derrière la surface.

Compte tenu de tout cela, nous avons pour le composant spéculaire la formule suivante: speculara= K $spéculaire = K_s \cdot couleurLumière \cdot reçoitLumière \cdot (max(N\cdot H, 0)^n $

     speculaire = Ks * couleurLumiere * recoitLumiere * pow(max(dot(N, H), 0), n) # GLSL

  • Ks - la constante de réflexion spéculaire du matériau
  • colorLumina - la couleur spéculaire de la lumière
  • N - surface normale (normalisée)
  • L - vecteur de la direction de la lumière incidente (normalisé)
  • H - le vecteur médian (normalisé)
  • reçoit la Lumière - 1 si $N\cdot L$ est supérieur à 0; ou 0 sinon

Atténuation de la lumière

Lorsque la source de lumière ponctuelle est suffisamment éloignée des objets de la scène visualisée, le vecteur L est le même à tout moment. La source de lumière est appelée directionnelle dans ce cas. L' application du modèle de visualiser les deux surfaces parallèles constituées du même matériau, la même intensité sera atteint (l'angle entre Let normal est le même pour les deux surfaces). Si les projections des surfaces se chevauchent dans l'image, elles ne seront pas distinguées. En effet, dans le modèle, il n’est pas tenu compte du fait que l’intensité lumineuse diminue proportionnellement à l’inverse du carré de la distance entre la source lumineuse et l’objet. Ainsi, les objets plus éloignés de la source sont plus faibles. Une correction de modèle possible pouvant être appliquée à des sources de position (à une distance finie de la scène) est la suivante:

      colorObject = émissif + ambiant + facteur d'atténuation * (diffuse + spéculaire)

  • facteur d'atténuation = $1/d^2$ c'est une fonction d'atténuation
  • $d$ est la distance de la source au point de la surface considéré

La correction ci-dessus ne satisfait pas les cas où la source est très éloignée. De plus, si la source est à une très courte distance de la scène, les intensités obtenues pour deux surfaces de même angle i, entre Let N, sera très différent.

Une meilleure approximation est la suivante: factorAttenuation = $1/(K_c + K_l\cdot d + K_q\cdot d^2)$

  • Kc - le facteur d'atténuation constant
  • Kl - le facteur d'atténuation linéaire
  • Kq - le facteur d'atténuation quadratique

Détails d'implémentation

Pour simplifier, nous allons implémenter en laboratoire le modèle d’ombrage Gouraud (dans le vertex shader):

  • Seuls les composants diffus et spéculaire tels que présentés précédemment seront calculés; la composante émissive ne sera pas utilisée et le calcul de la composante environnementale sera simplifié afin qu'aucun élément du programme ne soit envoyé au shader (plus de détails au point 3).
  • Nous n'utiliserons comme matériau pour les objets que la couleur du matériau diffus et spéculaire (transmis du programme au shader): Ks et Kd.
  • Dans le shader, nous allons approximer la lumière ambiante avec une couleur EnvironmentalGlobal qui sera une constante dans le shader, et à la place de Ka (la constante du matériau environnemental de l'objet), nous utiliserons Kd (la constante du matériau diffus de l'objet).
  • La couleur de la lumière (diffuse et spéculaire) sera blanche; la couleur de la lumière sera donc 1 et ne devra plus être utilisée dans la multiplication des formules de calcul pour les composants diffus et spéculaire.
  • Les calculs d'éclairage seront effectués dans l'espace-monde. Par conséquent, avant de les utiliser, la position et la normale devront être transférées de l'espace-objet à l'espace-monde. Cela peut être fait comme suit:
    • pour la position:
      vec3 world_pos = (model_matrix * vec4(v_position,1)).xyz;
    • pour la normale:
      vec3 world_normal = normalize( mat3(model_matrix) * v_normal );
  • Vecteur de direction de la lumière L:
    vec3 L = normalize( light_position - world_pos );
  • Le vecteur de la direction de l'observateur V:
    vec3 V = normalize( eye_position - world_pos );
  • Vecteur médian H:
    vec3 H = normalize( L + V );

Fonctions GLSL utiles pouvant être utilisées pour implémenter le modèle d'éclairage

  • normaliser (V) - normaliser le vecteur V
  • normaliser (L + V) - normaliser le vecteur obtenu par L + V
  • normaliser (X1-X2) - renvoie un vecteur de direction normalisé avec deux points X1 et X2
  • dot (N, L) - calcule le produit scalaire entre N et L
  • pow (L, brillance) - calcule L à la puissance de brillance
  • max (N, V) - renvoie le maximum entre N et V
  • distance (P1, P2) - renvoie la distance euclidienne entre les points P1 et P2
  • reflect (L, N) - calcule le vecteur de réflexion à partir de l'incident L et de la normale N

Excercices

Touche F5 - recharge le shader lors de l'exécution de l'application. Vous n'avez pas besoin de désactiver l'application car le shader est compilé et exécuté par la carte vidéo et n'est pas lié au code source C ++ lui-même.

  1. Completez la function RenderSimpleMesh astfel încât să trimiteți corect valorile uniforme către Shader:
    • position de la lumière
    • position de la camera
    • propriétés des matériaux (Kd, Ks, brillance, couleur de l'objet)
  2. Implémenter l'éclairage dans Vertex Shader
    • N, V, L vecteurs et position dans l'espace global
    • Composante ambiante
    • Composante diffuse
    • Composante spéculaire (à la fois dans la version de base et en utilisant le vecteur médian)
    • Facteur d'atténuation
    • La couleur finale
  3. Terminez le fragment shader de manière à appliquer l’éclairage calculé dans le Vertex Shader.
  4. Colore la sphère et le plan dans la scène (par exemple, sphère - bleue, plane - grise)
egc/laboratoare/fr/07.txt · Last modified: 2019/11/20 15:21 by alexandru.gradinaru
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0