概覽
- 計算機圖形學陰影概覽
- 陰影的實體和數學知識
- 傳統陰影生成算法
- 投射陰影(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:
- 當陰影接收面在軸平面上
-
例如有個光的位置 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−vylyvx−lxvy
- 這就是一個國中數學
案例2:
- 立體的,一會再說
優點
- 很容易實作
- 可以跨平台
缺點
- 除了在完全平面上可以應用,很難在其他平面上應用。
- 可以控制陰影的程度有限
投射體(Shadow volume)
- 投射體對于處理接收面是任意平面是一個更加通用的算法,其中陰影将由來自光源的對象投射
- 由遮光罩(occulder)形成并由遮光罩邊緣限定的空間體積,它導緻陰影體積内的任何對象處于陰影中
- 陰影将虛拟世界分為兩個部分,一個是有陰影世界,一個是無陰影世界。
- 形成陰影體積的基本步驟:
- 查找所有輪廓邊(将前向面與後向面分開的邊)
- 沿遠離光源的方向延伸所有輪廓邊
- 将前蓋和/或後蓋添加到每個表面以形成閉合體積(可能不需要,具體取決于所使用的實作方式)
被黃色線段覆寫的就是陰影體
優點:
- 全方位的方法(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)。
- 投影陰影限制平面接收機,沒有自我影子
- 需要多邊形表示影像卷和剪切陰影體多邊形的影像卷需要被尋址
- 影像映射圖是一種圖像空間技術,有兩個輸出路徑,如果所有相關的對象都對于光可見,則正确地工作。
- 區域光線制造軟陰影