源自Mobile-VertexLit-OnlyDirectionalLights
看了20多个源码了,第一次产生了想摔unity的感觉。
这个shader写了写什么乱八七躁的。乍眼一看,以为是个surfaceshader,细看才发现是个vf。
然后看看他的v2f结构体。。
struct
v2f_surf
{
float4
pos
: SV_POSITION
;
float2
pack0
: TEXCOORD0
;
#ifndef
LIGHTMAP_ON
fixed3
normal
: TEXCOORD1
;
#endif
#ifdef
LIGHTMAP_ON
float2
lmap
: TEXCOORD2
;
#endif
#ifndef
LIGHTMAP_ON
fixed3
vlight
: TEXCOORD2
;
#endif
LIGHTING_COORDS
(
3
,
4
)
UNITY_FOG_COORDS
(
5
)
UNITY_VERTEX_OUTPUT_STEREO
};
能不能再精炼一点。。。哪怕就下面那样也好啊
struct
v2f_surf {
float4
pos
: SV_POSITION
;
float2
pack0
: TEXCOORD0
;
#ifndef
LIGHTMAP_ON
fixed3
normal
: TEXCOORD1
;
fixed3 vlight : TEXCOORD2;
#endif
#ifdef
LIGHTMAP_ON
float2
lmap
: TEXCOORD2
;
#endif
LIGHTING_COORDS
(
3
,
4
)
UNITY_FOG_COORDS
(
5
)
UNITY_VERTEX_OUTPUT_STEREO
};
UnityObjectToWorldNormal
先来看一下UnityObjectToWorldNormal
// Transforms normal from object to world space
inline
float3
UnityObjectToWorldNormal
(
in
float3
norm )
{
#ifdef
UNITY_ASSUME_UNIFORM_SCALING
return
UnityObjectToWorldDir
(norm);
#else
// mul(IT_M, norm) => mul(norm, I_M) => {dot(norm, I_M.col0), dot(norm, I_M.col1), dot(norm, I_M.col2)}
return
normalize
(
mul
(norm, (
float3x3
)
unity_WorldToObject
));
#endif
}
// Transforms direction from object to world space
inline
float3
UnityObjectToWorldDir
(
in
float3
dir )
{
return
normalize
(
mul
((
float3x3
)
unity_ObjectToWorld
, dir));
}
然后为了方便看,我合并一下
// Transforms normal from object to world space
inline float3 UnityObjectToWorldNormal( in float3 norm )
{
#ifdef UNITY_ASSUME_UNIFORM_SCALING
return normalize(mul((float3x3)unity_ObjectToWorld, norm));
#else
// mul(IT_M, norm) => mul(norm, I_M) => {dot(norm, I_M.col0), dot(norm, I_M.col1), dot(norm, I_M.col2)}
return normalize(mul(norm, (float3x3)unity_WorldToObject));
#endif
}
我能理解他们这两个分支的意思。但是为什么要这么做呢?
直接return normalize(mul(norm, (float3x3)unity_WorldToObject));这样不好么?
然后LIGHT_ATTENUATION和 ShadeSH9 还有SHADOWS_SCREEN, 到时候单独开说吧,有点太复杂了。。。
这些可能要longlongtime之后了。。