UE4 无需切线空间应用凹凸贴图
凹凸贴图(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
凹凸贴图(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 无需切线空间应用凹凸贴图相关推荐
- Unity Shader - 切线空间的法线贴图应用(T2W W2T)
法线贴图 法线贴图(或是法线纹理)其实就是一张图片中的RGB通道分别存储着法线方向的纹理(有些为了数据压缩将X,Y存储在RG通道,Z是通过1-dot(xy,xy)来近似计算). 它的由来是因为高模运行 ...
- 处理顶点——通过切线空间的凹凸映射添加逐像素细节
问题 虽然前一个教程中具有不变法线的平面物体工作良好,但如果对一个曲面或有转角的表面进行凹凸映射仍会遇到麻烦. 主要问题是包含在凹凸映射中的偏离法线是在切线空间中的,这意味着它与默认法线有联系. 为了 ...
- 切线空间、法线贴图、TBN矩阵
目录 1 法线贴图 1.1 为什么需要? 1.2 怎么做法线映射? 2 切线空间 2.1 为什么需要切线空间? 2.2 切线空间是什么? 2.3 TBN矩阵 2.4 TBN矩阵计算 3 光照计算是在` ...
- OpenGL 法线贴图 切线空间 整理
1. What`s Bump Mapping? Bump Mapping通过改变几何体表面各点的法线,使本来是平的东西看起来有凹凸的效果,是一种欺骗眼睛的技术:). 我们知道,如果几何体表面有高低不平 ...
- UE4官方文档学习笔记材质篇——UV坐标动画,凹凸贴图偏移
一.UV坐标动画 1.含义 UV 坐标动画或 UV 平移的含义是,水平 (U) 和/或垂直 (V) 移动纹理的 UV 坐标,以产生复杂动画的错觉. 2."Panner(平移)"节点 ...
- 从0开始的技术美术之路(十二)Bump Mapping(凹凸贴图映射技术)
本篇参考B站视频 "技术美术百人计划"·霜狼_may : 视差云的实现 https://zhuanlan.zhihu.com/p/83355147 PBR白皮书https://zh ...
- 置换贴图,法线贴图,凹凸贴图的区别
先自我介绍--你要是说这是自我炒作我也认了.首先说明,FXCarl是一个对3D美术一窍不同的家伙.虽然很想往技术美工方向发展了.因为是学程序出身,眼下能做的也就是写写Shaders.等到手上的项目做完 ...
- openGL之API学习(五十五)凹凸贴图技术
法线贴图是目前游戏开发中最常见的贴图之一.我们知道,一般情况下,模型面数越高,可以表现的细节越多,效果也越好.但是,由于面数多了,顶点数多了,计算量也就上去了,效果永远是和性能成反比的.怎么样用尽可能 ...
- 凹凸贴图、法线贴图、置换贴图
先我想说,对于凹凸贴图在计算机图形领域中的研究,最早开始于70年代末,至今已经有接近30年历史了.NormalMap只是一种目前很流行的凹凸贴图技术,而这里将会介绍一些目前游戏和在XBOX360和Pl ...
最新文章
- ORACLE解决登陆em状态暂挂方法
- 史上最权威宏基因组软件评估—人工重组宏基因组基准数据集
- 计算机对英语口语考试,计算机辅助高考英语口语考试中题型的设计与交际能力的实现.pdf...
- 笔记本电脑没有鼠标怎么拖动_适合办公鼠标要如何选择?除了便携更需要这些...
- C语言 *、 的含义
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_01 File类_2_File类的静态成员变量...
- 我是色色 -- 个人站开通 (*^__^*) 嘻嘻……
- python3简单爬取妹纸图网站图片
- 控制工程中的数学建模(4)——控制系统时域数学模型建立的一般步骤(之一)
- 风尚云网学习-前端页面敏感数据脱敏星号展示
- 漏洞复现永恒之蓝MS-17010+修复
- Linux上的Redis客户端软件G-dis3
- pcie转m2装系统win10_m.2固态硬盘怎么安装win10系统
- windows10突发explorer.exe“没有注册类”错误的解决方式
- Java –显示所有ZoneId及其UTC偏移量
- 困在双11“流量仓”的小红书,能否撑起200亿美元估值?
- Numpy 学习看这一篇就够了(整理+理解+精简)
- 阻塞式IO和非阻塞式IO
- vue点击按钮打开新页签,并传参
- 基于I2C/SPI的温湿度采集与OLED显示