天天看點

計算機圖形學之陰影解讀

概覽

  • 計算機圖形學陰影概覽
  • 陰影的實體和數學知識
  • 傳統陰影生成算法
    • 投射陰影(Projection shadow)
    • 陰影體(Shadow volume)
    • 陰影映射(Shadow map)
    • 軟陰影(Soft shadows)

計算機圖形學陰影概覽

  • 計算機的寫實化(photorealism)主要有兩個元素
    • 準确的表達表面的屬性(accurate representation)
    • 關于光效果好的實體描述(Good physical desciption)
  • 光表面效果包括
    • 光反射(light reflections)
    • 透明度(transparency)
    • 表面材質(Surface Texture)
    • 陰影(shadow)
  • 計算機圖圖形學中,物體經常在沒有陰影或錨定(anchored)的環境下渲染
  • 陰影可以被考慮為一個被光源隐去的區域
  • 然而,實時逼真渲染是一個非常昂貴的操作
  • 作為替代方案,大多數應用會采用陰影貼圖。

陰影的重要性

  • 陰影告訴我們物體的相對位置和運動
  • 陰影提供很多隐含資訊
    • 對象投射和接收陰影的位置
    • 到光源的位置
  • 陰影提供非隐含資訊
    • 物體的形狀
    • 陰影接受物體的形狀

陰影生成實體數學知識

  • 硬陰影(umbra) 是一個從光源處出發不可視的區域。
  • 軟陰影(penumbra)是一個可以接收到部分光的區域。

傳統陰影生成算法

  • 陰影算法不是基于光栅化的渲染管道的标準功能

熱門的陰影生成算法有

  • 投影算法
  • 陰影體
  • 陰影映射
  • 軟陰影

投射算法

  • 投影陰影(也稱為投影陰影或平面陰影)是在OpenGL場景中實作陰影的簡單方法,其中将對象投影到平面上,然後将平面渲染為單獨的對象或基元
  • 它适用于由點光照射的平面
  • 對于每個面,投影頂點V以找到陰影多邊形的V’
  • 物體陰影=面投影的聯合
基礎步驟
  1. 使用鏡面+漫反射+環境分量繪制地平面
  2. 僅使用環境元件繪制陰影投影(面對面)

案例1:

  • 當陰影接收面在軸平面上
  • 例如有個光的位置 I ( I x , I y ) I(I_x,I_y) I(Ix​,Iy​),有一個平面 y = 0 y = 0 y=0,有一個點位置 v ( v x , v y ) v(v_x,v_y) v(vx​,vy​),計算點p

    p x = l y v x − l x v y l y − v y p_x = \frac{l_yv_x-l_xv_y}{l_y-v_y} px​=ly​−vy​ly​vx​−lx​vy​​

  • 這就是一個國中數學

案例2:

  • 立體的,一會再說

優點

  • 很容易實作
  • 可以跨平台

缺點

  • 除了在完全平面上可以應用,很難在其他平面上應用。
  • 可以控制陰影的程度有限

投射體(Shadow volume)

  • 投射體對于處理接收面是任意平面是一個更加通用的算法,其中陰影将由來自光源的對象投射
  • 由遮光罩(occulder)形成并由遮光罩邊緣限定的空間體積,它導緻陰影體積内的任何對象處于陰影中
  • 陰影将虛拟世界分為兩個部分,一個是有陰影世界,一個是無陰影世界。
    計算機圖形學之陰影解讀
  • 形成陰影體積的基本步驟:
  1. 查找所有輪廓邊(将前向面與後向面分開的邊)
  2. 沿遠離光源的方向延伸所有輪廓邊
  3. 将前蓋和/或後蓋添加到每個表面以形成閉合體積(可能不需要,具體取決于所使用的實作方式)

被黃色線段覆寫的就是陰影體

計算機圖形學之陰影解讀

優點:

  • 全方位的方法(omi-direction)
  • 自動自成陰影(automatic self-shadowing)
  • 視窗空間陰影确定(windows-space shodow determine)

缺點

  • 消耗大量的GPU填充率
  • 需要具有連接配接性的多邊形模型
  • 剪影計算是必需的(sihouette computation are required)
  • 僅限理想光源

陰影映射

  • 陰影貼圖是通過測試像素是否從光源可見,通過将像素與以紋理形式存儲的光源視圖的Z緩沖區或深度圖像進行比較來建立的
  • 這種技術比陰影體積更不精确,但是陰影貼圖可能是一種更快的選擇,這取決于在特定應用程式中這兩種技術需要多少填充時間,是以可能更适合于實時應用程式。
  • 分為兩種方法(Lance Williams于1978年介紹):
  • 從燈光的視角渲染場景
    • 像對待相機一樣對待光線
    • 渲染到深度紋理以建立陰影貼圖
  • 從相機的視角渲染場景
    • 在頂點明暗器中将每個頂點從世界空間轉換為光空間
    • 将光空間位置發送到片段明暗器
    • 将片段的深度與陰影貼圖中存儲的深度進行比較。如果深度較大,則隐藏

案例

計算機圖形學之陰影解讀
計算機圖形學之陰影解讀
  • 圖描述:幾何圖形從燈光的角度渲染到深度緩沖區。更具體地說,頂點明暗器(vertex shader)将幾何體轉換為燈光視圖空間。

    最終結果是一個深度緩沖區,其中包含從燈光的角度觀察到的場景深度資訊。

    計算機圖形學之陰影解讀
  • 圖說明:頂點明暗器将每個頂點變換兩次。每個頂點都被轉換到相機的視圖空間中,并作為位置傳遞到像素明暗器。每個頂點也由燈光的“視圖投影”紋理矩陣轉換,并作為紋理坐标傳遞給像素明暗器。視圖投影紋理矩陣與使用附加變換渲染場景的矩陣相同。這是一種将點從視圖空間(X和Y中為-1到1)縮放并轉換為紋理空間(X中為0到1,Y中為1到0)的轉換。
  • 像素明暗器接收插值位置和插值紋理坐标。執行深度測試所需的一切都在這個紋理坐标中。深度測試現在可以通過将第一次通過的深度緩沖區與X和Y紋理坐标進行索引,并将生成的深度值與Z紋理坐标進行比較來執行。
    計算機圖形學之陰影解讀

優點

  • 不需要模闆緩沖區(stencil buffer)
  • 當陰影很多的時候,比陰影體算法快

缺點

  • 隻可以操作平行光
  • 自陰影是不正确的
  • 背後陰影是不正确的。

軟陰影

  • 軟陰影是一種區域光建立半影,其中光從給定點僅部分可見。
  • 為了産生軟陰影,我們按區域(稱為區域光)對光源進行模組化,區域被劃分為子區域或區域。
  • 它也可以通過一組點光源進行模組化。
    計算機圖形學之陰影解讀

多點光源的軟陰影

  • 添加劑混合用于積累每種光的貢獻。
  • 陰影的柔和程度取決于足夠數量的樣本。
  • 渲染場景的時間随用于近似區域光源的采樣數線性增加。

總結

  • 陰影傳輸大量的資訊,以提供一個物體的基本視圖,在這個物體上,沒有影子顯示的物體會在平面上漂浮(float above the plane)。
  • 投影陰影限制平面接收機,沒有自我影子
  • 需要多邊形表示影像卷和剪切陰影體多邊形的影像卷需要被尋址
  • 影像映射圖是一種圖像空間技術,有兩個輸出路徑,如果所有相關的對象都對于光可見,則正确地工作。
  • 區域光線制造軟陰影

繼續閱讀