计算机图形学14:纹理应用

1.概述

        在现代的GPU里,可以把纹理理解为GPU上的一块内存,内存上有一块区域可以做点查询也可以做范围查询,并且很快。纹理完全可以理解为是一块数据,可以做不同类型的查询,不限于把它理解成图像。纹理可以表示很多东西,比如环境光照(环境光映射/环境贴图)。

2.环境贴图

        例如在一个房间中的某一位置,四面八方都有光,任何一个方向都可以照射到这个位置,将所有照射到这里的光记录下来就是环境贴图(Environment Map)
        下图中左侧,向房间中每个方向望去,把看到四面墙展开放在一张图上,这张图像可以理解为从四周进入到人的眼睛的光,右侧是渲染的茶壶(经典犹他茶壶),这个茶壶会被环境光照亮,也就是说会被房间里任何方向的光照射,同时也会反射出任何方向的环境光进入人的眼睛,如果你仔细观察会发现茶壶表面会一一对应左侧的环境光贴图,我们用一张贴图描述环境光,这就比用点光源来描述更加简单方便。

        环境贴图只记录光源的方向信息,认为光无限远,没有深度的意义。

2.1球面环境图

        如果把环境光描述在纹理上,就可以渲染出很好的效果。如上图所示,左边是一个环境光,用到一个球上,然后放在各个不同的方向上记录一个点,再把这张图拉开,这就是球面环境图(Spherical Environment Map)。

        可以通过鱼眼摄像机获取或者多拍几张照片360/720度合成。

        还可以展开成一张二维图。如下图所示。

        然而,当直接展开成周围环境时,会发生扭曲的现象。(顶部和底部部分会显得缩小)。也就是球形环境贴图,做到了描述一个球体,但不是一个均匀的描述,会在靠近球体两极的地方出现扭曲(例如地球南极北极地区实际比在地图上看起来要更大)。

2.2立方体贴图

        针对球形环境贴图无法对环境进行一个均匀的描述,在原来球体上取一个包围盒,一个立方体,把环境光的信息存放在立方体上,这就是立方体贴图(Cube Map)。如下图所示。

        将立方体六个面展开后,如下图所示。

        与球形环境光贴图相比,解决了两极的扭曲问题,计算时需要先找到对应的面在去查询而不是直接根据角度在球面上读取,但是这个计算过程非常快,几乎没什么影响,所以立方体贴图在环境光照的实现中被广泛使用。

3.凹凸贴图

        纹理处理可以描述颜色之外,还可以定义任何位置的任何属性,可以定义表面上任意一点相对高度,这个相对高度指的是先定义一个基础表面,在这个基础表面上沿着法线向上向下变化的偏移量,这个相对高度的集合就是凹凸贴图(Bump Mapping)

        如上图,右侧橘子表面会不规则的凹凸,如果这种效果通过若干个三角形来渲染,那计算量会非常大,但是我们可以通过凹凸贴图实现同样的效果。首先定义三角形的顶点上的纹理坐标,有一张上下凹凸的纹理贴图,就可以通过查询出来的任意一个点的相对高度,也就是说通过凹凸贴图,可以在不把几何形体变复杂的情况下,影响到法线的变化,着色后会产生明暗对比,人们的视觉就认为物体表面有凹凸的东西。

4.法线贴图

        法线贴图(Bump Mapping)凹凸贴图其实是一回事,通过定义不同位置的高度和邻近位置的高度差来重新计算它的法线,给任何一个像素的法线做个扰动,并不会添加三角形。可以通过相对高度改变法线方向。如下图所示,黑色线是原本光滑的表面,对于表面上任意的一点p,经过凹凸贴图应用后变成了黄线上的那个点,从而改变法线的方向。

        那么,如何去计算这个法线方向呢?

        我们先把问题简单化,不考虑二维贴图和三维空间。只考虑原本表面变化的一维函数,蓝色的波浪形由凹凸贴图定义出来,原本的几何法线方向是向上的,在P点的法线为(0,1)。先计算曲线上任意一个点的切线(梯度、函数的导数),假设这个点沿水平方向向右移动一个单位,向上移动的距离就是dp = c * [h( p + 1 ) -h( p )]c表示凹凸贴图影响大小,这时向量 (1,dp) 就是要求的切线。

        我们知道法线和切线相互垂直,这时只需要将切线逆时针旋转90就是法线,根据旋转矩阵的特性将y变负,xy对调,就是逆时针旋转90度,即要求的法线为(-dp,1)最后归一化就得到了新的法线。如下图所示。

        那么,在实际三维的情况下呢?

        如上图所示,实际使用实在三维空间中,思路是一致的,如下。

        1.先假设原本的平面法线为(0,0,1)
        2.计算切线。贴图有U方向和V方向,也就是垂直和水平方向,对应的需要分别求出任一点U方向的上的切线(dp/du)V方向的切线(dp/dv)
        3.逆时针旋转并归一化,(-dp/du,-dp/dv,1).normalized()计算的结果就是新的法线,或者使用U、V方向切线向量叉乘得到新法线。

        注意:第一步假设平面法线坐标为(0,0,1)使用的局部坐标系,计算完法线后需要转换回世界坐标系。

5.位移贴图

        位移贴图(Displacement Mapping)和凹凸贴图使用的是一样的纹理,定义一个点相对的高度,输入完全一样,但位移贴图会把三角形的顶点真的做一个位置移动。

        如下是两个对比图,左侧凹凸贴图在渲染过程中实际上没有改变几何,所以仔细观察会发现边缘的地方是平的,凸起的部分也没有阴影。而位移贴图是实际改变了几何体的顶点,凸起部分会有阴影,效果也更加真实。但是是需要前提的,几何顶点之间的间隔频率要比纹理定义的频率还要高,所以几何体的顶点数量要足够多,多到可以支持凹凸部分平滑变化。

        我们不希望模型顶点无限多,可以通过新的思路。起初模型较粗糙点(三角形少一点),在应用位移贴图的过程中检测一下是否需要把三角形变得更细,需要的话先拆分再做位移贴图。Direct X就这么做的,但是只能windows系统。

6.三维纹理

6.1三维纹理

        纹理不仅仅是二维的,还能表示三维的纹理,就是三维纹理(3D Textures)。二维纹理只应用在物体表面,是没法看的物体内部的构造,而三维纹理定义了空间中任何一个点的值。如下图所示。

        三维纹理实际上没有真的生成图,而是通过噪声函数生成,三维空间中任何的点都有一个解析式可以算出来噪声的值,这个噪声可以进行一系列的处理:二值化、加、减、乘等运算,变成需要的样子,如上图中大理石材质就是利用有名的柏林噪声(perlin noise)产生的三维纹理渲染的。

6.2体积渲染

        三维纹理广泛的应用于体积渲染(Volume Rendering),体积渲染不是考虑物体的表面,比如在医学领域的核磁共振成像或者CT成像去扫描人体组织的某一块,返回三维空间上的信息,任何一个点的信息,通过这些信息渲染一个结果。如下图所示。

        除了在医学领域应用,也可以用于地质勘探、气象分析、分子模型构造等领域。体绘制技术也能用于自然界中很多视觉效果是不规则的体,如流体、云、烟等,它们很难用常规的几何元素进行建模,使用粒子系统的模拟方法也不能尽善尽美,而使用体绘制可以达到较好的模拟效果。

7.AO(环境光遮蔽)贴图

        

        纹理还能记录一些之前已经算好的信息。如上图中,左图和右图,人的眼窝越深的地方越暗,有阴影的效果,这就是环境光遮蔽的效果。由于实时阴影计算量大,可以通过一张预计算好的贴图,在渲染时采样的该贴图的值,作为可见性与原来的色相乘得到的,这张贴图就是AO贴图(Ambient Occlusion Texture Map)。
        这个效果利用一些光照算法也可以达到,但计算复杂难开销较大以做到实时应用 。在实时渲染中一般选AO贴图模拟。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YanisWu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值