UnityShader 螢幕空間全息掃瞄效果

2021-08-09 23:08:17 字數 1844 閱讀 9290

前段時間剛玩《使命召喚11》的時候發現裡面新增了一種很高科技的掃瞄手榴彈,可以產生一圈類似全息效果的掃瞄圈,並顯示出牆後的敵人,類似這樣:

最近打算實現乙個用在第三人稱中類似的效果,如下:

實現方案:

1.根據_cameradepthtexture計算螢幕空間畫素點的世界座標

2.將掃瞄發起位置的世界座標傳入shader

3.計算螢幕空間世界座標到掃瞄發起位置世界座標的距離

4.根據相關引數渲染出掃瞄區域

1._cameradepthtexture中記錄了投影空間的深度資訊,通過如下方式可以得到世界座標:

fixed depth = tex2d(_cameradepthtexture, i.uv).r;

fixed4 projpos = fixed4(i.uv.x * 2 - 1, i.uv.y * 2 - 1, -depth * 2 + 1, 1);

worldpos = mul(internalcameratoworld, worldpos);

worldpos /= worldpos.w;

2.計算傳入的初始位置和螢幕空間世界座標距離:

fixed dis = length(internalcentpos.xyz - worldpos.xyz);

fixed a = 1 - saturate((abs(dis - internalarg.x) - internalarg.y) / internalarg.z);

a = a * internalfade.x + c * internalfade.y;

最終可以得到如下效果:

4.根據螢幕uv資訊將螢幕uv柵格化,並計算每個格仔中取樣到的顏色值,可以得到如下結果:

5.同樣根據剛剛柵格的結果,可以計算出每一小格的uv,根據該uv來取樣用於作為全息掃瞄效果的紋理,得到如下結果:

6.疊加最終結果:

git位址部落格原文

Unity Shader 螢幕抓取,螢幕座標

抓取螢幕,抓取後名字為name 獲取螢幕座標有3種方法 sv position語義的xy 使用sv position語義,在片元著色器中拿到的pos.xy就是螢幕空間的座標。struct v2f vpos語義 vpos語義和sv position衝突,使用vpos語義,則v2f不能定義sv posi...

Unity Shader切線空間

在使用凹凸紋理時我們經常會用到乙個叫切線空間的東西。而這個切線空間裡有三個引數,頂點法線 normal 頂點次法線 binormal 和頂點切線 tangent 這三個引數有什麼意思,是如何得來的呢?我們來詳細講下。假設有乙個三角形平面abc,a點的切線空間就如圖 t,n,b兩兩正交 注 a點座標p...

螢幕色彩空間

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