unity螢幕空間陰影

2021-10-04 13:29:52 字數 2937 閱讀 5135

參考:

實驗的原理很簡單:

1、從攝像機角度拍攝一張深度圖,為cameradepth

2、從燈光角度拍攝一張深度圖,為lightdepth

3、將兩個圖blit,重建世界座標點,轉換到燈光空間,取樣燈光空間的深度,比較,然後判斷是否在陰影裡,最後生成乙個新的圖,記作screenspaceshadowtex

4、在繪製物體的時候,用物體的螢幕座標uv,取樣這個screenspaceshadowtex,乘以顏色,即可。

為啥叫做螢幕空間。

其實質和shadowmap類似。唯一的不同是,我們將陰影的結果放在乙個圖上,在繪製物體的時候,用物體的螢幕座標uv取樣,得到係數即可。

實現:1、從攝像機角度拍攝一張深度圖,為cameradepth

_depthcamera.

renderwithshader

(shadowcastermat.shader,"")

;

shader "kingsoft/customshadow/caster"

pass ;

fixed4 frag (v2f i)

: color

endcg }}}

2、從燈光角度拍攝一張深度圖,為lightdepth

if

(!_lightcamera)

_lightcamera.orthographicsize = orthographicsize;

_lightcamera.nearclipplane = nearclipplane;

_lightcamera.farclipplane = farclipplane;

_lightcamera.

renderwithshader

(shadowcastermat.shader,"")

;

3、將兩個圖blit,重建世界座標點,轉換到燈光空間,取樣燈光空間的深度,比較,然後判斷是否在陰影裡,最後生成乙個新的圖,記作screenspaceshadowtex

matrix4x4 projectionmatrix = gl.

getgpuprojectionmatrix

(camera.main.projectionmatrix, false)

;shader.

setglobalmatrix

("_inversevp"

, matrix4x4.

inverse

(projectionmatrix * camera.main.worldtocameramatrix));

shadowcollectormat.

settexture

("_cameradepthtex"

, depthtexture)

;shadowcollectormat.

settexture

("_lightdepthtex"

, lightdepthtexture)

;graphics.

blit

(depthtexture, screenspaceshadowtexture, shadowcollectormat)

;shader.

setglobaltexture

("_screenspceshadowtexture"

, screenspaceshadowtexture)

;projectionmatrix = gl.

getgpuprojectionmatrix

(_lightcamera.projectionmatrix, false)

;shader.

setglobalmatrix

("_worldtoshadow"

, projectionmatrix * _lightcamera.worldtocameramatrix)

;

混合的shader:

// upgrade note: replaced 'mul(unity_matrix_mvp,*)' with 'unityobjecttoclippos(*)'

shader "kingsoft/customshadow/collector"

cull back

lighting off

zwrite off

pass ;

struct output

;output vert (input i)

fixed4 frag

( output i )

: sv_target

endcg

}}fallback off

}

4、在繪製物體的時候,用物體的螢幕座標uv,取樣這個screenspaceshadowtex,乘以顏色,即可。

fixed4 frag (v2f_full i)

: color0

ok,效果自然是很差的:

因為沒有做軟陰影,但是大致的思想是實現了。

其中矩陣的傳遞、z反轉、y反轉等等,這些之前的部落格都有涉及,不再展開。

最後的最後,再總結下,什麼是螢幕空間陰影。

所謂的螢幕空間陰影,是在繪製物體的時候,使用螢幕座標空間的uv,取樣乙個shadow圖,然後乘以顏色。

這個shadow圖,是怎麼來的,是通過兩個深度圖(攝像機和燈光空間的深度圖),通過世界座標的重建,然後再轉換到燈光空間,比較深度值,得到的一張shadow圖。

效率怎樣呢?記憶體上,使用了3個rt,gpu上,畫3次的全場景的物體。第一次發生在從攝像機角度繪製;第二次發生在從燈光角度繪製;第三次在實際繪製物體上。

unity螢幕空間座標shader

螢幕座標效果不受物體在空間位置的影響,只受到物體本身和視口的影響,有時候可以做一些特殊效果 比如2d遊戲平鋪紋理,除錯螢幕位置,螢幕特效等等 下面是根據官方例子修改的 shader unlit show uvs subshader sampler2d maintex struct ccc v2f v...

unity中的陰影

shadowmap技術原理是,將攝像機與光源的位置重合,場景中光源的陰影位置就是攝像機看不到的位置。在forward rendering path中,場景中最重要的平行光在forwardbase中預設是開啟了陰影的,unity就會為該光源計算其shadowmap 陰影對映紋理 這張紋理的本質也是一張...

螢幕色彩空間

其中dci p3 srgb ntsc adobergb都是基於cie色彩空間標準的色彩標準,只是應用的地方有些不同。從下圖可以看到,ntsc和srgb所包含的色彩範圍是不太一樣的,ntsc所表現的色彩要更多豐富一些,而srgb所表現的色彩幾乎被ntsc所包含,下圖中藍框為srgb,綠框為ntsc,可...