您的位置:首页 > 其它

u3d_shader_surface_shader_3

2015-08-26 23:28 399 查看
参考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
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: