UnityShader源码2017---学习笔记与自我拓展028

源自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
};
然后看看他的vert和frag。。。。MMP,算了不吐槽了,这篇博文就解析一下

UnityObjectToWorldNormal
ShadeSH9
LIGHT_ATTENUATION

#ifdef SHADOWS_SCREEN
c.rgb += o.Albedo * min(lm, atten*2);
#else
c.rgb += o.Albedo * lm;
#endif
这些吧。

先来看一下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之后了。。






猜你喜欢

转载自blog.csdn.net/u012871784/article/details/80895418
今日推荐