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

每个向量都指向外面, 遵循着网格的弯曲形状. 下面是另一个例子, 这次是一个简单的 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).

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

  1. 非常详细易懂的法线贴图(Normal Mapping)

    翻译:非常详细易懂的法线贴图(Normal Mapping) 本文翻译自: Shaders » Lesson 6: Normal Mapping 作者: Matt DesLauriers 译者: Fr ...

  2. OpenGL 法线贴图Normal Mapping

    OpenGL法线贴图Normal Mapping 法线贴图Normal Mapping简介 法线贴图 切线空间 手工计算切线和副切线 切线空间法线贴图 复杂物体 最后一件事 法线贴图Normal Ma ...

  3. 【翻译】非常详细易懂的法线贴图(Normal Mapping)

    翻译:非常详细易懂的法线贴图(Normal Mapping) 本文翻译自: Shaders » Lesson 6: Normal Mapping 作者: Matt DesLauriers 译者: Fr ...

  4. 3DShader之法线贴图(normal mapping)

    凹凸贴图(bump mapping)实现的技术有几种,normal mapping属于其中的一种,这里WALL的实现在物体坐标系空间中,其他都在物体的切线空间中实现,国际惯例,上图先: 由于时间关系我 ...

  5. 凹凸贴图(Bump Map)实现原理以及与法线贴图(Normal Map)的区别

    凹凸贴图(Bump Map)实现原理 以及与法线贴图(Normal Map)的区别 1 前言 翻译这篇教程的目的是为了帮助那些对图形渲染技术有兴趣却又苦于找不到免费中文学习资料的人.在我的身边没有任何 ...

  6. 置换贴图(Displacement map),凹凸贴图(Bump map)与法线贴图(Normal map)的区别

    英文原文地址<Difference between Displacement , Bump and Normap Maps> By Pluralsight on August 14, 20 ...

  7. (转)法线贴图Nomal mapping 原理

    法线贴图多用在CG动画的渲染以及游戏画面的制作上,将具有高细节的模型通过映射烘焙出法线贴图,贴在低端模型的法线贴图通道上,使之拥有法线贴图的渲染效果,却可以大大降低渲染时需要的面数和计算内容,从而达到 ...

  8. 【Unity Shaders】法线纹理(Normal Mapping)的实现细节

    写在前面 写这篇的目的是为了总结我长期以来的混乱.虽然题目是"法线纹理的实现细节",但其实我想讲的是如何在shader中编程正确使用法线进行光照计算.这里面最让人头大的就是各种矩阵 ...

  9. 法线贴图Nomal mapping 原理

    法线贴图多用在CG动画的渲染以及游戏画面的制作上,将具有高细节的模型通过映射烘焙出法线贴图,贴在低端模型的法线贴图通道上,使之拥有法线贴图的渲染效果,却可以大大降低渲染时需要的面数和计算内容,从而达到 ...

最新文章

  1. php表格 单元格,如何更改PHPWord表格单元格高度?
  2. php name .id,PHP函数补完:session_name()
  3. Modbus RTU 通信工具设计
  4. OpenGL 与 GLSL 版本号
  5. 华硕笔记本卸载并重新安装Ubuntu16.04
  6. (九)数据结构之“图”
  7. Centos 下面升级系统内核(转)
  8. python数据类型-----字典
  9. 快速配置 Samba 将 Linux 目录映射为 Windows 驱动器
  10. ubuntu mysql 5.7 远程_ubuntu16.0.4安装mysql5.7以及设置远程访问
  11. linux logcat阻塞,同时使用logcat的在Linux中
  12. 浮动div中的图片垂直居中
  13. Ubuntu 18.04下Couldn't connect to Docker daemon at http+docker://localunixsocket解决办法
  14. js排序算法详解-基数排序
  15. Android控件——HorizontalScrollView使用(一)
  16. 总结:form中使用onSubmit=return false防止表单自动提交,以及s...
  17. 用计算机怎么管理小米路由器,小米路由器3G怎么设置?(电脑)
  18. 华为路由器:清除配置
  19. gstreamer debug tracer使用概览
  20. kestrel虚拟服务器,如何使Kestrel Web服务器监听非本地主机的请求?

热门文章

  1. 元旦快乐,送大家一条水晶龙
  2. 透明效果(六)--透明测试
  3. 什么样的Team Leader是个优秀的Team Leader?
  4. android WIFI to unity
  5. 非常有用之 Unix/Linux 单行脚本
  6. 遭遇木马Trojan.PSW.ZhengTu.dm、Trojan.PSW.LMir.atb
  7. linux下强制杀死进程和解压缩命令
  8. MyEclipse 使用技巧
  9. C++_运动会排程问题
  10. openGL+Python=PyopenGL模块