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

源自Mobile-Bumped

[NoScaleOffset] _BumpMap ( "Normalmap" , 2D ) = "bump" {}

[NoScaleOffset] 是指_BumpMap在Inspector面板上没有tilling和offset部分的ui

UnityShader源码2017---学习笔记与自我拓展022_第1张图片

这是shader是surface shader。

#pragma surface surf Lambert noforwardadd

光照模型是lambert,noforwardadd是指surface转成vf时不会有forwardaddpass部分,也就是说像素光源只支持一个直线光,其他光源按照逐顶点光或者SH光去做计算了。

为啥只支持一个直线光做像素光呢?

我翻看了一下compile之后的码,截图为证

UnityShader源码2017---学习笔记与自我拓展022_第2张图片

他直接把_WorldSpaceLightPos0.xyz作为一个direction vector参与了计算,也就是说xyz里存储的是向量,而不是一个postion。这明显就是个直线光。

这里也看到了UnpackNormal(float4 rgba)这个方法的展开raga.rgb *2.0 -1.0;

从cginc里扒拉一下。

UnityShader源码2017---学习笔记与自我拓展022_第3张图片

从上往下看吧。

UnpackNormalDXT5nm这个方法一看就知道是DXT的压缩方式。

因为存储normal时都是以单位向量去存储的,也就是说x*x + y*y + z*z = 1

所以我们只需要存储两个通道就好了。


UnpackNormalmapRGorAG

这个方法写的也很明白,就是说,BC5的normal存储在rg通道上,但是DXT5nm的存储在AG通道上,

DXT5nm:(1,y,1,x)

BC5:(x,y,0,1)

方法里有个特别有趣的地方就是

packednormal.x *= packednormal.w;

完成了一波骚操作。一般人都会这么做

packednormal.xy = packagenormal.wy;

但是官方的骚操作的确有趣。


最后看一下UnpackNormal

这一点我没有用明白

#ifdef 和#if defined()有什么区别?

整个方法的意思很明确,如果UNITY_NO_DXT5nm的话就直接用传入的rgb*2-1,否则就是DXT压缩的法线贴图只有两个通道。






你可能感兴趣的:(UnityShader源码2017---学习笔记与自我拓展022)