跟月影学可视化
月影
前奇虎 360 奇舞团团长,可视化 UI 框架 SpriteJS 核心开发者,《JavaScript 王者归来》作者
30206 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 54 讲
跟月影学可视化
15
15
1.0x
00:00/00:00
登录|注册

25 | 如何用法线贴图模拟真实物体表面

片元着色器中计算偏导数的性能开销
不需要预先计算几何体的切线和副切线
构建TBN矩阵
计算切线和副切线
计算几何体三角形网格的法向量
由几何体顶点所在平面的uv坐标和法线构成的特殊坐标系
差别:应用法线贴图和不应用法线贴图绘制出来的墙面的差别
绘制墙面并引入Phong反射模型实现光照效果
方法二:使用偏导数计算
方法一:根据几何体顶点数据计算切线和副切线
每个像素对应一个坐标点的法线数据
存储表面的法线数据
实现更逼真的效果
给物体表面增加细节
法线贴图
如何用法线贴图模拟真实物体表面
石块被变化的光源照亮效果
墙面绘制
性能开销
好处
计算TBN
定义
应用
构建TBN矩阵
法线纹理
作用
源码
推荐阅读
主题
标题
应用场景
使用偏导数实现法线贴图
切线空间
法线贴图
参考文章
如何用法线贴图模拟真实物体表面

该思维导图由 AI 生成,仅供参考

你好,我是月影。
上节课,我们讲了光照的 Phong 反射模型,并使用它给几何体添加了光照效果。不过,我们使用的几何体表面都是平整的,没有凹凸感。而真实世界中,大部分物体的表面都是凹凸不平的,这肯定会影响光照的反射效果。
因此,只有处理好物体凹凸表面的光照效果,我们才能更加真实地模拟物体表面。在图形学中就有一种对应的技术,叫做法线贴图。今天,我们就一起来学习一下。

如何使用法线贴图给几何体表面增加凹凸效果?

那什么是法线贴图?我们直接通过一个例子来理解。
首先,我们用 Phong 反射模型绘制一个灰色的立方体,并给它添加两道平行光。具体的代码和效果如下:
import {Phong, Material, vertex as v, fragment as f} from '../common/lib/phong.js';
const scene = new Transform();
const phong = new Phong();
phong.addLight({
direction: [0, -3, -3],
});
phong.addLight({
direction: [0, 3, 3],
});
const matrial = new Material(new Color('#808080'));
const program = new Program(gl, {
vertex: v,
fragment: f,
uniforms: {
...phong.uniforms,
...matrial.uniforms,
},
});
const geometry = new Box(gl);
const cube = new Mesh(gl, {geometry, program});
cube.setParent(scene);
cube.rotation.x = -Math.PI / 2;
现在这个立方体的表面是光滑的,如果我们想在立方体的表面贴上凹凸的花纹。我们可以加载一张法线纹理,这是一张偏蓝色调的纹理图片。
const normalMap = await loadTexture('../assets/normal_map.png');
为什么这张纹理图片是偏蓝色调的呢?实际上,这张纹理图片保存的是几何体表面的每个像素的法向量数据。我们知道,正常情况下,光滑立方体每个面的法向量是固定的,如下图所示:
但如果表面有凹凸的花纹,那不同位置的法向量就会发生变化。在切线空间中,因为法线都偏向于 z 轴,也就是法向量偏向于 (0,0,1),所以转换成的法线纹理就偏向于蓝色。如果我们根据花纹将每个点的法向量都保存下来,就会得到上面那张法线纹理的图片。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了法线贴图技术及其应用。首先通过Phong反射模型绘制灰色立方体并添加光照效果,然后详细解释了法线贴图的概念和作用。法线贴图是一种纹理图片,保存了几何体表面每个像素的法向量数据,用于模拟凹凸效果。文章还解释了切线空间的概念和计算方法,以及如何通过UV坐标和点的坐标计算切线和副切线。通过这些技术,读者可以了解如何使用法线贴图给几何体表面增加凹凸效果,从而更真实地模拟物体表面。 此外,文章介绍了两种实现法线贴图的方法。一种是通过构建TBN矩阵来计算法向量,需要计算几何体的切线和副切线,然后得到TBN矩阵,用TBN矩阵和法线纹理数据来计算法向量。另一种更巧妙的方法是使用偏导数来实现法线贴图,不需要预先计算几何体的切线和副切线,而是直接用坐标插值和法线纹理来计算。这两种方法各有利弊,读者可以根据实际情况选择合适的方案。 最后,文章提到了法线贴图的应用,除了给几何体表面增加花纹以外,还可以用来增强物体细节,让物体看起来更加真实。这些技术和应用可以帮助读者更好地理解和应用法线贴图,从而提升物体表面的真实感和细节表现。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《跟月影学可视化》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(3)

  • 最新
  • 精选
  • 西门吹雪
    感觉越看越难 是数学不好吗

    作者回复: 不要急,循序渐进

    2020-12-23
    1
  • 阿不晕
    法线贴图包含颜色信息么。
    2022-08-24归属地:浙江
  • Geek_29c515
    老师,您好,看了这么案例特效都是基于图形或图片的,我想掌握glsl动态文字或艺术字相关的,有什么思路或建议吗?
    2021-04-20
    1
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部