• Unity Shader常用函数,标签,指令,宏总结(持续更新)


    极端常用:

    UnityObjectToClipPos(v.vertex);

    最基本的顶点变换,模型空间 ==》裁剪空间

    mul(unity_ObjectToWorld, v.vertex);

    顶点:模型空间 ==》世界空间,多用于顶点着色器

    UnityObjectToWorldNormal(v.normal);

    法线:模型空间 ==》世界空间,多用于顶点着色器,float3(归一化后fixed3)

    UnityWorldSpaceLightDir(i.worldPos.xyz);

    仅前向渲染,世界空间顶点位置 ==》世界空间光源方向,多用于片元着色器,一般会顺带归一化(fixed3)

    UnityWorldSpaceViewDir(i.worldPos.xyz);

    世界空间顶点位置 ==》世界空间视线方向,多用于片元着色器,一般会顺带归一化(fixed3)

    P.S.一般[0,1]范围内的尽量用低精度fixed类型,如单位矢量,颜色等

    Tags{"lightmode"="forwardbase"}(字符串不区分大小写,编译时会自动转为所有字母大写)

    指示光照模型为前向渲染的基本模式

    #include "UnityCG.cginc"(字符串不区分大小写,编译时会自动转为所有字母大写)

    包含大量基本内置函数,宏等,一般自带

    #include "lighting.cginc"(字符串不区分大小写,编译时会自动转为所有字母大写)

    包含基本光照属性,如 _LightColor0

    UNITY_LIGHTMODEL_AMBIENT(使用大写)

    环境光,一般取前三个分量rgb(xyz);基本光照模型需要有环境光,漫反射,高光等

     

    基本纹理&法线贴图:

    TRANSFORM_TEX(v.uv, _MainTex);

    基本纹理变换,用于顶点着色器,相当于v.uv*_MainTex_ST.xy + _MainTex_ST.zw;(其中xy存缩放,zw存偏移,对应面板参数);_MainTex_ST需额外定义

    tex2D(_MainTex, i.uv);

    基本纹理采样,用于片元着色器;一般会定义染色属性并与之相乘得到反射率(albedo),反射率作为环境光和漫反射计算的因子

    UnpackNormalWithScale(packedNormal, _BumpScale);

    反映射法线贴图采样结果得到顶点空间中的法线方向,同时计算凹凸映射的缩放;packedNormal为法线贴图直接采样结果,_BumpScale为凹凸缩放值;法线贴图必须进行导入设置为Normal Map

    UnityObjectToWorldDir(v.tangent.xyz);

    方向(切线):模型空间 ==》世界空间,多用于顶点着色器

    cross(worldNormal, worldTangent)*v.tangent.w

    计算副法线,cross(,)两个向量叉积,用于得知两个坐标轴求第三个坐标轴朝向,w控制朝向的正负;知道三个朝向就可以构造变换矩阵了

    TANGENT_SPACE_ROTATION

    得到从模型空间到顶点空间的变换矩阵rotation,随后可直接进行如下计算,例如:

    mul(rotation, ObjSpaceLightDir(v.vertex));

    模型空间顶点位置 ==》模型空间光源方向==》顶点空间光源方向

    mul(rotation, ObjSpaceViewDir(v.vertex));

    模型空间顶点位置 ==》模型空间视线方向==》顶点空间视线方向

    多光源&前向渲染&光照衰减:

    Tags{"lightmode"="forwardbase"}(第一个Pass,全局性通用计算,只计算一次,不用开启混合)

    Tags{"lightmode"="forwardadd"}(第二个Pass,根据光源数目不同可能多次计算,需开启混合)

    前向渲染的两种标签,分别位于不同的两个Pass,指示每个Pass的光照模式

    #pragma multi_compile_fwdbase

    #pragma multi_compile_fwdadd

    前向渲染的两种指令,只有每个Pass配置正确指令才可能得到正确的光照变量,如光照衰减值

    UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos.xyz);

    用于第二个Pass分别计算每个光源的衰减,atten为输出的衰减值,i为片元着色器的输入结构体,其内部数学运算根据各个光照的类型不同复杂度不一,具体可参考:https://github.com/candycat1992/Unity_Shaders_Book/issues/47

    接收投影:

    SHADOW_COORDS(idx)

    声明阴影纹理采样的坐标,用于顶点着色器输出结构体,idx为下一个可用插值寄存器(TEXCOORD)的索引值

    TRANSFER_SHADOW(o);

    用于在顶点着色器中计算阴影纹理坐标,并输出到结构体中,o为输出的结构体;

    因为这个宏中使用了v.vertex和a.pos,故须保证:1.顶点着色器的输入结构体名为v;2.输入结构体中顶点变量名为vertex;3.输出结构体中顶点变量名为pos

    SHADOW_ATTENUATION(i);

    用于在片元着色器中通过阴影纹理采样的坐标计算阴影值,i为输入的结构体

    #include "AutoLight.cginc"

    包含计算阴影所用的宏,例如上述三种

    阴影投射:

    TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)

    用于顶点着色器中计算阴影在裁剪空间中的位置,并把结果输出到结构体中,o为输出的结构体;

    因为这个宏中使用了v.vertex和v.normal,故须保证:1.顶点着色器的输入结构体名为v;2.输入结构体中顶点变量名为vertex;3.输出结构体中包含法线信息且名为normal

    V2F_SHADOW_CASTER;

    用于在片元着色器的输入结构体中定义阴影投射所需的变量,主要包含的是深度图和阴影映射纹理等声明

    SHADOW_CASTER_FRAGMENT(i)

    片元着色器中对阴影投射结果进行计算,并输出到深度图和阴影映射纹理中,i为输入的结构体

  • 相关阅读:
    Leetcode 第135场周赛解题报告
    程序员如何当好面试者
    程序员如何当好面试官
    Leetcode 第133场周赛解题报告
    如何高效工作——团队篇
    程序员如何高效工作——个人软件篇
    程序员如何高效工作——个人硬件篇
    HTTP协议:从原理到流程|乐字节
    Tomcat详解|乐字节
    说说Java Web中的Web应用程序|乐字节
  • 原文地址:https://www.cnblogs.com/koshio0219/p/11089829.html
Copyright © 2020-2023  润新知