Table of Contents

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:

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:

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

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)