码迷,mamicode.com
首页 > 其他好文 > 详细

关于法线贴图

时间:2017-03-01 14:27:46      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:family   oat   mil   使用   2.0   导出   实时   而不是   rom   

问题:为什么需要把法线纹理的“Texture Type”设置成“Normal Map”才能正确显示。

回答:这样的设置可以让Unity根据不同平台对纹理进行压缩,通过UnpackNormal函数对法线纹理进行正确的采样,即“将把颜色通道变成一个适合于实时法向映射的格式”。

 

问题:把“Texture Type”设置成“Normal Map”后,有一个复选框是“Create from grayscale”,这个是做什么用的。

回答:默认是Tangent-Space Normal Map,勾选后就表示Grayscale Height Map

 

问题:为什么要使用Tangent Space

回答:模型自带的法线,是属于Object-Space Normal Map,输出到贴图上是五颜六色的。

  法线贴图上的法线,是属于Tangent-Space Normal Map,整体是一个蓝色的,unity只支持这种发现纹理。   

这两种法线贴图各有优缺点,但总的来说切空间法线贴图更实用,二者的优点如下:

模型法线:记录绝对发现信息,实现简单直观,UV接缝处好平滑;

切空间法线:记录相对值,自由度高,可进行UV动画,可充用NormalMap,可压缩(法线是单位向量,可通过两个值推导出第三个值)。

 

问题:光照计算,转换到那个空间

回答:如果使用模型自带的法线时,我们一般把所有信息转换到World Space中;如果是使用法线纹理,一般是转换到Tangent Space中。

 

问题:法线矩阵转换的特殊之处

回答:对法线的转换需要使用矩阵的逆转置矩阵,比如将normal从模型坐标转换到世界坐标:

o.worldNormal = mul(SCALED_NORMAL(float3x3)_World2Object);  

使用的是_World2Object而不是_Object2World

还有比如:

float3 norm = mul((float3x3)UNITY_MATRIX_IT_MV, v.normal);

使用的是UNITY_MATRIX_IT_MV,以保证缩放以后发现仍然垂直于物体表面。

ps:unity5以后可以直接使用函数将模型转换到world坐标:

fixed3 worldNormal = UnityObjectToWorldNormal(v.normal)  

关于法线贴图

标签:family   oat   mil   使用   2.0   导出   实时   而不是   rom   

原文地址:http://www.cnblogs.com/sifenkesi/p/6483697.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!