灰度图、高度图和法线贴图

发表于2017-12-14
评论0 5.7k浏览
什么是灰度图、高度图和法线贴图,这三者在开发中是如何使用呢,下面就给大家介绍灰度图、高度图和法线贴图的用法,希望能帮到大家。

灰度图

某点的颜色为P(R,G,B),灰度计算方法:

  1. 浮点算法:Gray = R*0.3+G*0.59+B*0.11;
  2. 整数方法:Gray = (R*30+G*59+B*11)/100;
  3. 移位方法:Gray = (R*76+G*151+B*28)>>8;
  4. 平均值法:Gray =(R+G+B)/3;
  5. 仅取绿色:Gray = G;

则点P在灰度图中的颜色为(Gray,Gray,Gray)

高度图

高度图一般是一个灰度图,每一个像素代表一个采样点的高度,一般0(黑色)表示最低点,255(白色)表示最高点。

从数学的角度看,高度图是一个二维数组v,例如采样点(x, y, z),则其灰度 g = z * 255 / MAX_HEIGHT,v[x][y]的颜色就为(g, g, g)。

法线贴图

法线贴图的出现,是为了低面数的模型模拟出高面数的模型的”光照信息”。

模型表面上像素的光照效果只与光照以及表面上的法线相关,法线的方向决定了模型表面的光照效果。因此,光照信息最重要的当然是光入射方向与入射点的法线夹角。

法线贴图跟原始的贴图是一样大小的,贴图内每个点都保存了对应高模某个点的法线信息。

生成法线贴图

法线->颜色:除2加0.5 
(-1, 1)->(0, 1)? 
(-1, 1)/2 - 0.5 = (-0.5, 0.5) + 0.5 = (0, 1) 
因为单位法线向量每个分量的取值范围是-1-1,而颜色的取值范围是0-1,因此要把单位法向量存储为颜色就需要做一个转换。

示例: 
(0, 0, 1)/2 + 0.5 = (0, 0, 0.5) + 0.5 = (0.5, 0.5, 1) = (80, 80, FF),蓝紫色 
垂直平面的法向量(0,0,1)是最多的,转换为存储颜色为(0.5, 0.5, 1),即(80, 80, FF),蓝紫色,所以通常法线贴图都为蓝紫色的。

读取法线贴图

颜色->法线: 乘2减1 
(0,1)->(-1, 1)? 
(0,1) * 2 - 1 = (0,2) - 1 = (-1, 1) 
示例: 
(0.5, 0.5, 1) * 2 - 1 = (1, 1, 2) - 1 = (0, 0, 1),平面法线

读取法线贴图即为生成法线贴图时的逆运算。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签: