为什么法线贴图(Normal Mapping)都是蓝色的?

为了计算光照, 我们需要使用网格的"法线". 一个表面法线是一个垂直于切线平面的向量. 简单来说, 它是一个向量, 垂直于给定顶点处的网格. 下面我们会看到一个网格, 每个顶点都有一条法线.

每个向量都指向外面, 遵循着网格的弯曲形状. 下面是另一个例子, 这次是一个简单的 2D 边沿视图:

法线贴图(Normal Mapping)是一个游戏编程技巧, 它允许我们渲染相同数目的多边形(例如低解析度的网格模型), 但是在计算光照时使用高解析度网格模型的法线. 这为我们带来更好的感受, 关于深度, 真实性和光滑度.

高面数网格模型或者说精雕模型的法线被编码到一个纹理贴图(即法线图)中, 当我们渲染低面数网格模型时会从片段着色器中对它进行取样. 结果如下:

注: 左侧是4百万个三角形的高模, 中间是500个三角形的低模, 右侧是在500个三角形的低模上使用法线贴图后的效果。

对法线编码和解码

我们的表面法线是单位向量, 通常位于范围 -1.0 到 1.0 之间. 我们可以通过把法线范围转换为 0.0 到 1.0之间来把法线向量(x, y, z)存储到一个 RGB 纹理贴图中. 下面是伪码:

Color.rgb = Normal.xyz / 2.0 + 0.5;

例如, 一个法线 (-1, 0, 1) 会被作为 RGB 编码为 (0, 0.5, 1)x 轴(左/右)被保存到红色通道, y 轴(上/下)被保存到绿色通道, z 轴(前/后)被保存到蓝色通道. 最终的法线图(normal map)看起来就是下面这个样子:

一般来说, 我们使用程序来生成法线图, 而不是手动绘制.

理解法线图, 把每个通道独立出来查看会更清楚:

在绿色通道中,我们看到更亮的部分(值更接近于 1.0) 定义了法线指向上方的区域,而更暗的区域(值更接近为 0.0) 定义了法线指向下方的区域. 大多数的法线图会是蓝色,因为Z轴(蓝色通道)通常指向我们(即值为 1.0).

### Bump Mapping 基本概念 Bump Mapping 是一种用于模拟表面细节的技术,通过改变光照计算来创建视觉上的高度差异效果。这种方法并不会真正移动物体表面的几何位置,而是利用纹理影响法线方向,在不增加额外几何复杂度的情况下提供更丰富的材质表现[^3]。 ### 实现过程 为了在 GAMES101 的框架内实现 bump mapping 功能,主要涉及以下几个方面: #### 法线贴图生成 通常情况下,bump map 或者称为 normal map 是预先制作好的图像文件。这些图片存储了相对于切空间(tangent space)下的法向量信息。每个像素的颜色代表了一个特定的方向矢量,其中红色通道对应X轴分量,绿色通道对应Y轴分量,蓝色通道则表示Z轴分量[^4]。 #### 修改着色器代码 对于 fragment shader 来说,需要读取来自 texture sampler 的法线数据,并将其转换成世界坐标系中的实际法线值。这涉及到将 tangent, bitangent 和 normal 组合成矩阵,再乘以从切空间到视图空间或世界空间的变化矩阵[^2]。 ```glsl // GLSL Fragment Shader Code Snippet vec3 tangentSpaceNormal = texture(normalMap, TexCoords).rgb; tangentSpaceNormal = normalize(tangentSpaceNormal * 2.0 - 1.0); mat3 TBN = transpose(mat3(TBNMatrix)); normal = normalize(TBN * tangentSpaceNormal); ``` 上述片段展示了如何获取并处理法线贴图中的 RGB 数据,以及怎样构建TBN变换矩阵来进行正确的法线转换。 #### 更新光照计算 一旦得到了新的法线向量之后,就可以按照标准的 Phong/Blinn-Phong 模型或者其他任何所选的光照算法重新评估该fragment处的光照强度。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哎呦不错的温jay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值