GPU加速DiffuseCubeMap經典計算(轉)
GPU加速DiffuseCubeMap經典計算(轉)[@more@] Diffuse Cube Map 對於頂點x,我們知道由x反射向ω方向的光亮度 Lo(ω)=∫brdf*Li(ω1)*vis(ω1)*max(0,dot(ω1,N))*dω1 這裡brdf是x點的雙向反射分佈函式,Li(ω1)是由ω1方向照射到x的光亮度,vis(ω1)是x點朝ω1方向的可視情況, N是x頂點的法線。 由於這個積分表示式比較複雜,精確的計算相當耗時,我們在使用的時候需要作相應的簡化。首先我們假設我們計算的所有表面都是存Diffuse的,這樣對於brdf我們可以簡單使用ρ/pi,於是上面的計算公式簡化成為 Lo(ω)=(ρ/pi)*∫Li(ω1)*vis(ω1)*max(0,dot(ω1,N))*dω1 接下來我們假設對於任意頂點x來說所有方向的vis都是一致的,也就是和方向無關,那麼我們又能把vis提出積分號 Lo(ω)=(ρ/pi)* vis*∫Li(ω1)*max(0,dot(ω1,N))*dω1 我們看到經過這樣簡化後的表示式對於每個不同的頂點來說只是和頂點的法線N相關了,於是我們可以預計算( ρ/pi)*∫Li(ω1)*max(0,dot(ω1,N))*dω1,儲存在一個Cube Map中,渲染的時候我們使用發現N來索引我們預計算的光照亮度值。最後使用這個光照亮度值乘上我們頂點儲存的vis就能得到我們最後的光照亮度值。 GPU加速Diffuse Cube Map計算 我們在使用CPU預計算(ρ/pi)*∫Li(ω1)*max(0,dot(ω1,N))*dω1的時候採用了蒙特卡羅積分法計算,具體的步驟是 1 產生N個取樣光線,計算每個取樣光線和光照環境Cube Map的交點,得到每條光線的亮度值。 2 對於每個我們需要計算的法線,我們計算出 L(ω)=(ρ/pi)*((4*pi)/N)*∑(Li(ω1)*max(0,dot(ω1,N))) 3 將我們計算出來到亮度值儲存在相應的法線所索引的Diffuse Cube Map的圖素。 我們現在可以使用GPU來加速我們的計算 1 首先還是一樣我們取樣N條光線,其次我們建立兩張FP16/32格式的Texture(能容納N個圖素),設定成我們的渲染物件(使用MRT).接著我們建立出N個point,每個point的法線就是所對應的光線的方向。我們將我們的光照環境Cube Map作為Texture設定好。我們渲染這N個point(保證每個point可以對應螢幕上的一個畫素)。在ps中我們使用法線來索引我們設定好的Texture,儲存在C0,將法線儲存在C1。這樣渲染完成後我們開始建立的兩張Texture,其中一張中的每個圖素對應著相應的取樣光線的亮度值Li(ω1),而另一張則儲存了向對應的取樣光線的方向ω1。 2 對於每個我們需要計算出的法線方向(對應於Diffuse Cube Map的每個圖素),我們設定出一個point,它的位置對應於Diffuse Cube Map中的相應的Surface中的圖素的位置,法線就是我們需要計算的法線N(也就是從原點到設定的Diffuse Cube Map中的相應的圖素的位置). 3 我們將上面第二步得到的每個point來求亮度值。我們建立一系列類似MipMap的FP16/32格式的Texture,其中最大的一張和我們第一步建立的Texture一樣的大小,首先將最大的一張設定成我們的渲染物件。我們設定好我們第一步得到的兩張貼圖,將我們的我們的point的法線設定到常量暫存器。在ps中,我們對於每個象素計算Li(ω1)*max(0,dot(ω1,N)),然後我們使用Down Sample的方法最終求出(ρ/pi)*((4*pi)/N)*∑(Li(ω1)*max(0,dot(ω1,N)))也就是對應於 1X1的Texture中的圖素。讀取出來儲存在對應的point的顏色屬性中。 4 我們再得到了每個法線方向所對應的亮度值後,最後需要儲存在Diffuse Cube Map中,我們將我們第2步的所有的point分成6份,一份對應Diffuse Cube Map中的一個Surface。這樣我們只需要渲染我們的point的顏色到我們的Diffuse Cube Map的Surface中就完成了我們的計算。 注 :在我們的計算中需要考慮HDR的因素
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-951650/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 計算機經典論文計算機
- PostgreSQLGPU加速(HeteroDBpg_strom)(GPU計算,GPU-DIO-NvmeSSD,列存,GPU記憶體快取)SQLGPU記憶體快取
- 計算機網路經典20問!計算機網路
- 分散式計算技術(上):經典計算框架MapReduce、Spark 解析分散式框架Spark
- 經典的反轉
- 計算機視覺經典任務分類計算機視覺
- 硬體加速gpu計劃開還是不開 win10硬體加速gpu計劃有用嗎GPUWin10
- 10多本計算機經典書籍推薦計算機
- cuda程式設計與gpu平行計算(六):圖稀疏矩陣轉為CSR結構並傳入gpu程式設計GPU矩陣
- win10硬體加速沒有gpu計劃 強制開啟win10硬體加速gpu計劃的方法Win10GPU
- GPU 環境搭建指南:使用 GPU Operator 加速 Kubernetes GPU 環境搭建GPU
- Javascript如何實現GPU加速?JavaScriptGPU
- 計算機專業必讀的經典書籍!!(建議收藏)計算機
- 為什麼計算機經典大頭書老是看不進去?計算機
- 北鯤雲超算平臺藉助GPU實現模擬加速GPU
- 雲端計算助傳統行業加速數字化轉型行業
- webgl 影像處理 加速計算Web
- PowerShell中呼叫GPU命令通常涉及到與GPU相關的任務,如檢視GPU資訊、管理GPU驅動、執行GPU加速的計算任務等。以下是一些常見的PowerShell中呼叫GPU命令GPU
- 分享我收集的計算機內功修煉的經典資源計算機
- 一些開源的 GPU 加速和平行計算庫,涵蓋了不同的程式語言和用途:GPU
- win10如何開啟gpu加速_win10系統gpu加速開啟步驟Win10GPU
- DL4J實戰之四:經典卷積例項(GPU版本)卷積GPU
- 中國科學家構建世界首臺超越早期經典計算機的光量子計算機計算機
- hive經典案列--top N(行轉列\列轉行)Hive
- OpenVINO計算機視覺模型加速計算機視覺模型
- R語言經典統計分析R語言
- PHP三大經典設計模式PHP設計模式
- 經典程式設計書籍大全程式設計
- win10 2004 gpu加速怎麼開啟 win10 2004開啟gpu加速操作方法Win10GPU
- Linux學習路線及網路程式設計經典書籍(轉載)Linux程式設計
- [轉載] Python 機器學習經典例項Python機器學習
- 五種C語言非數值計算的常用經典排序演算法C語言排序演算法
- cuda程式設計與gpu平行計算(四):cuda程式設計模型程式設計GPU模型
- Java中神經網路Triton GPU程式設計Java神經網路GPU程式設計
- JavaScript設計模式經典之代理模式JavaScript設計模式
- SQL 轉置計算SQL
- 轉矩的計算?
- 用機器學習構建O(N)複雜度的排序演算法,可在GPU和TPU上加速計算機器學習複雜度排序演算法GPU
- SICP 經典