zoukankan      html  css  js  c++  java
  • 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为输入的结构体

  • 相关阅读:
    The Quad
    将OrCAD Capture CIS的设计文件(.dsn)导入到PADS Logic VX.2.3
    OrCAD Capture CIS 16.6 将版本16.6的设计文件另存为版本16.2的设计文件
    Eclipse IDE 添加jar包到Java工程中
    PADS Logic VX.2.3 修改软件界面语言
    切换Allegro PCB Editor
    Allegro PCB Design GXL (legacy) 将brd文件另存为低版本文件
    Allegro PCB Design GXL (legacy) 设置自动保存brd文件
    Could not create an acl object: Role '16'
    windows 下apache开启FastCGI
  • 原文地址:https://www.cnblogs.com/koshio0219/p/11089829.html
Copyright © 2011-2022 走看看