记录一些HLSL常用函数

查看函数图像网站:https://graphtoy.com/

基础数学运算

  • 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) 返回与2exp次方的乘积
  • log (x) 返回指定值得以e为底数的对数
  • log10 (x) 求以10为底的对数
  • log2 (x) 求以2为底的对数
  • frexp (x , out exp) 将浮点数分解成尾数和指数,x的返回值是尾数,exp参数返回的值是指数

三角函数和双曲线函数

  • sin(x)、cos(x)、tan(x) 三角函数
  • asin(x)、acos(x)、atan(x) 反三角函数
  • sincos(x,out s,out c) 返回x的正弦和余弦
  • tan(y,x) 返回y/x的正切
  • atan2(y,x) 返回y/x的反正切
  • sinh(x) 返回x的双曲正弦值
  • cosh(x) 返回x的双曲余弦值
  • tanh(x) 返回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
  • fmord(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]之间的平滑Hermite插值,使用smoothstep在两个值创建平滑过渡

条件判断函数

  • all(x) 确定指定量的所有分量是否均为非零,均非零则返回true,否则返回false
  • clip(x) 如果输入值小于零,则丢弃当前像素 常用于判定范围(不仅仅针对0,返回值为void) 常用于Alpha测试,如果每个分量代表到平面的距离,还可以用来模拟剪切平面
  • 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) 向量归一化
  • distance(a,b) 返回两个向量之间的距离,不平行的两个向量应该为0,此处表示为根号下各分量之差的平方和
  • dot(a,b) 返回a和b两向量的点积
  • cross(a,b) 返回a和b两向量的叉积,返回值是向量,并且与a,b都垂直
  • determinant(m) 返回指定浮点矩阵的按行列式方式计算的值
  • transpose(m) 返回矩阵m的转置矩阵

光线预算函数

  • reflect(i,n) 以i为入射向量n为法线方向的反射光
  • refract(i,n,ri) 以i为入射向量n为法线方向,ri为折射率的折射光
  • lit(n_dot_l,n_dot_h,m) 输入标量(normal,light,半角向量h,镜面反射系数m) 返回光照向量(环境光,漫反射光,镜面高光反射,1)该计算依据的是BlingPhong光照模型
  • faceforward(n,i,ng) 得到面向视图方向的曲面法向量输入输出为同元向量,返回-n*sign(dot(i,ng))(normal,light,normal)

纹理查找函数

1D纹理查找函数

  • tex1D(s, t) 普通一维纹理查找 返回纹理采样器s在标量t位置的color4
  • tex1D(s,t,ddx,ddy) 使用微分查询一维纹理, t和ddxy均为vector
  • tex1Dlod(s, t) 使用LOD查找纹理s在t.w位置的color4
  • tex1Dbias(s, t) 将t.w决定的某个MIP层偏置后的一维纹理查找
  • tex1Dgrad(s,t,ddx,ddy) 使用微分并指定MIP层的一维纹理查找
  • tex1Dproj(s, t) 把纹理当做一张幻灯片投影到场景中,先使用投影纹理技术需要计算出投影纹理坐标t(坐标t.w除以透视值),然后使用投影纹理坐标进行查询

2D纹理查找函数

  • tex2D(s, t) 普通二维纹理查找 返回纹理采样器s在vector t位置的颜色
  • ex2D(s,t,ddx,ddy) 使用微分查询二维纹理,t和ddxy均为vector
  • tex2Dlod(s, t) 使用LOD查找纹理s在t.w位置的color4
  • tex2Dbias(s, t) 将t.w决定的某个MIP层偏置后的二维纹理查找
  • tex2Dgrad(s,t,ddx,ddy) 使用微分并指定MIP层的二维纹理查找
  • tex2Dproj(s, t) 把纹理当做一张幻灯片投影到场景中,先使用投影纹理技术需要计算出投影纹理坐标t(坐标t.w除以透视值),然后使用投影纹理坐标进行查询

3D纹理查找函数

  • tex3D(s, t) 普通三维纹理查找 返回纹理采样器s在vector t位置的颜色
  • ex3D(s,t,ddx,ddy) 使用微分查询三维纹理,t和ddxy均为vector
  • tex3Dlod(s, t) 使用LOD查找纹理s在t.w位置的color4
  • tex3Dbias(s, t) 将t.w决定的某个MIP层偏置后的三维纹理查找
  • tex3Dgrad(s,t,ddx,ddy) 使用微分并指定MIP层的三维纹理查找
  • tex3Dproj(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) 使用投影方式的立方体纹理查找

偏导函数ddx和ddy

ddx(vector3)、ddy(vector3) ddx 和 ddy 用于求取相邻像素间某属性的差值

img

Core.hlsl

名称 说明
GetVertexPositionInputs(float3 positionOS) 获取输入顶点坐标信息
GetVertexNormalInputs(float3 normalOS) 获取输入顶点法线信息
GetVertexNormalInputs(float3 normalOS, float4 tangentOS) 获取输入顶点法线信息(重载)
GetScaledScreenParams() 获取屏幕缩放参数信息
NormalizeNormalPerVertex(real3 normalWS) 逐顶点法线正交
NormalizeNormalPerPixel(real3 normalWS) 逐像素法线正交
ComputeScreenPos(float4 positionCS) 计算屏幕坐标信息
(real)ComputeFogFactor(float z) 计算雾参数
(real)ComputeFogIntensity(real fogFactor) 计算雾强度
(half3)MixFogColor(real3 fragColor, real3 fogColor, real fogFactor) 混合雾颜色
(half3)MixFog(real3 fragColor, real fogFactor) 混合雾

Lighting.hlsl

名称 说明
DistanceAttenuation(float distanceSqr, half2 distanceAttenuation) 距离衰减
AngleAttenuation(half3 spotDirection, half3 lightDirection, half2 spotAttenuation) 角度衰减
GetMainLight()/GetMainLight(float4 shadowCoord) 获取主光源
GetPerObjectLightIndex(int index) 获取每个对象灯光Index
GetAdditionalLightsCount() 获取额外灯光数量
ReflectivitySpecular(half3 specular) 高光反射率
OneMinusReflectivityMetallic(half metallic) OneMinus金属反射率
InitializeBRDFData(half3 albedo, half metallic, half3 specular, half smoothness, half alpha, out BRDFData outBRDFData) 初始化BRDF
EnvironmentBRDF(BRDFData brdfData, half3 indirectDiffuse, half3 indirectSpecular, half fresnelTerm) 环境BRDF
DirectBDRF(BRDFData brdfData, half3 normalWS, half3 lightDirectionWS, half3 viewDirectionWS) BRDF
SampleLightmap(float2 lightmapUV, half3 normalWS) 光照贴图
GlossyEnvironmentReflection(half3 reflectVector, half perceptualRoughness, half occlusion) 环境光泽反射
GlobalIllumination(BRDFData brdfData, half3 bakedGI, half occlusion, half3 normalWS, half3 viewDirectionWS) 全局光照
MixRealtimeAndBakedGI(inout Light light, half3 normalWS, inout half3 bakedGI, half4 shadowMask) 实时烘培混合
LightingLambert(half3 lightColor, half3 lightDir, half3 normal) 兰伯特模型
LightingSpecular(half3 lightColor, half3 lightDir, half3 normal, half3 viewDir, half4 specular, half smoothness) 高光
LightingPhysicallyBased(BRDFData brdfData, half3 lightColor, half3 lightDirectionWS, half lightAttenuation, half3 normalWS, half3 viewDirectionWS)/LightingPhysicallyBased(BRDFData brdfData, Light light, half3 normalWS, half3 viewDirectionWS) 基于物理的光照模型
VertexLighting(float3 positionWS, half3 normalWS) 顶点光照颜色
LightweightFragmentPBR(InputData inputData, half3 albedo, half metallic, half3 specular,half smoothness, half occlusion, half3 emission, half alpha) 轻量级片元PBR
LightweightFragmentBlinnPhong(InputData inputData, half3 diffuse, half4 specularGloss, half smoothness, half3 emission, half alpha) 轻量级片元布林·冯

Shadows.hlsl

名称 说明
GetMainLightShadowStrength() 获取主光源阴影强度
GetAdditionalLightShadowStrenth(int lightIndex) 获取额外光源阴影强度
SampleScreenSpaceShadowmap(float4 shadowCoord) 屏幕空间阴影贴图
SampleShadowmap(float4 shadowCoord, TEXTURE2D_SHADOW_PARAM(ShadowMap, sampler_ShadowMap), ShadowSamplingData samplingData, half shadowStrength, bool isPerspectiveProjection = true) 阴影贴图
TransformWorldToShadowCoord(float3 positionWS) 把顶点的世界坐标转换到阴影坐标
MainLightRealtimeShadow(float4 shadowCoord) 主光源实时阴影
AdditionalLightRealtimeShadow(int lightIndex, float3 positionWS) 额外光源实时阴影
GetShadowCoord(VertexPositionInputs vertexInput) 获取阴影坐标信息
ApplyShadowBias(float3 positionWS, float3 normalWS, float3 lightDirection) 应用阴影偏移

SpaceTransforms.hlsl

名称 说明
TransformObjectToWorld(float3 positionOS) 当前模型空间转世界空间矩阵,通常用于把顶点/方向矢量从模型空间转到世界空间
TransformWorldToObject(float3 positionWS) 当前世界空间转模型空间矩阵,通常用于把顶点/方向矢量从世界空间转到模型空间
TransformWorldToView(float3 positionWS) 当前世界空间转相机空间矩阵,通常用于把顶点/方向矢量从世界空间转到相机空间
TransformObjectToHClip(float3 positionOS) 当前模型空间转裁剪空间矩阵,通常用于把顶点/方向矢量从模型空间转到裁剪空间
TransformWorldToHClip(float3 positionWS) 当前世界空间转裁剪空间矩阵,通常用于把顶点/方向矢量从世界空间转到裁剪空间
TransformWViewToHClip(float3 positionVS) 当前相机空间转裁剪空间矩阵,通常用于把顶点/方向矢量从相机空间转到裁剪空间
TransformObjectToWorldDir(real3 dirOS) 把方向矢量从模型空间转换到世界空间中
TransformWorldToObjectDir(real3 dirWS) 把方向矢量从世界空间转换到模型空间中
TransformWorldToViewDir(real3 dirWS) 把方向矢量从世界空间转换到相机空间中
TransformWorldToHClipDir(real3 directionWS) 把方向矢量从世界空间转换到裁剪空间中
TransformObjectToWorldNormal(float3 normalOS) 把法线从模型空间转换到世界空间中
CreateTangentToWorld(real3 normal, real3 tangent, real flipSign) 创建一个切线空间转为世界空间的3x3矩阵
TransformTangentToWorld(real3 dirTS, real3x3 tangentToWorld) 当前切线空间转世界空间矩阵,通常用于把顶点/方向矢量从切线空间转到世界空间
TransformWorldToTangent(real3 dirWS, real3x3 tangentToWorld) 当前世界空间转切线空间矩阵,通常用于把顶点/方向矢量从世界空间转到切线空间
TransformTangentToObject(real3 dirTS, real3x3 tangentToWorld) 当前切线空间转模型空间矩阵,通常用于把顶点/方向矢量从切线空间转到模型空间