??部門有個(gè)實(shí)習(xí)TA要做PCSS,需要采樣shadowmap里的值掩完,與片元深度做差,來計(jì)算遮擋距離硼砰。
??Unity默認(rèn)的shadowmap采樣是比較采樣且蓬,只返回0和1:
#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)
??因?yàn)橐@取深度值,所以就改成:
//大致代碼
TEXTURE_SHADOW(_CustomShadow);
SAMPLER(sampler_CustomShadow);
shadowAtten = SAMPLE_TEXTURE2D(_CustomShadow, sampler_CustomShadow, coord.xy) > coord.z;
??同樣的工程题翰,在幾個(gè)人那里正常恶阴,在一個(gè)人那里顯示沒有陰影。排除顯卡驅(qū)動(dòng)豹障、操作系統(tǒng)后冯事。測試顯卡適配性,然后發(fā)現(xiàn)在16系顯卡正常血公,在10系顯卡顯示錯(cuò)誤昵仅。
??測試將采樣器換成inline sampler state:SamplerState my_point_clamp_sampler;
,結(jié)果正確累魔,通過renderdoc比較采樣器摔笤,發(fā)現(xiàn)sampler_CustomShadow
的Filter帶有Comparison够滑。
??因此能猜出問題所在:Unity認(rèn)為shadowmap的rendertexture只需要比較,不需要獲取深度值籍茧,因此以ShadowMap類型創(chuàng)建的RT版述,其采樣器會(huì)設(shè)置為比較采樣器。而在不同系的顯卡上寞冯,其底層邏輯有區(qū)別渴析,10系用比較采樣器采樣(不是比較采樣),會(huì)獲取到錯(cuò)誤的值吮龄,而16系用比較采樣器比較俭茧,也能獲取正常的值,因此導(dǎo)致了效果在不同顯卡設(shè)備上的差異漓帚。
??最后將RT申請的格式設(shè)置成Depth就好了母债。