u3d_shader_surface_shader_3

参考http://my.oschina.net/u/138823/blog/181131

加了个凹凸贴图:

抱歉把女神苏菲做成这样。

一:Normal Texture的制作:

1.首先是Normal Map的制作,直接在U3D里选取纹理Type为Normal类型即可

二:UnpackNormal:

2. o.Normal = UnpackNormal(tex2D(_BumpMap,mIn.uv_BumpMap));对normal tex进行数据的读取,并转化到对应的二维空间

具体参考http://forum.unity3d.com/threads/unpacknormal-fixed4-packednormal-role.101163/内容。

将法线坐标从0到1转化到-1到1之间;其中法线纹理又区分不同的硬件使用情况

o(︶︿︶)o ,刚开始疑惑为什么以下:    

            o.Albedo =    tex2D(_MainTex,mIn.uv_MainTex).rgb;
            o.Normal = UnpackNormal(tex2D(_BumpMap,mIn.uv_BumpMap));

Albedo漫反射没有使用UnpackNormal进行坐标转换,(我理解错误:以为UnpackNormal进行了纹理坐标系到二维空间坐标系的转换)

inline fixed3 UnpackNormalDXT5nm (fixed4 packednormal)
{
    fixed3 normal;
    normal.xy = packednormal.wy * 2 - 1;//RGBA中,x保存在a中,y保存在g中,从A和G中获取发现数据xy;然后再求z值
#if defined(SHADER_API_FLASH)
    // Flash does not have efficient saturate(), and dot() seems to require an extra register.
    normal.z = sqrt(1 - normal.x*normal.x - normal.y * normal.y);
#else
    normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));
#endif
    return normal;
}

inline fixed3 UnpackNormal(fixed4 packednormal)
{
#if defined(UNITY_NO_DXT5nm)
    return packednormal.xyz * 2 - 1;    //
#else
    return UnpackNormalDXT5nm(packednormal);
#endif
}
改变自己
原文地址:https://www.cnblogs.com/sun-shadow/p/4761998.html