GAMES202-高質量實時渲染(Real-Time Shadows)

目錄

  • Shadow Mapping
    • shadowMapping的問題
    • shadow mapping背后的數學
    • PCF(Percentage Closer Filtering)
    • PCSS(Percentage closer soft shadows)
    • VSSM(Variance Soft Shadow Mapping)
      • 優化步驟3
      • 優化步驟1
      • SAT(Summed Area Tables)
      • VSSM的問題
    • Moment Shadow Mapping
    • Distance Field Soft Shadows

GitHub主頁:https://github.com/sdpyy1
作業實現:https://github.com/sdpyy1/CppLearn/tree/main/games202

Shadow Mapping

這塊東西在我OpenGL學習筆記中有詳細介紹

https://blog.csdn.net/lzh804121985/article/details/147256140?spm=1001.2014.3001.5502

shadowMapping的問題

陰影痤瘡(Shadow Acne)、或者叫自陰影
在這里插入圖片描述
出現該問題的原因可以看下圖,光源視角下的一個像素內高度認為是同一個,下一個像素的位置,會被認為比前一個Z值更遠,所以平坦的地板會交替出現高低不平的地方,這樣就會出現陰影
在這里插入圖片描述
簡單解決就是認為z插值在一個范圍內就不算在陰影中,雖然能解決這個問題,但是引入了新的問題,陰影發生了偏移。如果bias設置的過大,在靠近腳的地方,就不會出現陰影。在工業界稱為“彼得潘效應"(Peter Panning)
在這里插入圖片描述
對于這種不接觸的陰影,解決方法是shadowmapping中不僅存最小深度的表面,還存儲第二小深度的表面
在這里插入圖片描述
另外陰影還有走樣問題,畢竟陰影計算就是一個像素一個像素來做的
在這里插入圖片描述

shadow mapping背后的數學

在實時渲染中,經常會用到一些不等式,但人們更多關注的是不等式相等時成立的條件,也就是說,不等式在什么條件下近似相等。實時渲染中,經常用到的一個約等如下:
在這里插入圖片描述
滿足下列兩個條件之一時,實時渲染領域認為他們近似相等:
當g(x)滿足:

  1. g(x)積分域足夠小
  2. g(x)足夠smooth,g(x)值變化不大,比較平坦

下面來到渲染方程
在這里插入圖片描述
根據上邊的不等式,就可以把最后一項(V)提出來
在這里插入圖片描述
這樣變換后,渲染方程就變成了正常做shading之后,再乘以一個表示可見不可見的項
這時的G(x)就是渲染方程的被積函數

PCF(Percentage Closer Filtering)

以點P為例,并不只找shadowmap中對應的一個像素,而是找一圈的像素,與這些像素都進行比較,最后將比較結果進行平均
在這里插入圖片描述
比較結果就是一個全是1,0的矩陣,最終得到的數就不是非0即1的數了
在這里插入圖片描述
在這里插入圖片描述

PCSS(Percentage closer soft shadows)

PCF它原本是用來解決陰影的走樣問題的,后來人們又發現它可以用來生成軟陰影,就是PCSS
首先來回顧一下軟陰影和硬陰影
在這里插入圖片描述
到這里就可以理解軟陰影在陰影不同位置有不同的軟硬程度就可以通過PCF的濾波核的大小來控制,越大越模糊,越小越硬
在這里插入圖片描述
w(半影)與光源大小、物體位置之間呈現相似三角形的關系,w就可以用來表示軟硬程度。半影舉例越大,濾波核尺寸就應該設計的更大,讓陰影更軟

總結PCSS的算法流程:1. 在一個范圍搜索遮擋物,并計算平均深度。2. 用平均深度求出半影距離3. 在對應的濾波核尺寸下進行PCF
在這里插入圖片描述
上邊的步驟1需要選取一個合適的范圍,下圖就展示了如何選取一個范圍來進行遮擋物搜素,假設了ShadowMap在近平面,用光源的大小來決定搜素范圍
在這里插入圖片描述在這里插入圖片描述
在PCSS第一步和第三步中,為了計算一個像素點的著色,需要考慮多個紋素,從而導致速度慢。如果采用稀疏采樣,又會有噪點產生
請添加圖片描述

VSSM(Variance Soft Shadow Mapping)

針對PCSS效率問題,提出VSSM

優化步驟3

PCF和PCSS的 PC(percentage closer)的理解就是在深度紋理的一片區域內,有多少比例的紋素比著色點深度小
請添加圖片描述
這就相當于看多少人比我考試分數高,就需要遍歷所有同學的成績
VSSM的解決方案就是用成績分布(正態分布)來估計(??VSSM并沒有用正態分布,這里這樣說只是方便理解,后邊提到切比雪夫不等式就好理解了)
請添加圖片描述
定義一個正態分布需要均值和方差,這個可以快速計算請添加圖片描述
均值可以通過mipmap(因為上一級map到下一級map就是把相鄰的正方形進行平均,到最后就整合為了一個平均值)、SAT(是一種用于高效計算矩形區域內元素總和的數據結構)來求,方差則是用一個概率論公式來求
請添加圖片描述
得到正態分布分布后,求小于著色點深度的紋素百分比,其實就是陰影部分的線下面積
請添加圖片描述
下來VASS還對這種計算進行了簡化。直接使用不等式來近似
只要給定均值、方差、和要比較的位置t,就有下面的不等式成立 ,在渲染中就直接用方差、期望、t來估計紅色部分的面積,然后馬上就能得出剩余部分的面積(t必須大于中間線才好使)
請添加圖片描述
至此,對PCSS步驟三的優化結束,在生成shadowMap時,為了計算方差,還需要額外生成一張平方shadowMap,總體來說甚至都不需要進行loop就可以知道一片區域有多少紋素深度小于著色點深度
請添加圖片描述

優化步驟1

為了設置合理大小的過濾核,對一個區域內遮擋物的深度進行平均,需要遍歷紋素,效率并不高

例如下圖,如果著色點的深度為7,那么這些紋素的深度只有藍色的是遮擋物,就需要平均他們,而紅色不參與計算
請添加圖片描述
對藍色部分和紅色部分求均值后,滿足下式
請添加圖片描述
這里求N1/N就可以直接用剛才步驟三的不等式(用方差、均值、t來估計大于t的比例),之后1減去它就是N2/N。

但我們還不知道紅色部分的均值,在VSSM中直接假設紅色部分均值就是t(大膽的假設,假設的依據是陰影位置大概率是個平面)
請添加圖片描述
VSSM的效果請添加圖片描述
另外課程還提到目前PCSS是壓過VSSM的,因為人們對噪聲的容忍度越來越高,在圖像層面進行降噪手段變強了

SAT(Summed Area Tables)

SAT是給一片區域立刻得到它的均值的一種數據結構

SAT是對原數據的預處理得到的數據,在一維場景下,每個index記錄都是前綴和(提前記錄好),現在要求中間某一段的和,就直接拿出SAT在范圍查詢邊界(左邊是邊界-1)的數據相減就行了
請添加圖片描述
在二維情況下藍色的范圍查詢,可以轉化為左上角都是(0,0)的框加減操作
請添加圖片描述

VSSM的問題

VSSM中作了很多假設,有一個就是假設一片區域紋素是符合正態分布的
例如右圖深度只有3個峰值,不符合正態分布
請添加圖片描述
下圖就是說本來只有一小部分沒遮住,但是假設為正態分布變成了很大一部分,就會讓陰影邊白
請添加圖片描述
有一些地方變白了
請添加圖片描述

Moment Shadow Mapping

為了解決VSSM分布描述不準確的問題,提出MSM,使用更高階矩來描述分布
請添加圖片描述
請添加圖片描述
大概意思就是用數據的高階來更好的擬合PCF的效果,下圖表明用4階矩下的分布就很好的達到了PCF的效果
請添加圖片描述
缺點很明顯空間很大
請添加圖片描述

Distance Field Soft Shadows

請添加圖片描述
首先看一下Distance functions是什么,它描述了空間中任意一點到物體表面的最小距離,離得越遠值越小,表示到圖上就是變白
請添加圖片描述
在任何一個點上,以它記錄的值為半徑畫圓,都不可能碰到物體,如果做光線追蹤,那可以直接移動到圓的表面上去,這就是SFD的一個應用
請添加圖片描述
下來用它來生成軟陰影是它的另外一個陰影
用SDF可以大概描述多大的范圍被物體擋住了,圓圈內為安全距離,不會有物體擋住,用這個圈的大小來定義visbility的大小,從而實現軟陰影
請添加圖片描述
在不同的位置找圓做切線,最小的切線就是需要的安全距離
請添加圖片描述
求角度是一個acrsin的計算,比較慢,人們用一個替代來簡化
請添加圖片描述
其中根據不同的k值來達到不同的效果
請添加圖片描述
顯而易見的優缺點 空間換時間,但這是不考慮生成距離場的時間
請添加圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77456.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77456.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77456.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iphonex uniapp textarea標簽兼容性處理過程梳理

嗨,我是小路。今天主要和大家分享的主題是“iphonex uniapp textarea標簽兼容性處理過程梳理”。 在uniapp項目中,經常會使用到uniapp原生的textarea標簽,但在手機兼容性這塊,textarea并不是很好用,會出現一些…

C++ 區分關鍵字和標識符

1. 關鍵字(Keywords) 定義:關鍵字是編程語言預定義的具有特定意義的單詞。它們是語言的一部分,C編譯器具有特殊的理解規則,不能作為用戶自定義的標識符。作用:關鍵字用于定義語言結構,如聲明變…

杭電oj(1087、1203、1003)題解

DP 即動態規劃(Dynamic Programming),是一種通過把原問題分解為相對簡單的子問題,并保存子問題的解來避免重復計算,從而解決復雜問題的算法策略。以下從幾個方面簡述動態規劃: 基本思想 動態規劃的核心在…

一鍵多環境構建——用 Hvigor 玩轉 HarmonyOS Next

引言 在 HarmonyOS Next 的應用開發中,常常需要針對不同環境(測試、預發、線上)或不同簽名(調試、正式)輸出多個 APP/HAP 包。雖然 HarmonyOS 提供了多目標構建(Multi-Target Build)能力&#…

qt/c++云對象瀏覽器

簡介 本項目為基于QT5和C11的云對象存儲可視化管理工具 源碼獲取 int main(){ printf("源碼聯系綠泡泡:%s","joyfelic"); return 0; }

【Ubuntu】提升 docker ps -a 輸出的可讀性:讓 Docker 容器狀態更清晰

提升 docker ps -a 輸出的可讀性:讓 Docker 容器狀態更清晰 當我們使用 docker ps -a 查看所有 Docker 容器時,輸出的信息通常會非常多,尤其是在容器數量較多時。默認輸出中包含容器 ID、名稱、鏡像、狀態、端口等信息,容易讓人眼…

Spring Security自定義身份認證

盡管項目啟動時,Spring Security會提供了默認的用戶信息,可以快速認證和啟動,但大多數應用程序都希望使用自定義的用戶認證。對于自定義用戶認證,Spring Security提供了多種認證方式,常用的有In-Memory Authentication…

在亞馬遜云服務器上部署WordPress服務

在亞馬遜云服務器上部署WordPress服務第一步:創建EC2實例第二步:初始設置與安裝第三步:配置MySQL與WordPress第四步:配置Apache與WordPress第五步:訪問WordPress第六步:測試數據庫連接第七步:使…

Web3.0的認知補充(去中心化)

涉及開發技術: Vue Web3.js Solidity 基本認知 Web3.0含義: 新一代互聯網思想:去中心化及用戶為中心的互聯網 數據:可讀可寫可授權 核心技術:區塊鏈、NFT 應用:互聯網上應用 NFT &…

如何修復寶可夢時時刻刻冒險無法正常工作

寶可夢的時時刻刻冒險模式是一項強大的功能,即使應用程序關閉,它也能追蹤你的步行距離。它的工作原理是將你的步數與 iOS 上的 Apple Health 或 Android 上的 Google Fit 同步。它對于孵化寶可夢蛋和賺取好友糖果至關重要,但一旦它停止工作&a…

redis常用集合操作命令

在 Redis 的命令行界面(redis-cli)中, Redis 的集合(Set)是無序的,且集合中的元素是唯一的。Redis 本身沒有直接提供獲取集合中某個特定屬性的命令,因為集合中的元素是簡單的值,而不…

初識數據結構——二叉樹從基礎概念到實踐應用

數據結構專欄 ?(click) 初識二叉樹:從基礎概念到實踐應用🌳 一、樹型結構基礎 1.1 樹的基本概念 樹是一種非線性的數據結構,由n(n>0)個有限節點組成一個具有層次關系的集合。它看起來像一棵倒掛的樹,根朝上而葉朝下。 關鍵特…

駝峰命名法(Camel Case)與匈牙利命名法(Hungarian Notation)詳解

駝峰命名法(Camel Case)與匈牙利命名法(Hungarian Notation)詳解及對比? ?1. 駝峰命名法(Camel Case)? ?定義? 駝峰命名法(Camel Case)是一種變量、函數、類等標識符的命名方…

keil 中優化等級的bug

一,問題描述 程序中代碼有的執行,有的不執行,仔細研究,查詢人工智能。 程序中printf打印后面的代碼不執行, 然后過幾十個函數又開始正常了。 二.分析問題 跳過函數一般又判斷和Goto等語句,其它的溢出和錯誤…

織夢dedecms網站如何修改上一篇下一篇的標題字數

一般情況下,如果你的上一篇和下一篇是2行布局就不需要限制標題的字數了,如果你要一行布局上一篇和下一篇標題過長就會打亂網頁布局,那么限制上一篇和下一篇的標題字數是需要的,避免頁面看起來雜亂不堪。 織夢dedecms網站如何修改…

信創系統 sudoers 權限配置實戰!從小白到高手

好文鏈接:實戰!銀河麒麟 KYSEC 安全中心執行控制高級配置指南 Hello,大家好啊!今天給大家帶來一篇關于信創終端操作系統中 sudoers 文件詳解的實用文章!在 Linux 系統中,sudo 是一項非常重要的權限控制機制…

《明解C語言入門篇》讀書筆記四

目錄 第四章:程序的循環控制 第一節:do語句 do語句 復合語句(程序塊)中的聲明 讀取一定范圍內的值 邏輯非運算符 德摩根定律 德摩根定律 求多個整數的和及平均值 復合賦值運算符 后置遞增運算符和后置遞減運算符 練習…

vite+vue2+elementui構建之 vite.config.js

webpack版本太低,構建依賴太多,頭大。 各種查閱資料,弄了一份直通構建vite構建elementUi核心文件, 構建基于開源若依vue2vue3版本改造,感謝開源,感謝若依。 package.json 地址 vitevue2elementui構建之…

超參數詳解:從基礎概念到優化策略的全面指南

摘要 本文深入解析機器學習中超參數的核心概念,詳細對比參數與超參數的本質區別,系統介紹學習率、隱含層數量等常見超參數類型,以及網格搜索、貝葉斯優化等主流尋優方法。結合超參數搜索的標準流程,通過具體案例演示如何高效調整…

計算機視覺與深度學習 | LSTM原理及與卡爾曼濾波的融合

長短期記憶網絡(LSTM)是一種特殊的循環神經網絡(RNN),旨在解決傳統RNN在處理長序列數據時出現的梯度消失和梯度爆炸問題。以下為你詳細介紹其基本原理: 核心思想:LSTM的核心思想是引入記憶單元和門控機制來控制信息的流動,從而解決傳統RNN的梯度消失問題。記憶單元類似…