Unreal Engine 4.9
照亮环境

凹凸贴图(Bump mapping) 最早由一名图形程序员发明(1978 James Blinn),它通过调整后的着色计算 来创建凹凸表面的假象,无需增加几何体。一个新法线取代了 表面法线进行着色。可通过 1d 函数对新法线进行调整(如 Perlin noise、 灰度纹理)。此方法比使用小毛病较多的真实置换贴图 (如轮廓、遮挡、阴影)更加迅速。

不带凹凸贴图 带凹凸贴图 带凹凸和法线贴图

在实时渲染中,我们通常使用称为 法线贴图 的凹凸贴图变种(偏蓝色纹理)。 法线贴图在纹理的每个像素中保存一个颜色,而像素实际上是长度为 1 的 3d 矢量。

有两种方法生成法线贴图:

  • 从灰度图创建法线贴图 - 预计算每个像素与其垂直和水平相邻像素 之间的差别。将两个结果数字(导数)转换为单位法线并存储为色彩。

  • 从一个高多边形 3D 精模烘焙法线 - 把纹理的每个像素和 高多边形物体上的 3D 表面位置结合起来,并将其编码的法线存储为颜色。

为使生成的纹理在任何旋转下均可反复使用,存储的法线矢量必须在 切线空间 中。 切线空间通常包含 3 种矢量:法线、切线和副法线。它定义表面的朝向。 将所有法线转换进切线空间中后即可对其进行重复利用, 因为它们和表面之间被定义为相对关系。切线空间贴图取决于物体的 UV 贴图,因为纹理中的 X 和 Y 方向 定义了世界空间中切线空间的两个矢量(切线与副法线)。在生成优质的 UV 贴图的同时避免切线空间穿帮 较为困难,且耗时较长。

如果使用类似 Perlin noise 的 3D 灰度函数会怎样?函数不要求任何 UV 贴图, 可增强凹凸表面临近的细节渲染。无需切线空间应用凹凸贴图 使其成为现实。

ddx 和 ddy

为不需要切线空间应用凹凸贴图,我们在材质编辑器中添加了两个新 材质表现:ddx 和 ddy。每个表现将返回其输入导数的近似值。 图像硬件计算此近似导数的方式为对两个像素进行着色并减去结果 (ddx = 右 - 左,ddy = 下 - 上)。

这些函数只能在像素着色器中使用,通常只用于在材质函数中 应用较大的效果。

项目 描述

输入

Value 计算输入导数的值。

输出

Out 输入的近似导数。类型与输入匹配。例如标量输出中的标量结果,2d 输出中的 2d,诸如此类。

ddx 和 ddy 以 2x2 的块进行计算,因此和高频率输入共用时将出现一些块状穿帮。

凹凸贴图材质函数

可通过数个 材质函数 在材质中应用凹凸贴图,而无需依赖于切线空间法线贴图。

ComputeFilterWidth

此函数利用 ddx 和 ddy 计算数值在屏幕上的变化速度。它可在 开始出现 noise 的距离中使程序化着色器淡出。淡出结果闪烁较少,在动态 下更为明显,对凹凸贴图而言及其重要,因为凹凸表面的高光可形成 严重的锯齿穿帮。

以下示例图表现的是在远处淡出的程序化凹凸贴图函数。

项目 描述

输入

In 计算过滤幅度的值。

输出

Result 输入从像素到像素的变化速度。

PerturbNormalLQ

PerturbNormalLQ 函数将灰度凹凸贴图函数输入转换为世界空间法线。 然而,因其使用的是 ddx 和 ddy (之前提及存在 2x2 块状穿帮的材质表现), 输出世界空间法线的精度较低。

项目 描述

输入

Bump 计算世界空间法线的标量凹凸值(灰度)。

输出

WS Normal 计算出的世界空间法线。

如需使用此函数输出的世界空间法线,必须将材质节点上的 tangent-space normal 设 为 false。

此函数只作为一个引用存在,不对材质函数库公开。 使用 PerturbNormalLQ 函数代替。

PerturbNormalHQ

PerturbNormalHQ 函数计算的导数比 ddx 和 ddy 更精确,可 达到更高的精度。它的原理是利用三个样本位置多次计算标量函数。

项目 描述

输入

Bump one pixel right 当前位置右方一个像素的标量凹凸值(灰度)。
Bump center 当前位置的标量凹凸值(灰度)。
Bump one pixel down 当前位置下方一个像素的标量凹凸值(灰度)。
WS Normal 可选。与凹凸贴图组合的世界空间法线。可通过 矢量变换 表现转换为世界空间法线的切线空间法线。

输出

WS Normal 组合的世界空间法线。

如需使用此函数输出的世界空间法线,材质节点上的 tangent-space normal 须为 false。

PreparePerturbNormalHQ

PreparePerturbNormalHQ 函数计算出 PerturbNormalHQ 计算世界空间法线 所需的三个样本位置。

项目 描述

输入

Value 当前位置的标量凹凸值(灰度)。

输出

Value one pixel right 当前位置右方一个像素的标量凹凸值(灰度)。
Value 当前位置的标量凹凸值(灰度)。
Value one pixel down 当前位置下方一个像素的标量凹凸值(灰度)。
FilterWidth 计算用于淡出远处细节的过滤幅度。

单个函数替代三个函数

可创建包裹凹凸映射函数的材质函数,并在其他函数中 对其进行 3 次求值。此操作可在一定程度上隐藏复杂性。

使用纹理

纹理与凹凸映射材质函数共用可提高性能;然而 由于显卡处理过滤纹理的方式,可能出现穿帮。普通过滤的颜色 以线性内插法进行插值,其导数为一个常量。这意味着使用灰度 纹理可获得表面插值不平滑的法线。

注解

描述的方法出自 Morten S. Mikkelsen 的著作(见参考)。

性能

程序化着色器对性能的消耗较大,且难以消除锯齿(与 纹理贴图相比)。我们当前提供 Perlin noise,可通过此材质表现进行优化,工作量 较大。为 n 个等级使用等级功能需要完成 n 次 大部分计算。为凹凸贴图进行 3 次函数求值产生的计算量更大。需注意消耗和像素数量 成正比。可使用所有功能,但建议只用于原型制作或在受控情况下使用。

问题

  • 尚无法正常处理翻动/镜像 UV。

工作展望

此法用于替代显式存储的切线空间。向此方向发展我们尚需更多经验。 当前添加的内容不仅为图形设计师提供了凹凸贴图,还提供了进行研究的方法。

参考

  • Bump Mapping Unparametrized Surfaces on the GPU(来自 Morten S. Mikkelsen)

    Bump Mapping Unparametrized Surfaces on the GPU

  • Derivative Maps(来自 Mikkelsen 和 3D 图形博客)

    mmikkelsen3d.blogspot.com/2011/07/derivative-maps.html

Unreal Engine 4.9
照亮环境

凹凸贴图(Bump mapping) 最早由一名图形程序员发明(1978 James Blinn),它通过调整后的着色计算 来创建凹凸表面的假象,无需增加几何体。一个新法线取代了 表面法线进行着色。可通过 1d 函数对新法线进行调整(如 Perlin noise、 灰度纹理)。此方法比使用小毛病较多的真实置换贴图 (如轮廓、遮挡、阴影)更加迅速。

不带凹凸贴图 带凹凸贴图 带凹凸和法线贴图

在实时渲染中,我们通常使用称为 法线贴图 的凹凸贴图变种(偏蓝色纹理)。 法线贴图在纹理的每个像素中保存一个颜色,而像素实际上是长度为 1 的 3d 矢量。

有两种方法生成法线贴图:

  • 从灰度图创建法线贴图 - 预计算每个像素与其垂直和水平相邻像素 之间的差别。将两个结果数字(导数)转换为单位法线并存储为色彩。

  • 从一个高多边形 3D 精模烘焙法线 - 把纹理的每个像素和 高多边形物体上的 3D 表面位置结合起来,并将其编码的法线存储为颜色。

为使生成的纹理在任何旋转下均可反复使用,存储的法线矢量必须在 切线空间 中。 切线空间通常包含 3 种矢量:法线、切线和副法线。它定义表面的朝向。 将所有法线转换进切线空间中后即可对其进行重复利用, 因为它们和表面之间被定义为相对关系。切线空间贴图取决于物体的 UV 贴图,因为纹理中的 X 和 Y 方向 定义了世界空间中切线空间的两个矢量(切线与副法线)。在生成优质的 UV 贴图的同时避免切线空间穿帮 较为困难,且耗时较长。

如果使用类似 Perlin noise 的 3D 灰度函数会怎样?函数不要求任何 UV 贴图, 可增强凹凸表面临近的细节渲染。无需切线空间应用凹凸贴图 使其成为现实。

ddx 和 ddy

为不需要切线空间应用凹凸贴图,我们在材质编辑器中添加了两个新 材质表现:ddx 和 ddy。每个表现将返回其输入导数的近似值。 图像硬件计算此近似导数的方式为对两个像素进行着色并减去结果 (ddx = 右 - 左,ddy = 下 - 上)。

这些函数只能在像素着色器中使用,通常只用于在材质函数中 应用较大的效果。

项目 描述

输入

Value 计算输入导数的值。

输出

Out 输入的近似导数。类型与输入匹配。例如标量输出中的标量结果,2d 输出中的 2d,诸如此类。

ddx 和 ddy 以 2x2 的块进行计算,因此和高频率输入共用时将出现一些块状穿帮。

凹凸贴图材质函数

可通过数个 材质函数 在材质中应用凹凸贴图,而无需依赖于切线空间法线贴图。

ComputeFilterWidth

此函数利用 ddx 和 ddy 计算数值在屏幕上的变化速度。它可在 开始出现 noise 的距离中使程序化着色器淡出。淡出结果闪烁较少,在动态 下更为明显,对凹凸贴图而言及其重要,因为凹凸表面的高光可形成 严重的锯齿穿帮。

以下示例图表现的是在远处淡出的程序化凹凸贴图函数。

项目 描述

输入

In 计算过滤幅度的值。

输出

Result 输入从像素到像素的变化速度。

PerturbNormalLQ

PerturbNormalLQ 函数将灰度凹凸贴图函数输入转换为世界空间法线。 然而,因其使用的是 ddx 和 ddy (之前提及存在 2x2 块状穿帮的材质表现), 输出世界空间法线的精度较低。

项目 描述

输入

Bump 计算世界空间法线的标量凹凸值(灰度)。

输出

WS Normal 计算出的世界空间法线。

如需使用此函数输出的世界空间法线,必须将材质节点上的 tangent-space normal 设 为 false

此函数只作为一个引用存在,不对材质函数库公开。 使用 PerturbNormalLQ 函数代替。

PerturbNormalHQ

PerturbNormalHQ 函数计算的导数比 ddx 和 ddy 更精确,可 达到更高的精度。它的原理是利用三个样本位置多次计算标量函数。

项目 描述

输入

Bump one pixel right 当前位置右方一个像素的标量凹凸值(灰度)。
Bump center 当前位置的标量凹凸值(灰度)。
Bump one pixel down 当前位置下方一个像素的标量凹凸值(灰度)。
WS Normal 可选。与凹凸贴图组合的世界空间法线。可通过 矢量变换 表现转换为世界空间法线的切线空间法线。

输出

WS Normal 组合的世界空间法线。

如需使用此函数输出的世界空间法线,材质节点上的 tangent-space normal 须为 false

PreparePerturbNormalHQ

PreparePerturbNormalHQ 函数计算出 PerturbNormalHQ 计算世界空间法线 所需的三个样本位置。

项目 描述

输入

Value 当前位置的标量凹凸值(灰度)。

输出

Value one pixel right 当前位置右方一个像素的标量凹凸值(灰度)。
Value 当前位置的标量凹凸值(灰度)。
Value one pixel down 当前位置下方一个像素的标量凹凸值(灰度)。
FilterWidth 计算用于淡出远处细节的过滤幅度。

单个函数替代三个函数

可创建包裹凹凸映射函数的材质函数,并在其他函数中 对其进行 3 次求值。此操作可在一定程度上隐藏复杂性。

使用纹理

纹理与凹凸映射材质函数共用可提高性能;然而 由于显卡处理过滤纹理的方式,可能出现穿帮。普通过滤的颜色 以线性内插法进行插值,其导数为一个常量。这意味着使用灰度 纹理可获得表面插值不平滑的法线。

注解

描述的方法出自 Morten S. Mikkelsen 的著作(见参考)。

性能

程序化着色器对性能的消耗较大,且难以消除锯齿(与 纹理贴图相比)。我们当前提供 Perlin noise,可通过此材质表现进行优化,工作量 较大。为 n 个等级使用等级功能需要完成 n 次 大部分计算。为凹凸贴图进行 3 次函数求值产生的计算量更大。需注意消耗和像素数量 成正比。可使用所有功能,但建议只用于原型制作或在受控情况下使用。

问题

  • 尚无法正常处理翻动/镜像 UV。

工作展望

此法用于替代显式存储的切线空间。向此方向发展我们尚需更多经验。 当前添加的内容不仅为图形设计师提供了凹凸贴图,还提供了进行研究的方法。

参考

  • Bump Mapping Unparametrized Surfaces on the GPU(来自 Morten S. Mikkelsen)

    Bump Mapping Unparametrized Surfaces on the GPU

  • Derivative Maps(来自 Mikkelsen 和 3D 图形博客)

    mmikkelsen3d.blogspot.com/2011/07/derivative-maps.html

UE4 无需切线空间应用凹凸贴图相关推荐

  1. Unity Shader - 切线空间的法线贴图应用(T2W W2T)

    法线贴图 法线贴图(或是法线纹理)其实就是一张图片中的RGB通道分别存储着法线方向的纹理(有些为了数据压缩将X,Y存储在RG通道,Z是通过1-dot(xy,xy)来近似计算). 它的由来是因为高模运行 ...

  2. 处理顶点——通过切线空间的凹凸映射添加逐像素细节

    问题 虽然前一个教程中具有不变法线的平面物体工作良好,但如果对一个曲面或有转角的表面进行凹凸映射仍会遇到麻烦. 主要问题是包含在凹凸映射中的偏离法线是在切线空间中的,这意味着它与默认法线有联系. 为了 ...

  3. 切线空间、法线贴图、TBN矩阵

    目录 1 法线贴图 1.1 为什么需要? 1.2 怎么做法线映射? 2 切线空间 2.1 为什么需要切线空间? 2.2 切线空间是什么? 2.3 TBN矩阵 2.4 TBN矩阵计算 3 光照计算是在` ...

  4. OpenGL 法线贴图 切线空间 整理

    1. What`s Bump Mapping? Bump Mapping通过改变几何体表面各点的法线,使本来是平的东西看起来有凹凸的效果,是一种欺骗眼睛的技术:). 我们知道,如果几何体表面有高低不平 ...

  5. UE4官方文档学习笔记材质篇——UV坐标动画,凹凸贴图偏移

    一.UV坐标动画 1.含义 UV 坐标动画或 UV 平移的含义是,水平 (U) 和/或垂直 (V) 移动纹理的 UV 坐标,以产生复杂动画的错觉. 2."Panner(平移)"节点 ...

  6. 从0开始的技术美术之路(十二)Bump Mapping(凹凸贴图映射技术)

    本篇参考B站视频 "技术美术百人计划"·霜狼_may : 视差云的实现 https://zhuanlan.zhihu.com/p/83355147 PBR白皮书https://zh ...

  7. 置换贴图,法线贴图,凹凸贴图的区别

    先自我介绍--你要是说这是自我炒作我也认了.首先说明,FXCarl是一个对3D美术一窍不同的家伙.虽然很想往技术美工方向发展了.因为是学程序出身,眼下能做的也就是写写Shaders.等到手上的项目做完 ...

  8. openGL之API学习(五十五)凹凸贴图技术

    法线贴图是目前游戏开发中最常见的贴图之一.我们知道,一般情况下,模型面数越高,可以表现的细节越多,效果也越好.但是,由于面数多了,顶点数多了,计算量也就上去了,效果永远是和性能成反比的.怎么样用尽可能 ...

  9. 凹凸贴图、法线贴图、置换贴图

    先我想说,对于凹凸贴图在计算机图形领域中的研究,最早开始于70年代末,至今已经有接近30年历史了.NormalMap只是一种目前很流行的凹凸贴图技术,而这里将会介绍一些目前游戏和在XBOX360和Pl ...

最新文章

  1. ORACLE解决登陆em状态暂挂方法
  2. 史上最权威宏基因组软件评估—人工重组宏基因组基准数据集
  3. 计算机对英语口语考试,计算机辅助高考英语口语考试中题型的设计与交际能力的实现.pdf...
  4. 笔记本电脑没有鼠标怎么拖动_适合办公鼠标要如何选择?除了便携更需要这些...
  5. C语言 *、 的含义
  6. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_01 File类_2_File类的静态成员变量...
  7. 我是色色 -- 个人站开通 (*^__^*) 嘻嘻……
  8. python3简单爬取妹纸图网站图片
  9. 控制工程中的数学建模(4)——控制系统时域数学模型建立的一般步骤(之一)
  10. 风尚云网学习-前端页面敏感数据脱敏星号展示
  11. 漏洞复现永恒之蓝MS-17010+修复
  12. Linux上的Redis客户端软件G-dis3
  13. pcie转m2装系统win10_m.2固态硬盘怎么安装win10系统
  14. windows10突发explorer.exe“没有注册类”错误的解决方式
  15. Java –显示所有ZoneId及其UTC偏移量
  16. 困在双11“流量仓”的小红书,能否撑起200亿美元估值?
  17. Numpy 学习看这一篇就够了(整理+理解+精简)
  18. 阻塞式IO和非阻塞式IO
  19. vue点击按钮打开新页签,并传参
  20. 基于I2C/SPI的温湿度采集与OLED显示

热门文章

  1. AI反腐:细查24万份合同,牵出千亿违规采购
  2. JavaScript实现左右分栏宽度拉伸
  3. python 把数字日期转换成中文日期
  4. 关于长高问题 我的看法
  5. 手机怎么解除root权限?华为手机root教程
  6. Blend for Visual Studio 概述
  7. springboot供应商管理系统毕业设计源码121518
  8. 有人知道要怎么用c++提取出文本里面的信息吗,例如把这个表格里的所有住户账号,密码提取出来
  9. vue3项目实现防抖/截流
  10. OPENSTACK-210-3-配置网络(Configure networking)-命令行