打死都记不住的小知识点
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(normalWorld , tangentWorld ) * sign;
float3x3 tangentToWorld =half3x3(tangentWorld , binormal, normalWorld );
模型空间到到切线空间转换:
#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中关键对应的开启模式:
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的取值至关重要。