1. 程式人生 > >OpenGL中環境光、漫反射、鏡面反射對光的影響(如何被抽象成向量進行著色的)

OpenGL中環境光、漫反射、鏡面反射對光的影響(如何被抽象成向量進行著色的)

文章目錄

Phong著色演算法將模擬光對模型中每個頂點的影響。所以這個演算法沒法考慮陰影,它只會計算應用於每個頂點的光線,而不考慮頂點是否位於阻擋光線的物體後面。但是,正因為如此,這是一種非常簡單快速的演算法,可以提供非常好的效果。

關於光的種類可以參考這篇文章

OpenGL的環境光、點光源、聚光燈、方向光、材質的定義,本文主要介紹點光源、聚光燈、方向光在Phong演算法下物體的效果。

Phong演算法中影響光照的三個因素

  • 環境光(Ambient):可以理解為現實中的白天的室內,白天在室內我們能看的見物體,但是並沒有感知光線的方向,其實是因為太陽離我們太遠了,導致我們周圍的光線強度都是一樣的。
  • 漫反射(Diffuse):面向光源的表面更亮。
  • 鏡面反射(Specular):模擬光在拋光或金屬表面的反射

其實最終我們就是要計算出一個影響顏色的因子,在執行片段著色器程式時用這個變數fragColor去乘以該因子,進而根據接收的光線將顏色設定得更亮或更暗。將場景中對其他光的影響因素環境光、漫反射、鏡面反射分別叫做A、D、S,則計算那個影響顏色的因子可以用下面公式來表示。

  • 如果模型沒有紋理,將按照下面這個公式去算:
    在這裡插入圖片描述
  • 有紋理,將按照下面這個公式去算:
    在這裡插入圖片描述

環境光(Ambient)對光線的影響

它只是一個常數因素,可以使我們所有的物體更亮或更暗。環境光是最容易計算一種影響因素。我們只需要傳遞一種顏色,用它乘以模型的基色,它只是調製基色。所以我們只需要一個向量來調製環境光強度和顏色。

漫反射(Diffuse)對光的影響

以點光源為例:假設有一個光源照在一個物體上,面向光源的一面整體會比背向光源的一面更亮。

在這裡插入圖片描述

對於漫反射的計算,首先在上圖中的物體上取幾個頂點位置P1、P2、P3,相應的頂點法向量為N1、N2、N3。頂點法向量是垂直於每個點的切平面的向量。如下:

在這裡插入圖片描述

在上圖中可以很明顯的看出來,P1位置一定比P2更亮,P3基本不會受到該光源的影響。而P1位置比P2更亮是因為,P1受到的光照是從該頂點的正上方照射過來的,而P2受到的光線是比正上方稍微偏了一些。所以我們在計算每個頂點的漫反射影響因子時,頂點的法向量與該點受到光線的夾角是影響明暗的一個因素。

現在我們列出計算漫反射的已知引數:

  • vPos: 頂點座標
  • lPos:燈的座標
  • intensity:光線的強度 (範圍是 0 to 1).
  • lColour:光的顏色
  • normal:頂點法向量

在這裡插入圖片描述

1、每個頂點受到的光照方向
在這裡插入圖片描述

2、每個頂點受到的光線強度:這裡用頂點的法向量點乘光的方向,作為光線強度的影響因子,在兩個向量夾角在0-90度之間時,夾角越大,點乘值越大。
在這裡插入圖片描述
3、每個頂點的顏色如下:diffuseColour指的是,如果沒有紋理,該物體在漫反射下的顏色,可以理解為定義的物體的顏色。

在這裡插入圖片描述

如果是放方向光(DirectionalLight),那麼直略過第一步的計算燈光方向,其餘過程都是一致的。

鏡面反射(Specular)對光的影響

當光線照射到表面時,它的某些部分被吸收而另一部分被反射,反射就是光線從物體上反射回來。鏡面反射如下:

在這裡插入圖片描述

將空間中的觀察點,比作相機(Camera)對於鏡面反射,最重要的是要注意,只有當相機處於適當的位置時,反射光才會可見。例如,如果相機位於反射光發射的區域,光線才會可見。是否可見如下:

在這裡插入圖片描述

計算鏡面反射光的流程:

1、首先求與入射光方向相反的向量
在這裡插入圖片描述

2、利用著色器的內建函式來計算反射光向量reflect(x,y)函式的是求x向量關於y向量的對稱向量。
在這裡插入圖片描述

3、計算鏡面反射光的強度cameraDirection是相機的方向向量。
在這裡插入圖片描述

在這裡插入圖片描述

4、當反射光直面相機的方向時,需要將反射光的強度加強。
在這裡插入圖片描述

5、最終的鏡面反射光如下:specularColour指的是,如果沒有紋理,該物體在鏡面反射下的顏色,可以理解為定義的物體的顏色。
在這裡插入圖片描述

衰減(Attenuation)

上面已經模擬了在環境光下,漫反射和鏡面反射對點光源的影響。但是到此位置光模型仍然不完整,物體反射的光與光的距離是有關的,我們需要模擬光的衰減。
在這裡插入圖片描述
上面公式中dist表示光源到頂點的距離,atConstantatLinearatExponent表示三個調整引數,其實就將我們可以調整的引數範圍變得更大更詳細了。

注意:只有點光源、聚光燈才需要考慮衰減。方向光是不用考慮衰減的。