11.1 時間變數

_Time,_SinTime,_CosTime,_unity_DeltaTime
11.2 紋理影片
一張貼圖就是一張序列幀貼圖,通過對uv偏移,獲取不同uv下不同的圖片
floor(x),獲取小于x的最大整數
frac(x),獲取x的小數部分
11.3 頂點影片
Disable Batching 標簽,關閉合批,因為頂點影片是對單個頂點進行操作,合批會讓多個單物體合并成一個物體,從而丟失了各自的模型空間

11.4 廣告牌影片
廣告牌的目的構建一個變化的基向量,也就是固定一個軸,從而計算出其它兩個軸的坐標,根據這個基向量,計算出頂點變化后的位置,然后對圖片采樣
固定的軸向分為 法線或者向上的軸,法線就是攝像機位置-模型坐標的中心點位置
如果法線的y軸不為0,說明當前固定的是法線,然后通過法線和向上的位置叉乘得到向右的位置
12.1 螢屏后處理腳本系統
OnRenderImage(RT source,RT dest)
把當前畫面渲染到source里面,然后對其應用指定的shader,賦值給dest,最終顯示出來
Graphic.Blit(textureD source,RT dest)


12.2 增加螢屏對比度 、亮度、飽和度

12.3 邊緣檢測
邊緣檢測用的是卷積計算,重要的是選擇合適的卷積核,把要計算的像素放在卷積核的中心,一次計算相鄰像素的值,然后相加就是該像素的新值,該值就是相鄰像素的對比值
每一個像素的新值,都要進行N*N次計算,N是卷積核的行列數



12.4 高斯模糊
演算法:


12.5 Bloom 模糊
Bloom的原理:首先通過一個閾值,對螢屏影像提取一個亮度,存盤到一個RT中,然后對該RT進行高斯模糊,然后和原影像進行混合
提取亮度:

和原影像混合:

13.1 獲取深度和法線紋理




13.1.2 獲取深度和法線紋理

urp 里面只有深度紋理,沒有法線紋理

fload d=SAMPLE _DEPTH_TEXTURE(depthTex,uv):獲取當前點的深度

SAMPLE_DEPTH_TEXTURE_PROJ(depthTex, UNITY_PROJ_COORD(scrPos))
上面的第二個引數是float3或者float4型別的,一般是前兩個值除以第三個值之后,再進行采樣,如果有第四個值,還會和第四個值進行比較
scrPos=ComputeScreenPos(i.pos)獲取到的

通過采樣得到的深度值,是映射之后的像素值,取值范圍[0,1],所以NDC下的深度值也就是z/w=2d-1,取值范圍[-1,1]
然后NDC下的深度值又等于

二者 結合得出
視角空間下的z:

上式=near*far/d*near+(1-d)far,以為d的取值范圍是[0,1],所以 它的取值范圍為[near,far]
是非線性的
如果要得到線性的,除以far,則上述為 near/d*near+(1-d)far,則范圍[near/far,1],當near為0的時候,也就是近平面和攝像機重合時,取值就為[0,1]
float d=LinearEyeDepth(d):把采樣得到的深度值,轉換到視角空間下
float d=Linear01Depth(d):把采樣得到的深度值,轉換到線性空間下
如果要對 深度+法線紋理進行轉換,unity提供的函式 DecodeDepthNormal(texel,out depth,out normal)
因為深度+法線紋理,法線存盤在RG通道,深度存盤在BA通道
決議深度的函式是
float d=DecodeFloatRG(uv.zw)
float n=DecodeViewNormalStereo(texel)
13.2 運動模糊,通過矩陣重建世界坐標


上圖第一次畫框的地方,我們的uv 就是NDC 坐標,只不過只有xy,所以經過對深度紋理采樣,獲得了NDC下的深度坐標z
然后反映射,得到裁剪空間下的坐標,也就是x,y,z,經過旋轉矩陣之后得到了世界空間下的坐標,但是有一點是,世界空間下的w=1,所以除以w
13.3 全域霧效
開啟霧效要使用#pragma multi_compile_fog
使用UNITY_FOG_COORDS, UNITY_TRANSFROM_FOG, UNITY_APPLY_FOG
上面重建世界坐標的方式,要在片元著色器中兩次矩陣乘法,比較好性能,下面介紹一種

整體公式:
這里是線性深度,也就是從深度圖中采樣得到的深度
后面的interpolatedRay 是插值射線,也就是從攝像機到螢屏上一點的連線
下面有推導:
我們已知有圖中的Near,depth,以及螢屏的寬高比(aspect),我們要求的向量是有圖中的問號代表的歐式距離
先得到幾個輔助向量:
上面的為什么要用camera.forward 乘以呢,是為了最后的結果是向量,halfHeight是個標量,我們要進行的是向量的運算
然后我們得到depth*interpolatedRay
根據三角形相似原則 得到 depth/?=near/TL
則 ?=depth * TL/near
提取出depth 則得到 interpolatedRay=TL/Near
因為四個角到攝像機的距離都相等,所以 TL是動態可換的,又因為最終我們得到的是向量的運算,所以采取的是單位向量*|Ray|,也就是 (TL/|TL|)* (|TL|/|Near|) 前邊TL可以換成TR
然后把這個值傳給片元著色器,根據差值得到某一點的射線向量
為什么只計算四個點就能知道某一點的射線向量呢?
因為我們的模型也就是抓取到的影像是一個面,只有四個頂點,也就是兩個三角形,所以我們只需要處理好這四個點的向量,至于三角形面里面的,就在片元著色器進行差值得到了
下面是霧的計算:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/323253.html
標籤:其他
