Unity Shader常用函数总结

  1. 数学函数
    1. Abs(x) :返回输入参数的绝对值;
    2. Clamp(x,a,b):如果x小于a则返回a;如果x大于b则返回b;
    3. Cross(A,B):返回两个三元向量的叉积;
    4. degree(x):输入参数为弧度值(radians),函数将其转换为角度值;
    5. determinant(m):计算矩阵的行列式因子;
    6. dot(A,B):返回A和B的点积;
    7. exp2(x): 2的x次方;
    8. lerp(a,b,f):插值计算,
    9.  step(a, x):如果 x<a,返回0;否则,返回1。
    10. Saturate(x):将输入值限制在[0,1]之间
  2. 几何函数
    1. distance( pt1, pt2):两点之间的欧几里德距离(Euclidean distance)
    2.  reflect(I, N):根据入射光方向向量 I,和顶点法向量N,计算反射光方向向量。其中I 和N 必须被归一化,需要非常注意的是,这个I 是指向顶点的;函数只对三元向量有效;
    3. refract(I,N,eta):计算折射向量,I为入射光线,N为法向量,eta为折射系数;其中 I 和N 必须被归一化,如果I 和N 之间的夹角太大,则返回(0,0,0),也就是没有折射光线;I是指向顶点的;函数只对三元向量有效。
  3. 纹理映射函数(投影纹理查询函数使用计算得到的投影纹理坐标,并在使用之前会将该投影纹理坐标除以透视值
    1. Tex2D(sampler2D tex, float2 s)二维纹理查询;
    2. Tex2Dproj(sampler2D tex, float3 sq) 二维投影纹理查询
    3. Tex3D(sampler3D tex, float s)     三维纹理查询
    4. texCUBE(samplerCUBE tex, float3 s)   查询立方体纹理
    5. texCUBEproj (samplerCUBE tex, float4 sq) 查询投影立方体纹理
  4. 偏导函数
    1.  ddx(a):参数 a对应一个像素位置,返回该像素值在X 轴上的偏导数
    2. ddy(a):参数 a对应一个像素位置,返回该像素值在Y 轴上的偏导数
    3. 函数 ddx ddy 用于求取相邻像素间某属性的差值;函数 ddx ddy 的输入参数通常是纹理坐标;函数 ddx ddy 返回相邻像素键的属性差值;
  5. UnityShader

宏(通道设定显示硬件的各种状态,例如能打开alpha混合

  • Material { Material Block }定义一个使用顶点光照管线的材质
  • Lighting On | Off :开启或关闭顶点光照。开启灯光之后,顶点光照才会有作用
  • Cull Back | Front | Off:设置多边形剔除模式,详细内容后面的文章会讲解到。
    • ​​​​​​​ZTest (Less | Greater | LEqual | GEqual |Equal | NotEqual | Always):设置深度测试模式
  • ​​​​​​​ZWrite On | Off  :设置深度写模式,详细内容后面的文章会讲解到。 
  • ​​​​​​​ Fog { Fog Block }: 设置雾参数,详细内容后面的文章会讲解到。
  • ​​​​​​​​​​​​​​ AlphaTest (Less | Greater | LEqual | GEqual| Equal | NotEqual | Always) CutoffValue: 开启alpha测试
  • ​​​​​​​Blend SourceBlendMode |DestBlendMode :设置alpha混合模式 ​​​​​​​
  •  Color Color value: 设置当顶点光照关闭时所使用的颜色
  • ​​​​​​​ColorMask RGB | A | 0 | any combination of R, G, B, A:设置颜色写遮罩。设置为0将关闭所有颜色通道的渲染
  • ​​​​​​​Offset OffsetFactor , OffsetUnits:设置深度偏移
  • ​​​​​​​SeparateSpecular On | Off:开启或关闭顶点光照相关的平行高光颜色 
  • ColorMaterial AmbientAndDiffuse | Emissio:当计算顶点光照时使用每顶点的颜色

UnityShader内置函数

  1. TRANSFORM_TEX(tex,name)这个方法的定义在UnityCG.cginc中,它有两个参数,tex.xy是顶点的uv值,name##_ST则是在这个shader所在的材质球中,纹理图片的缩放和偏移,S指Scale,T指Transform,它是一个float4类型,其值分别为(Tiling.x,Tiling.y,Offset.x,Offset.y)。这个方法运算后,得到的是经过偏移和缩放的uv。它的运算公式是TextureCoordinate = tex.xy * name##_ST.xy + name##_ST.zw。如果偏移为0,缩放为默认1,则可以不用经过这个过程。
  2. UnpackNormal(fixed4 packednormal)对法线纹理进行采样。以UnpackNormal方法来说,它最主要的也就是packednormal.xyz * 2 – 1,要解释这个,就必须讲到法线纹理的生成。法线纹理是把模型的法线信息存到图片中去,每条法线的x,y,z对应的存到每个像素的r,g,b中。每条法线里的每个数值都是一个[-1,1]的闭合区间里,像素的每个数值则都是在[0,255]中,(n + vec3(1.0,1.0,1.0)) * (255.0 / 2.0),每个法线向量,经过加上 vec3(1.0,1.0,1.0)。变成[0,2]的闭合区间里,然后除以2,再乘以255,发现向量,就会转换成了[0,255]里的数值。这也是上述那条公式的由来。至于法线纹理如何生成,有兴趣的可以详细了解一下这个算法,各个软件的生成算法不一样,最终得到的法线纹理也不一样。但是纹理里的数据,肯定是符合规范的法线纹理数据,可以在shader中使用。另外一个方法UnpackNormalDXT5nm ,则是一个压缩法线纹理后的方法。大家都知道,法线是一个单位向量,也就是它的长度是1,所以只需要知道x,y的数值,是可以计算得到z的数值的,z=1-(x+y)的平方。这样就可以减少贴

    inline fixed3 UnpackNormal(fixed4 packednormal)

    {

    #if defined(UNITY_NO_DXT5nm)

    return packednormal.xyz * 2 - 1;

    #else

    return UnpackNormalDXT5nm(packednormal);

    #endif

    }

    inline fixed3 UnpackNormalDXT5nm (fixed4 packednormal)

    {

    fixed3 normal;

    normal.xy = packednormal.wy * 2 - 1;

    normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));

    return normal;

    }

    图的大小,减少GPU的数据传输量。
  3. UnityObjectToWorldNormal(float3 normal): 从模型空间到世界空间转换法线
  4. UnityObjectToWorldDir(float3 dir ): normalize(mul((float3x3)_World2Object)norm); _World2Object:相当于当前世界矩阵的逆矩阵。
  5. Luminance(float3 c):实现shader的灰度化,return dot(c,fixed(0.22,0.707,0.071);

猜你喜欢

转载自blog.csdn.net/cgs6654820/article/details/81390907