參考:
實驗的原理很簡單:
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,可...