遊戲裡的動態陰影 ShadowMap實現原理

2021-09-10 21:46:53 字數 2093 閱讀 3287

shadowmap是比較流行的實時陰影實現方案,原理比較簡單,但真正實現起來還是會遇到很多問題的,我這裡主要記錄下實現方式

先看效果

實現原理

shadowmap技術是從燈光空間用相機渲染一張rendertexture,把深度值寫入其中所以稱之為深度圖,在把接受陰影的物體從模型空間轉換到燈光空間中,獲取深度圖裡的深度進行比較,如果深度值比深度圖中取出的值大就說明該點為陰影。

《cg教程_可程式設計實時圖形權威指南》書上說的原理

陰影對映是乙個雙過程的技術:

1、 首先,場景以光源的位置為視點被渲染。每個渲染影象的畫素的深度被記錄在乙個「深度紋理」中(這個紋理通常被稱為陰影貼圖)。

2、 然後,場景從眼睛的位置渲染,但是用標準的陰影紋理把陰影貼圖從燈的位置投影到場景中。在每個畫素,深度取樣(從被投影的陰影貼圖紋理)與片段到燈的距離進行比較。如果後者大,該畫素就不是最靠近燈源的表面。這意味著這個片段是陰影,它在著色過程中不應該接受光照。

第一步:生成深度圖shader

把視點空間的z值深度傳入片段找色器裡除以w轉換為其次座標,為啥要傳入片段找色器處理呢?因為gpu會對片段找色器傳入的引數進行插值計算,這樣才能更精確的計算出深度。

計算出深度之後,要轉換到一張裡儲存起來,如何把乙個float存入中呢?

shader "lijia/deapthtextureshader"

}subshader

lod 100

pass

;struct v2f

;sampler2d _maintex;

float4 _maintex_st;

fixed4 frag (v2f i) : sv_target

endcg}}

}

第二步:接受陰影的shader

假如有一塊地板作為接受陰影的物體,在這個物體上執行該shader

把深度值傳入片段著色器裡,在片段著色器中除以w轉換為其次座標的深度值(跟生成深度圖的shader一樣處理)

把頂點轉換到燈光的視點空間,這裡是傳入乙個lijia_projectionmatrix 矩陣計算的

取出該畫素對應深度圖上的顏色值,轉換成深度值

把該畫素的深度值跟深度圖裡取出來的值進行比較,如果比深度圖裡的大,該點就為陰影

shader "swan/shadowmap/shadowmapnormal"

}subshader

;float4x4 lijia_projectionmatrix;

sampler2d lijia_depthtexture;

fixed4 frag(v2f v) : color

return col*shadowscale;

}endcg}}

}

第三步:寫乙個指令碼呼叫上面的2個shader

上面我們已經建立好了2個shader

生成深度圖的deapthtextureshader.shader

接受陰影的shadowmapnormal(我這裡把t4m跟接收光照貼圖的處理都寫進去了)

指令碼主要做的事情

建立乙個相機把角度設定的跟燈光一樣,渲染出一張深度圖傳入給接受陰影的shader(畫素越高陰影的精度越高,但是消耗也就越大)

計算好頂點轉換到燈光空間的矩陣傳入給接受陰影的shader

using unityengine;

using system.collections;

namespace swanengine.core

void update()}}

後面的話

幾乎所有的**我都貼上來了,有一些shader基礎的話應該是可以實現出效果的,希望能夠幫助到你們理解shadowmap

在unity裡動態陰影的實現方式還有很多,這裡有個大合集

posted @

2017-07-24 22:39

李嘉的部落格 閱讀(

...)

編輯收藏

CSS裡的陰影屬性應用

text shadow 是css文字陰影屬性單詞。text shodw 屬性值1 屬性值2 屬性值3 屬性值4 屬性值1 陰影橫向位置 屬性值2 陰影縱向位置 屬性值3 陰影的大小 屬性值4 陰影的顏色 下面做個示範 text shadow屬性值裡的30px就是陰影向右移動30畫素,20px是向下移...

遊戲裡的程式設計遊戲

我想寫一本書,當然本身帶有功利性,不必諱言,它並不是一本正兒八經的技術著作,它主要關於我人生裡的遊戲,遊戲裡的程式設計。最終未必能出書也並不特別重要,出不了無非是筆者水平不足或沒有遇到自己的伯樂。同樣重要的是,如果我能通過這個平台去分享我的遊戲經歷,我的人生,能得到諸位關注和共鳴,也是人生的一件快事...

遊戲引擎筆記(四)遊戲中的陰影技術

幾個重要的緩衝區 1.後台緩衝區 render target view 渲染目標檢視 2.前台緩衝區 不能直接繪製到前台緩衝區,會產生頻閃現象 使用翻轉鏈 swap chain 機制 前後臺緩衝區解析度相同 超取樣技術 將後台緩衝區的影象壓縮到前台緩衝區,使影象密度提高 3.深度緩衝區 與後台緩衝區...