百人计划2.5 BumpMapping

凹凸映射技术详解
本文介绍了凹凸映射技术,包括法线映射、视差映射和浮雕映射三种类型。讨论了这些技术如何在不增加模型复杂度的情况下提供丰富的视觉效果。重点分析了法线映射的原理及其实现过程。

BumpMapping

BumpMapping介绍

凹凸映射是为了描述物体的一些细节。从三个方面讨论,宏观尺度覆盖很多像素,中观尺度覆盖几个像素,微观尺度覆盖小于一个尺度。
宏观尺度是由顶点,三角形等一些图元来表示的。
微观尺度工作在着色模型当中,通常在fragment shader中实现。并且使用了纹理贴图作为参数,着色模型描述了物体表面微观几何形状的相互作用。
而中观尺度结余两者之间,不是一个三角形能表达的问题,又大与一个fragment所能表示的范围。比如说衣服的褶皱,人脸的皱纹等。
凹凸映射是描述中观尺度常用的方法之一,他的基本思想是将模型的一些细节存储到纹理当中。在着色过程中,我们用稍微干扰的表面代替真实的表面。
从原理上讲,凹凸映射技术是对物体表面的贴图进行变化,然后再进行变化的一种技术。例如给法线添加噪声,那么这种就是法线贴图,如果在保存扰动值得纹理图中进行查找,那么他就是视差贴图或者浮雕贴图。
他不需要增加模型的复杂度就能提供不错的效果。
**凹凸映射的分类:凹凸映射的种类大概有三种:法线映射,视差映射,浮雕映射。**从左到右效果依次增加,所使用的消耗也依次增加。

NormalMapping

NormalMapping是存有一张物体局部表面法线信息的一张贴图。在计算光照的时候,程序会先读取发现图并获取其中的法线信息。结合光线信息对光照进行计算,使用法线贴图计算光照,可以让物体表面实现出更加丰富的细节。
法线贴图一般由高模映射到对应的底模上来生成,但像金属,木头之类细节丰富的物体,可以借助程序化的软件进行生成。
请添加图片描述

法线映射的实现:

法线的存储,一般会放到模型的切线空间中。切线空间是以物体表面的切线, 副切线和法线组成的几何图形。
当我们计算光照时,需要将光照运算的向量放到统一坐标系下。读取切线空间法线,需要世界坐标转切线空间的转换矩阵,或者他的逆矩阵。再将向量统一到一坐标系后再进行光照操作。
TBN的逆矩阵,由于是旋转矩阵,计算TBN只需要进行转置就可以了
请添加图片描述
转换到一个空间后就可以进行光照计算了。
为什么要转换到切线空间,而不是将法线映射转换到世界空间进行变换可以详细看入门简要。
总结而言就是切线空间计算量低,并且适用场景广,便于压缩。
对于相对空间而言只需要两个通道就可以存储法线贴图,而在绝对空间中需要三个通道进行存储。
Unity中法线贴图的压缩格式:
在非移动平台,unity会将法线贴图转换成DXRT5nm格式,这个格式只有两个通道。而在移动平台中,unity使用的是传统的RGB格式。
请添加图片描述
法线和切线的值是[-1,1],因为有两个方向。但是贴图的颜色值只能存储到[0,1],所以编码时是有一个color = 0.5*normal + 0.5的操作的。解码时需要逆过来求normal或者tangent的值。

ParallaxMapping

视差映射主要是为了实现模型表面一个遮挡关系细节的映射,他可以与法线贴图一起使用。
实现视差映射需要引入一张新的高度图,高度图是对物体表面顶点位移。但是使用高度图对模型的表面的三角形和顶点有非常高的要求,并且进行了大量的计算。
视差贴图的原理和实现可以通过上一篇了解。
更加具体的细节可以通过OPENGL中进行了解。再复习一下,是将实际点A根据高度图采样的高度,对视角V进行缩放。
请添加图片描述

ReliefMapping

浮雕映射是对视差贴图技术的进一步改进,他需要的不单是一张高度图,更需要一张浮雕图。
浮雕映射一般采用射线步进,和二分查找来决定uv偏移量。他的射线步进和视差映射所使用的是同一种技术,都是将虚拟的采样点进行分层,找到合适的一层进行采样。但视差映射所使用的技术是遍历式的,在分了很多层时需要相当多的采样。而视差贴图所使用的是二分查找,二分查找所需要的计算和时间明显小于遍历式。
浮雕映射的做法是先进行视差步进,找到满足条件的层级n。再将n与其上一层进行二分查找,找到与真实的观察点更接近的值。

### 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处的光照强度。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值