当前位置:网站首页>【TA-霜狼_may-《百人計劃》】2.3 常用函數介紹

【TA-霜狼_may-《百人計劃》】2.3 常用函數介紹

2022-07-01 03:41:00 zczplus

2.3HLSL常用函數

2.3.1 基本數學運算

max(a,b) min(a,b) mul(a,b) abs(a) round(x)

sqrt(x) 返回x的平方根
rsqrt(x) 返回x的平方根的倒數

degrees(x) 將弧度轉換成角度
redians(x) 將角度轉換成弧度
noise(x) 噪聲函數

2.3.2 幂指對函數

pow(x,y) x的y次幂(x和y均可為自變量或具體的數)
exp(x) 返回以e為底的指數函數
exp2(value x) 返回以2為底,x為指數的幂
ldexp(x,exp) 返回x與2的exp次方的乘積
log(x)
log10(x)
log2(x)

frexp(x,out exp) 把浮點數 x 分解成尾數和指數 x = ret*2^exp,返回值是尾數,exp參數返回的值是指數
(如果x參數為0,則此函數的尾數和指數均返回0)

2.3.3 三角函數與雙曲函數

sin(x) cos(x) tan(x)
sincos(x, out s, out c) 返回x的正弦值和餘弦值
tan(y,x) asin(x) acos(x) atan(x) atan2(y,x) 返回y/x的反正切值
上述的x值均為弧度錶示


sinh(x) 返回x的雙曲正弦值 即 (ex-e-x) / 2
cosh(x) 返回x的雙曲餘弦值 即 (ex+e-x) / 2
tanh(x) 返回x的雙曲正弦值 即 (ex-e-x) / (ex+e-x)

2.3.4 數據範圍類

ceil(x) 返回>=x的最小整數
floor(x) 返回<=x的最大整數
step(x,y) x<=y為1,否則為0
saturate(x) 返回將x鉗制到0和1之間的值
clamp(x,min,max) 把x限制在[min,max]範圍內,即判斷x是否在這個區間範圍內,若在則返回原值,若不在則返回上限或下限
fmod(x,y) 返回x對y取餘的餘數
frac(x) 返回x的小數部分
modf(x, out ip) 將值x分為小數和整數部分(各部分符號與x相同)
ip返回整數部分,整體返回小數部分

插值函數

lerp(x,y,s) 按照s在x到y之間插值,即返回x*(1-s)+y*s;
smoothstep(min,max,x) 如果x在[min, max]範圍內,則返回介於0與1之間的平滑Hermite插值,使用smoothstep在兩個值之間創建平滑過癮。例如可以平滑地混合兩種顏色。

2.3.5 類型判斷類

all(x) 確定指定量的所有分量是否均為非零,若均為非零則返回True,否則false(標量、矢量或者矩陣都可以)
clip(x) 如果輸入值小於零,則丟弃當前像素 常用於判定範圍(不僅僅針對0,返回值為void),或者測試alpha,如果每個分量代錶到平面的距離,還可以用來模擬剪切平面
sign(x) 返回x的正負性 如果x小於零返回-1,如果x等於零返回0,如果x大於零返回1

isinf(x) 判斷是否為無窮大或無窮小
isfinite(x) 判斷x參數是否有限
isnan(x) 判斷是否為NAN

2.3.6 向量與矩陣類

length(v)
normalize(v)
distance(a,b) 錶示:兩個矢量,返回根號下各個分量之差的平方和(不就是 終點的距離麼)
dot(a,b) 點積
cross(a,b) 叉積

determinant(m) 返回矩陣m按行列式方式計算的值
transpose(m) 返回矩陣m的轉置矩陣

2.3.7 光線運算類

reflect(i,n) 返回以i為入射方向,n為法線方向的反射光
refract(i,n,ri) 返回以i為入射向量,n為法線方向,ri為折射率的折射光
lit(n_dot_I, n_dot_h, m) 分別對應(normallight,normal半角向量h,鏡面反射系數m)返回一個光照向量(環境光,漫反射光,鏡面高光反射,1)
faceforward(n,i,ng)得到面向視圖方向的曲面法向量輸入輸出為同元向量,返回-n*sign(dot(i,ng))(normal,light,normal)

光照向量

光照向量(環境光,漫反射光,鏡面高光反射,1)(Blinn模型)

2.3.8 紋理查找

GPU在片元處理(PixelShader)階段是在屏幕空間XY坐標系中對每一個像素去對應的紋理中查找對應的紋素來確定像素的顏色(名字好理解)

1D

方法不太常用,很少有按照這種方式來存儲數據的,對應一維的數組

2D

對應二維的數組,也就是矩陣

3D紋理查找

對三維的數據進行查找,由多層的二維數組進行組合。

tex(s,t)在給定紋理采樣器(s,指的就是被采樣的圖片)的情况下,通過t(1D下為標量,2D、3D為矢量,也就是比特置坐標)來確定紋素數據。

投影紋理相關(講的不太清楚 再看一下)

tex1Dproj(s, t)把紋理當做一張幻燈片投影到場景中,先使用投影紋理技術計算出投影紋理的坐標(由於投影光線和投影面的角度存在變化,所以投影紋理的坐標不是簡單的縮放,還會發生斜切等其他問題,另外投影面的不規則也是需要解决的問題),最後使用投影紋理坐標進行紋素查詢。

ddx、ddy重點自己查一下

mipmap

好圖,更好的用於理解為什麼內存空間只多占用了1/3
mipmap示意圖

立體紋理查找

與三維查找不同的是,需要指定特定的面,且性能耗費更高。

總結

寫出你覺得最常用的5個函數?

  1. 在看入門精要的時候發現有關矩陣和向量的運算較多,其中 mul(x,y)作為高頻應用點肯定必不可少;
  2. 歸一化的運算應該也比較常見,所以saturate(x)應該也比較常用;
  3. 插值函數;
  4. 光線運算類應該是重點和難點,一般物體都會受到光照,應該是常用函數;
  5. 紋理查找中的mipmap相關函數是整個渲染過程中無法避免的問題,所以是常用函數;

ddx、ddy和Mipmap

看了Games101 P9,開始理解了。

  • 在Mipmap中,ddx和ddy的主要用途就是用於計算屏幕像素在紋素中的覆蓋長度,由
    L = MAX(sqrt(ddx(u, v)2, ddy(u, v)2))可以得到近似的覆蓋紋素矩形的邊長;
  • 再利用D=Log2(L)獲得需要取的Mipmap的層數,取Log2(L)是因為,Mipmap的每一層都縮小到上一層的1/2,只要找到Log2(L)層, 此時L在該層上就是單比特長度,從而節省了再次采樣的過程;
  • 並且,Log2(L)一般情况下為非整數,此時利用兩側的Mipmap層再進行一次線性插值,可以使得結果更加准確,因此Mipmap方法也被稱為三次線性插值法。
原网站

版权声明
本文为[zczplus]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/182/202207010324350343.html