Unity Shader常见函数 内置Built-in/URP等效函数
简介:
Unity Shader的URP中的函数与Built-in中的是不一样的,升级URP之后,基本都提供了平替的函数
Built-in 内置渲染管线函数 | URP 通用渲染函数 |
TRANSFORM_TEX(uv, textureName) | TRANSFORM_TEX(uv, textureName) |
tex2D, tex2Dlod, 等 | SAMPLE_TEXTURE2D、SAMPLE_TEXTURE2D_LOD等 |
UnityObjectToClipPos(positionOS) | TransformObjectToHClip(positionOS),或使用GetVertexPositionInputs().positionCS |
UnityObjectToWorldNormal(normalOS) | TransformObjectToWorldNormal(normalOS),或使用GetVertexNormalInputs().normalWS |
ComputeScreenPos(positionCS) | ComputeScreenPos(positionCS),但在 Unity 2021 / URP v11+ 中已弃用。应该GetVertexPositionInputs().positionNDC使用 |
ComputeGrabScreenPos(positionCS) | URP 不支持 GrabPass |
WorldSpaceViewDir(positionOS) | 计算positionWS并使用下面的函数代替 |
UnityWorldSpaceViewDir(positionWS) | GetWorldSpaceViewDir(positionWS)(在 v9+ 中添加到ShaderVariablesFunctions.hlsl)。对于之前的版本,请将其复制出来。如果需要对其进行标准化,可以使用它GetWorldSpaceNormalizeViewDir(positionWS)来代替。 |
WorldSpaceLightDir(positionOS) | 见下文 |
UnityWorldSpaceLightDir(positionWS)/ _WorldSpaceLightPos0 | 对于主定向光,请使用GetMainLight().direction。请参阅Lighting.hlsl |
Shade4PointLights(...) | 实际上没有直接的等效项,但内置将其用于前向中的顶点照明,因此请参见下文。 |
ShadeVertexLights(vertex, normal) | VertexLighting(positionWS, normalWS)在Lighting.hlsl中 |
ShadeSH9(half4(worldNormal,1)) | SampleSH(normalWS),但在Lighting.hlslSAMPLE_GI(input.lightmapUV, input.vertexSH, inputData.normalWS)中使用宏/SampleSHVertex/SampleSHPixel函数。例如,请参见LitForwardPass.hlsl |
UNITY_FOG_COORDS(n) | float fogFactor : TEXCOORDn |
UNITY_TRANSFER_FOG(o, positionCS) | OUT.fogFactor = ComputeFogFactor(positionCS.z) |
UNITY_APPLY_FOG(fogCoord, color, fogColor) | color.rgb = MixFog(color.rgb, fogCoord) |
UNITY_APPLY_FOG_COLOR(fogCoord, color) | color.rgb = MixFogColor(color.rgb, fogColor.rgb, fogCoord) |
Linear01Depth(z) | Linear01Depth(z, _ZBufferParams) |
LinearEyeDepth(z) | LinearEyeDepth(z, _ZBufferParams) |
ParallaxOffset(h, height, viewDirTS) | ParallaxOffset1Step(h, amplitude, viewDirTS)如果是 v10.1+(对于之前的版本,复制函数)。请参阅ParallaxMapping.hlsl |
Luminance(rgb) | Luminance(rgb),参见Color.hlsl |
V2F_SHADOW_CASTER | 大致相当于float4 positionCS : SV_POSITION;,但请参阅ShadowCaster部分。 |
TRANSFER_SHADOW_CASTER_NORMALOFFSET | 请参阅ShadowCasterPass.hlslGetShadowPositionHClip(input)中的示例,另请参阅上面 |
SHADOW_CASTER_FRAGMENT | return 0; |
SHADOW_COORDS(1) | float4 shadowCoord : TEXCOORD1; |
TRANSFER_SHADOW(o) | TransformWorldToShadowCoord(inputData.positionWS) |
SHADOW_ATTENUATION(i) | MainLightRealtimeShadow(shadowCoord),但GetMainLight(shadowCoord)也会处理它。请参阅Lighting.hlsl和Shadows.hlsl |
数学计算相关:
max(a,b) 返回两者中较大的
min(a,b)返回两者中较小的
mul(a,b) 两向量相乘
abs(a)返回a的绝对值
round(x)返回与x最近的整数
sqrt(x)返回x的平方根数
rsqrt(x)返回x的平方根倒数
degrees(x)将弧度转化为角度
redians(x)将角度转化为弧度
noise(x) 噪声函数
pow(x,y)幂运算,x的y次幂
exp(x)返回以e为底的指数
exp2(value x)返回以2为底,x为指数的幂
ldexp(x,exp)返回与2的exp次方的乘积
log(x) 返回指定值的以e为底数的对数
log10(x) 以10为底的对数
log2(x)以2为底数的对数
sin(x)、cos(x)、tan(x)
asin(x)、acos(x)、atan(x)
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]范围的值,比min小返回min,比max大返回max
fmod(x,y)返回x对y取余的余数
frac(x)取x的小数部分
modf(x,out ip)将x分为小数和整数部分(输出的ip为整数部分,返回值为小数部分)
lerp(x,y,s)按照s在x到y之间插值
smoothstep(min,max,x)如果x在[min,max]范围内,就返回介于[0,1]之间的平滑插值
all(x)确定指定量的所有分量是否均为非零,均非零则返回true,否则返回false(处理由浮点型、整型、布尔型数据定义的标量、向量或者矩阵)
clip(x)
如果输入值小于零,则丢弃当前像素 常用于判定范围(不仅仅针对0,返回值为void)
常用于Alpha Test,如果每个分量代表到平面的距离,还可以用来模拟剪切平面
sign(x)返回x的正负性
如果x小于零返回-1
如果x等于零返回0
如果x大于零返回1
isinf(x)
如果x参数为+ INF或-INF(无穷+无穷仍无穷,0x3f3f3f3f),返回true,否则返回False
isfinite(x)
判断x参数是有限,即有界的,与isinf(x)相反
isnan(x)
如果x参数为NAN(非数字),返回true,否则返回false
length(v) 返回向量的长度
normalize(v) 向量归一化,x/length(x) 方向向量归一化
distance(a,b) 返回两个向量之间的距离,不平行的两个向量应该为0,此处表示为根号下各分量之差的平方和
dot(a,b) 点积
cross(a,b) 叉积
determinant(m) 返回指定浮点矩阵的按行列式方式计算的值
transpose(m) 返回矩阵m的转置矩阵
reflect(i,n) 以i为入射向量n为法线方向的反射光
refract(i,n,ri) 以i为入射向量n为法线方向,ri为折射率的折射光
纹理采样相关函数(Built-in):
tex2D(s, t) 普通二维纹理查找 返回纹理采样器s在vector t位置的颜色
tex2D(s,t,ddx,ddy) 使用偏导数微分查询二维纹理,t和ddxy均为vector
tex2Dlod(s, t) 使用LOD查找纹理s在t.w位置的color4,可以在vert中采样
tex2Dbias(s, t) 将t.w决定的某个MIP层偏置后的二维纹理查找
tex2Dgrad(s,t,ddx,ddy) 使用微分并指定MIP层的二维纹理查找
tex2Dproj(s, t) 把纹理当做一张幻灯片投影到场景中,先使用投影纹理技术需要计算出投影纹理坐标t(坐标t.w除以透视值),然后使用投影纹理坐标进行查询
texCUBE(s,t) 返回纹理采样器s在vector t位置的颜色
texCUBE(s,t,ddx,ddy) 使用微分查询立方体维纹理 ,t和ddxy均为vector
texCUBEDload(s,t) 使用LOD查找纹理s在t.w位置的color4
texCUBEbias(s,t) 将t.w决定的某个MIP层偏置后的立方体纹理查找
texCUBEgrad(s,t,ddx,ddy) 使用微分并指定MIP层的立方体纹理查找
texCUBEproj(s,t) 使用投影方式的立方体纹理查找