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

本文解析了Unity中Shader的实现细节,包括v2f结构体优化、vert和frag函数工作原理及UnityObjectToWorldNormal函数的两个分支含义。同时探讨了为何采用不同路径进行对象到世界空间的法线转换。

源自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之后了。。






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值