一、前言

上节课我们讲了纹理的放大缩小产生问题后,我们的解决方法,那么纹理是什么呢?在现代GPU中,我们可以理解为是内存+范围查询(滤波),也就是对一块区域做点查询/范围查询,并且做的非常快,也就是说我们完全可以把纹理看作是一块可以进行不同查询的数据,而不仅仅是一张图片。而由此,我们可以在许多地方应用纹理实现许多不同的效果。

二、Environment—Map环境贴图

什么是环境贴图,如上图中的茶壶可以接收到来自四面八方的光,不管是漫反射,高光还是环境光,我们把它表面上每个位置接受到的光信息记录下来绘制在一张图上,这就是环境贴图。(这里其实是一种假设,假设四面八方的环境光都来自无限远,也就是只考虑方向,而不考虑强度。哪怕是同一间屋子相距很近的不同位置,距光源的距离也会使光的强度发生变化,但环境贴图不考虑这些事情,所以只是一个近似的假设)

1.Spherical Environment Map—球形环境图

既然我们可以把光都存储在一个纹理上,我们为什么不更进一步呢?我们假设有一个无比光滑的球,那么这个球就可以反射记录在这个环境内的所有环境光,而在该环境下的所有物体接受到的环境光都可以用这个球上记录的光信息表示,这就是球形环境贴图—Spherical Environment Map

但是这会有一个很大的问题,在顶部和底部会有严重的扭曲,也就是说按两极点展开描述是不均匀的。这就要说到另一种办法Cube Map

2.Cube Map—立方体贴图

我们仍然假设用一个球储存当前环境的光照信息,但是我们用一个正方体将这个球包围住,然后由球心出发向四面八方,穿过球面直到达到正方体上,也就是说把球分成6个面分别贴到正方体的6个面上,从而舍弃球面,换为用正方体储存光照信息,这就是Cube Map

而将这么一个正方体展开,我们就得到了上面这么一张图。它成功避免了扭曲。唯一的问题是:想找到光照信息的时候,我们需要球面到正方体面的二次映射,也就是二次计算。

三、Bump/Normal mapping—凹凸/法线贴图

前面我们讲了,纹理贴图不仅仅只是可以定义物体表面的颜色/漫反射系数,还可以定义其它的东西,比如物体表面不同位置相对于原始表面的相对高度,法线高度等。那么这有什么用呢?如果我想表示上图右边类似的表面极其粗糙的物体,那么如果在模型上做更改会导致增加非常多的三角形,这对性能的开销显然是非常大的,而通过定义法线贴图,我们就可以通过人为的改变法线的相对高度和方向进而影响光照计算,从而达到以假乱真的效果,也就是说实际上我们并没有改变模型的形状,它仍是一个所谓光滑的模型,只是我们改变了不同法线的相对高度,产生了假的阴影效果,让我们觉得它是一个粗糙的表面,而这种方法相对于改变模型,大大减少了性能开销。

上图中黑线表示原本的模型表面,橙色线表示贴图上定义的相对高度表面

那么如何求变化之后的法线方向呢?这里我们先考虑简单的情况,也就是2维,上图中蓝色表示的是用法线贴图变换后的平面,而法线与切线是垂直的,所以只需求切线方向就可以了,而切线方向可以通过求导来得到,上图演示了这一过程。求出切线方向后,应用旋转公式旋转90度再做归一化即可得到法线方向。

我们类比到3D空间中,只需要分别求u方向和v方向的偏导,也就可以知道切线的方向了,同时再次应用旋转公式再归一化即可得到法线方向。注意:在第一条中我们把每条法线都定义成了(0,0,1),但是显然实际上物体表面的法线是朝着各个方向的,这里其实我们是在物体表面的每个法线处都定义了一个局部坐标系,名为切线空间,它是由法线切线副切线组成的一个坐标系,而在这个坐标系中,法线即为z轴,所以在这个空间下,法线的方向永远是(0,0,1)。而通过纹理映射在这个切线空间下改变法线方向,再重新计算回世界空间并和光照计算得出的结果才是我们通过法线贴图看到的结果。

四、Displacement mapping—位移贴图

位移贴图和凹凸贴图的纹理相同,但是不同的是,位移贴图并不是通过换算法线的位置得到虚假的光照计算结果,而是真的改变了顶点的位置。这样做的好处是更加真实,因为原本的凹凸贴图并没有改变集几何形状,这导致虽然看上去有凹凸感,但是外轮廓仍然没有变化,例如上图左边的球形外轮廓仍然是圆的,而右边使用了位移贴图的则不同,其次,在凹凸的部分,位移贴图还会因为自己的凸起而在自己身上产生投影,而法线/凹凸贴图则没有。

当然位移贴图也有代价,那就是它要求原本的模型的三角形划分的必须足够多,足够细。也就是说模型顶点的间隔要比纹理定义的顶点变化速度快(采样率足够高),才能使用位移贴图。(在微软的图形API:DX中,提供了一种动态曲面细分的方法:即先用法线贴图,当检测到需要模型足够细的时候,会自动将三角形细分成更多小三角形,然后再使用位移贴图,这样就可以根据需求,选择最适合的方法减少多余的性能消耗)

五、其他纹理应用

1.三维纹理

之前我们定义的纹理都是二维的,也就是仅仅停留在物体表面,它只定义了物体表面每个点的属性,而三维纹理定义了空间中每个点的属性。例如同样对一个球采用二维和三维纹理,那么把它们切开,应用二维纹理的球中间是空心的,而应用了三维纹理的球仍然可以在中间看到颜色,可以理解为实心球。当然我们并不会真的一个一个的去定义空间中每个点的属性,而是定义了三维空间中的一个噪声函数,这样就可以取得三维空间中的每一个值进一步操作,如二值化或其它操作,变成我们想要的样子,如上图中的大理石材质和Perlin Noise

2.着色的预计算

我们说过,纹理可以储存信息,其中就包括事先计算好的信息,如上图中眉骨处的投影。通过预计算投影并储存在纹理上再乘上原本不含投影的着色结果就可以实现在模型上直接得到投影而不需要实时计算。(当然也有实时计算的方法,叫做环境光遮蔽,这里不做详细介绍。)

这样我们就知道,纹理可以储存各种各样预计算的信息(不只是颜色),从而达到各种各样的效果。

3.体积渲染

体积渲染被广泛应用在医学中,通过核磁共振/CT扫描,得到三维空间中的信息,如某个点的密度,然后通过这些信息得到一个渲染结果,这就是体积渲染。扫描得到的结果也就是一张三维纹理。

六、总结

那么到这里,GAMES101的着色部分也为大家介绍完毕了,本篇主要介绍了一些纹理的高级应用如Cube Map,Bump Mapping,而实际上像是法线贴图等应用在游戏领域应用的非常广泛,因为只需要很小的工程量和性能就能达到相对好的效果,在游戏场景中自己观察,你会发现许多场景中的许多物体都应用了这些东西。那么接下来下篇将为大家继续介绍几何部分:这其中包括几何的表示方法,曲线,曲面,还有曲面细分,曲面简化的一些算法。

参考:

Lecture 10 Geometry 1 (Introduction)_哔哩哔哩_bilibili

[计算机图形学]纹理的高级应用(前瞻预习/复习回顾)相关推荐

  1. [计算机图形学]重心坐标应用纹理(前瞻预习/复习回顾)

    一.重心坐标,插值 上篇的最后我们提到了,当顶点在纹理上的对应uv坐标成功找到之后,三角形三个顶点中间的值需要用三角形的重心坐标插值计算得到,那么这个运算是怎么进行的,本篇我们将介绍.插值的运算不仅仅 ...

  2. [计算机图形学]反走样(前瞻预习/复习回顾)

    一.前言:走样的产生 上一篇我们谈到了光栅化,在讲述光栅化时我们得到了光栅化之后的这样一张图,如下图 显然,这和我们原本的三角形严重不符,原因是像素是方块,而无法完美的拟合三角形. 也就是说我们得到的 ...

  3. [计算机图形学]材质与外观(前瞻预习/复习回顾)

    一.图形学中的材质 不同的物体表面有着不同的材质,而不同的材质意味着它们与光线的作用不同.那么我们之前在介绍辐射度量学和渲染方程提到过其中一个函数,叫做BRDF,而在实际上,也就是BRDF定义了不同的 ...

  4. [计算机图形学]几何:曲线和曲面(前瞻预习/复习回顾)

    一.曲线 1.Bézier Curves-贝塞尔曲线 贝塞尔曲线也是一种显式的几何表示方法.贝塞尔曲线定义了一系列的控制点,致使确定满足这些控制点关系的唯一一条曲线:如上图定义的贝塞尔曲线满足 起始点 ...

  5. [计算机图形学]动画与模拟:关键帧动画、质点弹簧系统、运动学与绑定(前瞻预习/复习回顾)

    一.动画的简要概念 动画和语言一样,一开始都是作为传达信息的工具.什么是动画呢?简单的理解就是让画面变成"活的",也就是让它们能够动起来,其次需要一定的美观.在图形学上,我们可以把 ...

  6. [计算机图形学]动画与模拟:欧拉方法、刚体与流体(前瞻预习/复习回顾)

    一.前言 这是本专栏的倒数第二篇文章了,为什么不是最后一篇?因为我要单独写一篇总结哈哈,不管怎么说,从今年的3.13的MVP变换开始写,写到现在,也是一个很大的工程了,我很高兴能在大二下学期的期中这个 ...

  7. [计算机图形学]辐射度量学、渲染方程与全局光照(前瞻预习/复习回顾)

    一.前言 我们前面讲到的Blinn-Phong着色,Whitted-Style光线追踪都有一定问题,那就是它们并没有严格的按照物理规则定义各个变量.比如,Blinn-Phong中的光的强度,并没有一个 ...

  8. [计算机图形学]光线追踪的基本原理(前瞻预习/复习回顾)

    一.光栅化的弊端 我们为什么要用光线追踪呢,在之前的篇章中,我们提到了,光栅化的方式很难表示一些全局的效果,如(1)软阴影,(2)Glossy的反射(类似镜子但又不像镜子那么光滑的材质,如打磨的铜镜和 ...

  9. 【计算机图形学】期末考试课后习题重点复习(第1-2章)

    文章目录 第一章 1.1名词解释:图形.图像.点阵法.参数法. 1.2图形包括哪两方面的要素,在计算机中如何表示它们? 1.3什么叫计算机图形学?分析计算机图形学.数字图像处理和计算机视觉学科间的关系 ...

最新文章

  1. centos 7 安装nfs 服务
  2. dataset for person re-id
  3. 神经网络训练细节之batch normalization
  4. 前端JavaScripts基础知识点讲义代码
  5. 近半年能力没进步原因分析与求助
  6. 判断字符串出现次数最多的字符 及 次数
  7. HIBERNATE与 MYBATIS的对比
  8. android应用开发(22)---Activity的生命周期
  9. python 中time, datetime的用法
  10. [转载] Python学习系列之下划线与变量命名规则
  11. python小技巧 - 如何成为Python高手
  12. 前端开发 Grunt 之 Connect
  13. zabbix监控第一台服务器(10)
  14. matlab猜数字游戏程序,matlab 猜数字小游戏
  15. vmware虚拟机安装win11系统教程
  16. 新电脑自带的office密钥在哪里?
  17. ATF 安全启动过程
  18. 大学生计算机面试,大学生计算机毕业面试自我介绍
  19. SpringBoot 中实现配置和使用定时器_张童瑶的博客
  20. python实现矩阵转化图像

热门文章

  1. 数据库MySQL- 查询结果去重【distinct】
  2. Github 切换分支
  3. 《基于大学生的公众号集成平台》需求分析与系统设计报告(1)
  4. 【为了爱,为了pascal】【引子】癞蛤蟆与天鹅
  5. 数据库里账号的密码,怎样存放更加安全?
  6. 水晶报表php,PHP-PHP如何调用crystal report水晶报表
  7. 虚拟机装ghost系统
  8. Ubuntu下读取CHUSEI 3D Webcam 双目摄像头C++版本(调用python脚本进行配置)
  9. Vbox开机自启虚拟机 解决VBoxManage命令行无效
  10. Node.js 使用 express-jwt 解析 JWT