ShaderLab常用函数
数学函数
cg/hlsl函数 | 功能描述 |
---|---|
dot(A,B) | 点积, 点积结果为标量,主要用于求向量的夹角或b向量在a向量上的投影 |
cross(A,B) | 叉积, 叉积结果为向量,结果与这两个向量组成的平面垂直。主要用于3D图形学 |
mul(M, N) | 矩阵M和矩阵N的积 |
mul(M, v) | 矩阵M和列向量v的积 |
mul(v, M) | 行向量v和矩阵M的积 |
abs(x) | |
saturate(x) | 把x限制到[0,1]之间 |
clamp(x,a,b) | 把x限制到[a,b]之间 |
TRANSFORM_TEX | o.uv = TRANSFORM_TEX(v.texcoord,_MainTex); 等价于: o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw; _MainTex_ST.xy中是tiling _MainTex_ST.zw中是offset |
sqrt(x) | 求x的平方根,,x必须大于0 |
rsqrt(x) | x的平方根的倒数,x必须大于0 |
all(x) | 如果输入参数均不为0,则返回ture; 否则返回flase。&&运算 |
any(x) | 输入参数只要有其中一个不为0,则返回true。 |
lerp(a, b, w) | 计算(1-w)a + b*w 。即在下限a和上限b之间进行插值,w表示权值。注意,如果a和b是向量,则权值w必须是标量或者等长的向量。 |
lerp(a, b, w) | 官方解释: float lerp(float a, float b, float w) { return a + w*(b-a);} MyExplain: float lerp(float a, float b, float w) { return a(1-w) + b * w; } 一个混合公式,他们俗称插值, 只不过w相当于以第二个参数为源,第一个参数为目标。 直白点,就是把b向a上混合 |
ceil(x) | 对x向上取整。 |
floor(x) | 对x向下取整。 |
round(x) | 返回四舍五入值。 |
step(a, x) | 如果x< a,返回0;否则,返回1 |
sign(x) | 如果x大于0,返回1;如果小于0,返回-1;否则返回0; |
exp(x) | 计算e^x,e=2.71828 |
exp2(x) | 计算2^x |
fmod(x,y) | 返回x/y的余数。如果y为0,结果不可预料。 |
modf(x, out ip) | 把x分解成整数和分数两部分,每部分都和x有着相同的符号,整数部分被保存在ip中,分数部分由函数返回 |
max(a, b) | 比较两个标量或等长向量元素,返回最大值。 |
min(a,b) | 比较两个标量或等长向量元素,返回最小值。 |
determinant(m) | 计算矩阵的行列式因子。 |
transpose(M) | 矩阵M的转置矩阵 |
degrees(x) | 函数将弧度值转换为角度值 |
radians(x) | 函数将角度值转换为弧度值 |
log(x) | 计算ln(x)的值,x必须大于0 |
log2(x) | 计算log2^x的值,x必须大于0 |
log10(x) | 计算log10^x的值,x必须大于0 |
frac(x) | 返回标量或矢量的小数 |
frexp(x, out i) | 将浮点数x分解为尾数和指数,即, 返回m,并将指数存入i中;如果x为0,则尾数和指数都返回0 |
isfinite(x) | 判断标量或者向量中的每个数据是否是有限数,如果是返回true;否则返回false; |
isinf(x) | 判断标量或者向量中的每个数据是否是无限,如果是返回true;否则返回false; |
isnan(x) | 判断标量或者向量中的每个数据是否是非数据(not-a-number NaN),如果是返回true;否则返回false; |
lit(NdotL, NdotH, m) | N表示法向量。L表示入射光向量。H表示半角向量。m表示高光向量。函数计算环境光,散射光,镜面光的贡献,返回四元向量: X表示环境光的贡献,总是1;Y表示散射光的贡献,如果N.L<0,则为0,否则为N.L; Z表示镜面光的贡献,如果N.L<0或者N.H<0,则为0;否则为(N.H)^m;W始终为1 |
noise(x) | 根据它的参数类型,这个函数可以是一元、二元或三元噪音函数。返回的值在0和1之间,并且通常与给定的输入值一样 |
ldexp(x, n) | 计算x*(2^n)的值 |
smoothstep(min, max, x) | x位于min和max之间,若x=min,返回0;若x=max,返回1;若x在两者之间,按下列公式返回数据:-2*((x-min)/(max-min))^3+3*((x-min)/(max-min))^2 |
sin(x) | 返回弧度x的正弦值,返回值范围为[-1,1] |
cos(x) | 返回弧度x的余弦值。返回值范围为[-1,1] |
tan(x) | 计算x正切值 |
asin(x) | 反正弦函数,输入参数取值区间为[-1,1],返回角度值范围为[-π/2,π/2] |
acos(x) | 反余切函数,输入参数范围为[-1,1], 返回[0,π]区间的角度值 |
atan(x) | 反正切函数 |
sinh(x) | 计算x的双曲正弦 |
cosh(x) | 计算x的双曲余弦值。 |
tanh(x) | 计算x的双曲线切线 |
sincos(float x, out s, out c) | 同时计算x的sin值和cos值,其中s=sin(x),c=cos(x)。该函数比分别运算要快很多! |
几何函数
cg/hlsl函数 | 功能描述 |
---|---|
normalize(v) | 返回v向量的单位向量 |
reflect(I, N) | 根据入射光纤方向I和表面法向量N计算反射向量,仅对三元向量有效 |
length(v) | 返回v向量的模,即sqrt(dot(v,v)) |
distance(pt1, pt2) | 两点之间的欧几里德距离 |
faceforward(N,I,Ng) | 如果dot(I,Ng)<0,返回N;否则返回-N。 |
refract(I,N,eta) | 根据入射光线方向I,表面法向量N和折射相对系数eta,计算折射向量。如果对给定的eta,I和N之间的角度太大,返回(0,0,0)。只对三元向量有效 |
纹理映射函数
cg/hlsl函数 | 功能描述 |
---|---|
tex1D(sampler1D tex, float s) | 一维纹理查询 |
tex1D(sampler1D tex, float s, float dsdx, float dsdy) | 使用导数值(derivatives)查询一维纹理 |
Tex1D(sampler1D tex, float2 sz) | 一维纹理查询,并进行深度值比较 |
Tex1D(sampler1D tex, float2 sz, float dsdx,float dsdy) | 使用导数值查询一维纹理, 并进行深度值比较 |
Tex1Dproj(sampler1D tex, float2 sq) | 一维投影纹理查询 |
Tex1Dproj(sampler1D tex, float3 szq) | 一维投影纹理查询,并比较深度值 |
Tex2D(sampler2D tex, float2 s) | 二维纹理查询 |
Tex2D(sampler2D tex, float2 s, float2 dsdx, float2 dsdy) | 使用导数值查询二维纹理 |
Tex2D(sampler2D tex, float3 sz) | 二维纹理查询,并进行深度值比较 |
Tex2D(sampler2D tex, float3 sz, float2 dsdx,float2 dsdy) | 使用导数值查询二维纹理,并进行深度值比较 |
Tex2Dproj(sampler2D tex, float3 sq) | 二维投影纹理查询 |
Tex2Dproj(sampler2D tex, float4 szq) | 二维投影纹理查询,并进行深度值比较 |
texRECT(samplerRECT tex, float2 s) | 二维非投影矩形纹理查询(OpenGL独有) |
texRECT (samplerRECT tex, float3 sz, float2 dsdx,float2 dsdy) | 二维非投影使用导数的矩形纹理查询(OpenGL独有) |
texRECT (samplerRECT tex, float3 sz) | 二维非投影深度比较矩形纹理查询(OpenGL独有) |
texRECT (samplerRECT tex, float3 sz, float2 dsdx,float2 dsdy) | 二维非投影深度比较并使用导数的矩形纹理查询(OpenGL独有) |
texRECT proj(samplerRECT tex, float3 sq) | 二维投影矩形纹理查询(OpenGL独有) |
texRECT proj(samplerRECT tex, float3 szq) | 二维投影矩形纹理深度比较查询(OpenGL独有) |
Tex3D(sampler3D tex, float s) | 三维纹理查询 |
Tex3D(sampler3D tex, float3 s, float3 dsdx, float3 dsdy) | 结合导数值查询三维纹理 |
Tex3Dproj(sampler3D tex, float4 szq) | 查询三维投影纹理,并进行深度值比较 |
texCUBE(samplerCUBE tex, float3 s) | 查询立方体纹理 |
texCUBE (samplerCUBE tex, float3 s, float3 dsdx, float3 dsdy) | 结合导数值查询立方体纹理 |
texCUBEproj (samplerCUBE tex, float4 sq) | 查询投影立方体纹理 |
--完--
- 原文作者: Fflyqaq
- 原文链接: https://www.cnblogs.com/Fflyqaq/p/12553567.html
- 更新时间:2024-04-16 01:01:05
- 本文声明:转载请标记原文作者及链接