打死都记不住的小知识点(持续更新ing...)

打死都记不住的小知识点

  • Shader
    • 混合模式
    • 切线空间转换
    • 渲染模式及变更
    • 低精度渲染
    • 渲染顺序规则
    • 光照贴图-LightMode和DirectionalMode
    • 计算视空间顶点和摄像机的距离
    • 摄像机和屏幕的内置参数
    • 顶点输入w分量的含义

Shader

混合模式

Blend SrcFactor DstFactor  :SrcFactor 是源系数,DstFactor是目标系数,源系数是由片段着色器计算出来的Fragment_out,目标系数是之前累计的原色值,存储在帧缓冲中。

切线空间转换

切线空间到世界空间转换:

  float3 normalWorld = UnityObjectToWorldNormal(v.normal);
  float4 tangentWorld = float4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w);
  half sign =v.tangent.w * unity_WorldTransformParams.w;//unity_WorldTransformParams相当于UNITY_UV_STARTS_AT_TOP定义的宏
  half3 binormal = cross(normal, tangent) * sign;
  float3x3 tangentToWorld =half3x3(tangent, binormal, normal);

模型空间到到切线空间转换:

#define TANGENT_SPACE_ROTATION \\使用这个宏即可,在UnityCG.cginc中
float3 binormal = cross( normalize(v.normal), normalize(v.tangent.xyz) ) * v.tangent.w; \
float3x3 rotation = float3x3( v.tangent.xyz, binormal, v.normal )

}

渲染模式及变更

名称 翻译 注解 对应关键字
Opaque 不透明 适用于所有的不透明的物体 对应的下面的不开启
Cutout 镂空 alpha小于阀值clip掉 _ALPHATEST_ON
Fade 渐隐 与Transparent的区别为高光反射会随着透明度而消失 _ALPHATEST_ON
Transparent 透明 高光反射不会随透明而消失 _ALPHAPREMULTIPLY_ON

Tips:如果想动态开启或者关闭某一个设定,开启对应的shader关键字,注意深度的处理,1,2都会进行深度写入,3,4不会进行深度写入

低精度渲染

#pragma fragmentoption ARB_precision_hint_fastest

渲染顺序规则

1.CameraDepth --从小到大
2.Sorting Layer(在Tags&Layer中设置,相当于mesh和canvas中的sortingLayer).
3.Order In Layer(相对于Sorting Layer的子排序,同一层时才有效,mesh中sortingOrder,Canvas的OrderInLayer)
4.RenderQueue

光照贴图-LightMode和DirectionalMode

这两个傻傻分不清楚,先看不同LightMode下,动静物体获取信息的来源。
下面动态物体简称D_,静态物体简称S_,InDis表示在ShadowDistance范围内,OutDis表示在ShadowDistance范围外,ShadowDistance在Quality–Shadows–ShadowDistance中设置。

在烘焙设置的LightMode只有:BakedIndirect、ShadowMask、Subtractive三种模式,但是我们再在ShadowMask模式中,通过Quality–ShadowsmaskMode新增一个DistanceShadowMask模式。

LightMode\数据 D_直接光照 S_直接光照 D_间接光照 S_间接光照 D_接受的动态物体的投射阴影 S_接受的动态物体的投射阴影 D_接受的静态物体的投射阴影 S_接受的静态物体的投射阴影
Baked Indirect 实时光 实时光 Light Probes 光照贴图 InDis-实时阴影,OutDis-无 InDis-实时阴影,OutDis-无 InDis-实时阴影,OutDis-无 InDis-实时阴影,OutDis-无
ShadowMask 实时光 实时光 Light Probes 光照贴图 InDis-实时阴影,OutDis-无 InDis-实时阴影,OutDis-无 InDis-实时阴影,OutDis-LightProbs获取烘焙阴影 InDis-实时阴影,OutDis-光照贴图
DistanceShadowMask 实时光 实时光 Light Probes 光照贴图 InDis-实时阴影,OutDis-无 InDis-实时阴影,OutDis-无 LightProbs获取烘焙阴影 光照贴图
Subtractive 实时光 光照贴图 Light Probes 光照贴图 InDis-(平行光)实时阴影,OutDis-无 InDis-(平行光)实时阴影,OutDis-无 LightProbs获取烘焙阴影 光照贴图

附录一份shader中关键对应的开启模式:
打死都记不住的小知识点(持续更新ing...)_第1张图片
DirctionalMode:
1.Non-Directional:烘焙时,生成一套光照贴图,包换光照信息(颜色)。
2.Directional:生成两套光照贴图。一张保存光照信息,一张用来保存入射光的主要方向。
为什么要多弄一个图保存颜色,为了烘焙出法线的效果。

计算视空间顶点和摄像机的距离

    float zDist = dot(_WorldSpaceCameraPos - worldPos, UNITY_MATRIX_V[2].xyz);

摄像机和屏幕的内置参数

名称 类型 描述
_WorldSpaceCameraPos float3 该摄像机在世界空间中的位置
_ProjectionParams float4 x=1.0(或-1.0,如果正在使用一个翻转的投影矩阵进行渲染),y=Near, z=Far, w=1.0+1.0/Far,其中Near和Far分别是近裁剪平面和远裁剪平面离摄像机的距离。
_ScreenParams float4 x=width, y=height, z=1.0+1.0/width, w=1.0+1.0/height, 其中width和height分别是该摄像机的渲染目标(render target)的像素宽度和高度。
_ZBufferParams float4 x=1-Far/Near, y=Far/Near, z=x/Far, w=y/Far, 该变量用于线性化Z缓存中的深度值。
unity_OrthoParams float4 x=width, y=height, z没有定义,w=1.0(该摄像机是正交摄像机)或w=0.0(该摄像机是透视摄像机),其中width和height是正交摄像机的宽度和高度。
unity_CameraProjection float4x4 该摄像机的摄影矩阵
unity_CameraInvProjection float4x4 该摄像机的摄像矩阵的逆矩阵
unity_CameraWorldClipPlanes[6] float4 该摄像机的6个裁剪平面在世界空间下的等式,按如下顺序:左、右、下、上、近、远裁剪平面。

顶点输入w分量的含义

从数学上讲,三维空间里的缩放(含镜像)、旋转、斜切变换,可以用3×3的方阵进行,但是,平移变换必须用4×4的方阵进行,可根据线性代数法则,一个三维向量是不能用四阶方阵变换的,所以必须为三维向量补上一个分量,就是w。
对于三维空间的“点”来说,w为1;而对于“向量”来说,w为0;原因暂不详谈,所以你必须搞明白你的vec4表示的到底是点还是向量,这对于w的取值至关重要。

你可能感兴趣的:(Unity-日常)