2.5Bump Mapping 凹凸映射

一、Bump Mapping 介绍

  • 我们想要在屏幕上绘制物体的细节,从尺度上讲,一个物体的细节分为:宏观、中观、微观
  • 宏观尺度中其特征会覆盖多个像素,中观尺度只覆盖几个像素,微观尺度的特征就会小于一个像素
  • 宏观尺度是由顶点或三角形或其他几何图元来表示,我们创建三维角色是,其四肢头部等通常在宏观尺度下建模
  • 微观尺度工作在着色模型中,着色模型通常在像素着色模型里实现,并使用纹理贴图作为参数,着色模型模拟了物体表面微观几何形状的相互作用,如:有光泽的物体在微观尺度下是光滑的,而漫反射的物体在微观尺度下是粗糙的,角色的皮肤或衣服看起来材质不同,因为他们使用了不同的着色模型或着色模型参数不同
  • 而中观尺度则表述了宏观与微观之间的特征,它包含的细节比较复杂,无法用单个三角形来渲染,但这些细节又足够大,让观察者能看出几个像素以上的表面曲率变化,比如人脸上的皱纹,肌肉组织的细节,衣服的褶皱或者砖头之间的缝隙等等,这些都属于中观尺度的特征
  • 凹凸映射就是模拟中观尺度的常用方法之一,它能够让观察者观察到比几何模型的尺度更小的细节,其基本思想在纹理中把尺度细节相关信息给编码进去,在着色过程中用稍微受到干扰的表面代替真实表面,就得让表面具有小尺度的细节

1.关于Bump Mapping

  • 凹凸贴图映射技术是对物体表面贴图进行变化然后再进行光照计算的一种技术。
  • 例如给法线分量添加噪音,或者在一个保存扰动值的纹理图中进行查找。
  • 这是一种提升物体真实感的有效方法,但却不需要额外的提升物体的几何复杂度。
  • 这种方式在提升物体的表面细节或者表面的不规则性方面有显著效果。

2.Bump Mapping分类

  • Bump Mapping的种类主要有:法线映射、视差映射、浮雕映射。这几种方法或者贴图。
  • 都是广泛的被使用,来增加模型的细节效果,或者用来做特殊的画面表现效果。
  • 最常用的是法线映射,一般的增加法线贴图后,会对局部的物体表面进行法线扰动,进而改变明暗关系,从而达到增加表面细节的效果。
  • 其中三种映射中都用到的法线贴图也是本次介绍的重点内容。

二、Normal Mapping 法线映射

1.关于Normal Mapping

  • Normal Map 是一张存有物体局部表面法线信息的一张贴图。
  • 在计算光照的时候,程序会去读取法线图,并获取到当前像素点的法线信息,结合光线信息进行光照计算。
  • 使用法线贴图计算光照,可以让物体表现出更加丰富的细节,并随着光照方向的变换实时变化。这是普通纹理贴图不能表现出的。
  • 法线贴图一般由高模映射到对应的底模上来生成。但像金属,木头等这些细节丰富的物体,可借助程序化的软件如:Photo Shop,Substance Designer等生成对应法线贴图。

2.法线映射的实现

切线空间

  • 法线的存储,一般会放到模型的切线空间中。
  • 切线空间是以物体表面的切线,副切线和法线组成的几何空间(如下图)。
  • 当我们计算光照时,需要把光照运算的向量放到统一坐标系下。读取切线空间法线,需要世界坐标转切线空间的转换矩阵 或 切线空间转世界空间的转换矩阵,将向量统一到同一坐标系后再进行光照操作。

世界和切线空间转换

  • 将世界坐标系下的顶点法线(Normal)和切线(Tangent)以及副切线(Bitangent)作为切线空间坐标系的正交基。并用这三个向量的标准正交基来构建转换矩阵。
  • 对应关系为法线作为Z轴,切线作为X轴,副切线作为Y轴。
  • 构建一个3*3的矩阵来做空间向量的坐标系转换。一般的叫该矩阵为TBN矩阵。
  • 其逆矩阵就是从切线空间到世界空间的转换矩阵记TBN-1,因为TBN为正交阵,所以其逆矩阵为TBN的转置矩阵。
  • 矩阵构建完成后,接下来就是光照计算部分。

法线存在各个空间里都可以,但关键不只是存在哪里,还有后续的光照计算

切线空间的优点:

  • 自由度高。模型空间下是绝对法线信息(仅可以用在创建它时的那个模型),而切线空间下的是相对法线信息,是对当前物体法线的扰动。(可以复用)
  • 可进行uv动画。比如:移动uv坐标来实现凹凸移动效果
  • 可以重用法线纹理。比如:一个立方体,6个面可以用一张法线贴图
  • 可压缩。由于切线空间下贴图中法线的Z方向总是正方向(模型空间下可以是负的),那么我们只存XY(切线和副切线)就能推出Z(法线)了,可以少存一个。

Unity中法线贴图的压缩格式

  • 在unity中,非移动平台上,Unity会把法线贴图转换成DXRT5nm格式。
  • 这种格式只有两个有效通道GA通道,这样可以节省空间,而移动平台Unity使用传统的RGB通道
  • 在DXRT5nm格式中,GA存储对应法线的x、y分量,z分量需要通过一个简单的运算求得。、

三、Parallax Mapping 视差映射

1.关于Parallax Mapping

法线映射虽然能展示较为逼真的模型表面细节,但毕竟法线映射只能改变法线进而改变光照,并不能让模型表面产生令人信服的遮挡效果。所有我们引入视差映射

Parallax Mapping中文为视差映射,是一种类似于法线映射的技术,但原理不同,类似法线贴图,它是用以提供模型表面细节并赋予其遮挡关系的技术,并可以和法线贴图一起使用提供令人信服的逼真效果

  • 视差映射同样引进一张新的贴图,高度图,高度图一般是作为顶点位移来使用的,但模型要包含大量三角形才能获得不错的效果,否则看起来会成块状。
  • 所有如何在有限的三角面上表示逼真的令人信服的效果?这就是视差映射技术,视差映射的核心是改变纹理坐标,但是如何改变,怎么改变?
  • 这时就需要一张存储模型信息的高度图,利用模型表面高度信息来对纹理进行偏移

2.视差映射的实现

  • 视差映射主要是要让平面看起来立体,和法线贴图一样是欺骗眼睛的做法。
  • 我们的模型在切线空间下,所有的点都位于切线和副切线组成的平面内(图中0.0点),但实际上物体要有更丰富的细节。
  • 例如图中的情况:如果不使用视差贴图,要计算当前视角下,片元A点(黄色)的信息,就是图中的Ha,实际使用视差贴图时,真实的情况应该是视线和A点延长线和物体的交点,也就是B点,相应的就是Hb

视差映射的具体算法:如何在知道A的uv值的情况下,算出B的uv值。

知道AB两者的偏移量即可

偏移量的获得:用近似的方法去求解

  • 首先拿A的高度信息进行采样,得到物体表面距离水平面(0.0)的深度值Ha。
  • 用深度值Ha和视线的三角关系算出物体上等比的偏移方向,算出近似的B点(可以看到图中近似点B和实际点B还是有挺大差距的,所以模拟度比较低)

  • 得到偏移之后B点的uv,再去对法线贴图进行采样、计算时,就不会采样A点了,而是B点
  • 理解:视差贴图是如何产生遮挡效果的
  • 当视线看到的是A点这样深度吗 比较大的,那么视差贴图计算出的偏移值也是非常大的,这样A点最终被渲染出来的机会就比较小(偏移后就被采样到其他点上了)
  • 当视线看到B点这样深度比较小的点,计算出来的偏移就比较下,甚至原来点的附近,所以被采样的机会就比较大
  • 深度大的点很容易被深度小的点覆盖掉,这样就会表现出遮挡的效果

3.陡视差映射 Steep Parallax Mapping

  • 也是近似解,但比视差映射精确

基本思想

  • 将物体表面分为若干层,从最顶端开始采样,每次沿着视角方向偏移一定的值
  • 如果当前采样的层数,大于实际采样的层数,就停止采样。

例如图中D点,采样到0.75层,实际是0.5层,就停止采样,返回偏移坐标

陡视差映射的算法:(计算偏移点的过程)

  • 首先对A点采样,得到深度大约为0.8的位置,而其对应视线深度为0.0,不符合我们的基本思想,继续采样
  • 采样B点,深度为1,视线深度为0.25,不符合,继续采样
  • 采样C点,深度大约为0.8,视线深度为0.5,不符合,继续采样
  • 采样D点,采样深度为0.5,视线深度约为0.75,符合上述的条件,认为是比较合理的一个偏移点,就返回结果(return)。

陡视差的问题

  • 在于分层机制,如果分层多,性能开销就会大;分层小,渲染锯齿就比较明显。
  • 一种做法:可以根据视角v和法线n的角度限定采样层数
  • 锯齿问题会在浮雕贴图上做改善

四、Relief Mapping 浮雕映射

1.关于Relief Mapping

  • 可以更精确的计算uv偏移量(视差如果偏移量大的话就会失真)、提供更多的深度、还可以做自阴影以及闭塞效果
  • 例如下图:可以看到浮雕的凹凸深度明显更大,且凹凸有自阴影效果

2.浮雕映射的实现

浮雕映射一般用射线步进二分查找决定uv偏移量

  • 第一步:射线步进部分,和视差贴图一样
  • 后边:二分查找部分:通过射线步进找到合适的步进后,在此步进内使用二分查找来找到精确的偏移值

为什么不直接使用二分查找?

  • 会产生比较大的误差
  • 下图为例
  • 如果直接使用二分查找,在深度0和1的中间的1点,进一步为2点 -> 3点 ->Q点。但我们要的结果是P点,可以看到结果很明显是错误的

3.视差闭塞贴图(POM = Parallax Occlusion Mapping)

  • 相对于浮雕贴图,不同之处在于最后一步
  • 浮雕贴图是在确认最后步进之后进行二分查找(在迭代次数比较多的情况下,还是挺耗的)
  • 视差闭塞贴图是在最后步进的两端uv值进行采样(下图红色箭头),采样之后再对这两个结果进行插值,插值的结果作为P点最终的偏移值

优点:

  • 相对于浮雕映射,性能更好(最后只做插值,而浮雕要做二分查找)
  • 相对于陡视差贴图,精确性更好

要求:

  • 因为最后要做插值,所以要求表面是相对比较平滑/连续的,如果有莫名的凸起结果可能会出错

五、作业

结合先行版基础光照介绍(一)将本次课程中所讲的案例结合进先前的光照效果中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/665702.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为何懂行的人都在选海信Mini LED?

今年的618大促比往年来得要更早一些。纵览各电商平台的电视产品,能发现Mini LED电视的出镜率很高,成了各大品牌的主推产品。 对于什么样的Mini LED更值得买,各品牌都有自己的说辞。因为缺乏科学系统的选购标准,消费者容易在各方说…

【VSCode】快捷方式log去掉分号

文章目录 一、引入二、解决办法 一、引入 我们使用 log 快速生成的 console.log() 都是带分号的 但是我们的编程习惯都是不带分号,每次自动生成后还需要手动删掉分号,太麻烦了! 那有没有办法能够生成的时候就不带分号呢?自然是有…

国产身份域控在接管计算机登录时,要考虑哪些场景?

当客户提出需要宁盾来接管计算机做统一认证时,我们知道,他要的其实有辣么多: 一、多操作系统的统一登录 信创项目中,客户的计算机操作系统存在windows、Linux以及麒麟、统信等国产操作系统混合使用的情况,而员工想要的…

云动态摘要 2024-05-31

给您带来云厂商的最新动态,最新产品资讯和最新优惠更新。 最新优惠与活动 [1.5折起]年中盛惠--AI分会场 腾讯云 2024-05-30 人脸核身、语音识别、文字识别、数智人、腾讯混元等热门AI产品特惠,1.5折起 云服务器ECS试用产品续用 阿里云 2024-04-14 云…

Zynq学习笔记--AXI4-Stream 图像数据从仿真输出到图像文件

目录 1. 简介 2. 构建工程 2.1 Vivado 工程 2.2 TestBench 代码 2.3 关键代码分析 3. VPG Background Pattern ID (0x0020) Register 4. 总结 1. 简介 使用 SystemVerilog 将 AXI4-Stream 图像数据从仿真输出到图像文件 (PPM)。 用到的函数包括 $fopen、$fwrite 和 $f…

dmdts连接kingbase8报错

dmdts连接kingbase报错 环境介绍1 人大金仓jdbc配置2 dmdts 人大金仓jdbc默认配置3 dmdts 修改jdbc配置4 达梦产品学习使用列表 环境介绍 dts版本 使用dmdts连接kingbase金仓数据库报错 无效的URL 对比jdbc连接串,修改配置解决 1 人大金仓jdbc配置 配置URL模版信息等 类名…

LabVIEW中PID控制器系统的噪声与扰动抑制策略

在LabVIEW中处理PID控制器系统中的噪声和外部扰动,需要从信号处理、控制算法优化、硬件滤波和系统设计四个角度入手。采用滤波技术、调节PID参数、增加前馈控制和实施硬件滤波器等方法,可以有效减少噪声和扰动对系统性能的影响,提高控制系统的…

2020 6.s081——Lab2:system calls

左岸的一座白色环形阶梯 浪人正在用和弦练习忧郁 晨曦下的少女听着吉他旋律 在许愿池边巴洛克式的叹息 ——许愿池的希腊少女 完整代码见:SnowLegend-star/6.s081 at syscall (github.com) System call tracing (moderate) 这个实验要求我们跟踪系统调用。 感觉实…

高级Java开发者的自我修养:深入剖析JVM垃圾回收机制及面试要点

在探索Java虚拟机(JVM)的奥秘过程中,垃圾回收机制(GC)是一个不可或缺的话题,尤其在面对大型应用和系统优化时显得尤为重要。JVM的自动内存管理是Java编程语言中一项革命性的特性,它大大简化了程…

Python——Selenium快速上手+方法(一站式解决问题)

目录 前言 一、Selenium是什么 二、Python安装Selenium 1、安装Selenium第三方库 2、下载浏览器驱动 3、使用Python来打开浏览器 三、Selenium的初始化 四、Selenium获取网页元素 4.1、获取元素的实用方法 1、模糊匹配获取元素 & 联合多个样式 2、使用拉姆达表达式 3、加上…

5.30 学习总

刷题记录(Codeforces Round 947 (Div. 1 Div. 2)B,C题)和Codeforces Round 948 (Div. 2)B题 一.B. 378QAQ and Mochas Array B. 378QAQ and Mochas Array time limit per test 1 second memory limit per test 256 megabytes in…

AI盒子在智慧加油站的应用

方案背景 为规范加油站作业,保障人民生命财产安全,《加油站作业安全规范》(AQ 3010-2007)中第五条规定:卸油作业基本要求,明确防静电、防雷电、防火、人员值守、禁止其他车辆及非工作人员进入卸油区。 痛点…

[羊城杯 2021]BabySmc

运行就是输入flag 不知道怎么跳过去的 这个应该就是smc加密的函数了 运行完这个函数才能继续往下 int __cdecl main(int argc, const char **argv, const char **envp) {__int64 v3; // rbx__int64 v4; // r12__int64 v5; // r13unsigned __int64 v6; // raxchar v7; // spcha…

迅狐跨境电商系统源码:技术栈与多端集成

随着全球化贸易的不断深入,跨境电商系统源码成为了连接不同国家和地区消费者与商家的重要桥梁。本文将探讨跨境电商系统源码的技术栈以及如何通过多端集成来提升用户体验。 技术栈概览 跨境电商系统源码的技术栈是构建高效、稳定平台的基础。以下是构建跨境电商系…

一份不知道哪里来的第十五届国赛模拟题

这是一个不知道来源的模拟题目,没有完全完成,只作代码记录,不作分析和展示,极其冗长,但里面有长按短按双击的复合,可以看看。 目录 题目代码底层驱动主程序核心代码关键:双击单击长按复合代码 …

七年之痒!一个 PHP 程序员职业生涯的自述

大家好,我是码农先森。 今年刚好是我毕业的第七个年头,在婚姻感情当中都有一种「七年之痒」的说法,这次我把这个词「七年之痒」用一次在我的职业生涯复盘上。七年前我从告别校园,踏入互联网编程行业,七年后我依旧在编…

FreeRtos进阶——中断的内部逻辑

中断与非中断API的区别 BaseType_t xQueueSendToBack(QueueHandle_t xQueue,const void *pvItemToQueue,TickType_t xTicksToWait); BaseType_t xQueueSendToBackFromISR(QueueHandle_t xQueue,const void *pvItemToQueue,BaseType_t *pxHigherPriorityTaskWok…

SpringBoot源码(自动装配、内嵌Tomcat)

文章目录 依赖管理pom依赖管理Web依赖自定义starter 一、WebMvcAutoConfiguration1.1 Filter1.2 Interceptor 二、源码解析2.1 SpringApplication2.1.1 构造方法1、填充webApplicationType2、自动装配Initializers3、自动装配Listeners 2.1.2 run(args) 2.2 SpringApplicationR…

实用软件分享---超级轻量级的强力卸载软件工具UninstallView_1.51

专栏介绍:本专栏主要分享一些实用的软件(Po Jie版); 声明1:软件不保证时效性;只能保证在写本文时,该软件是可用的;不保证后续时间该软件能一直正常运行;不保证没有bug;如果软件不可用了,我知道后会第一时间在题目上注明(已失效)。介意者请勿订阅。 声明2:本专栏的…

【OrangePi AIpro】从开箱到第一个AI应用开发

第一章 OrangePi AIpro介绍和开发环境搭建 1.1 OrangePi AIpro介绍 OrangePi AIpro(8T)采用昇腾AI技术路线,具体为4核64位处理器AI处理器,集成图形处理器,支持8TOPS AI算力,拥有8GB/16GB LPDDR4X,可以外接32GB/64GB/…