Real-Time Rendering 4th Edition 读书笔记(五) 6.Texturing

6.Texturing

6.1 The Texturing Pipeline

注意以上步骤并不是所有的都必须实现.

投影函数(projector function)将模型上的一点(-2.3,7.1,88.2)投影到二维空间的点(u,v),其中uv都是[0,1],映射函数(corresponder function)将投影值分量分别乘以图片的宽高,得到(81.92,74.24),舍弃掉小数得到(81,74),然后在纹理对应坐标查询颜色值.

6.1.1 The Projector Function

投影函数的主要目的就是将模型表面的坐标(三维)转换到纹理坐标空间(二维),UV值可以是在模型制作的过程中就被赋值.也可以是通过投影函数的处理得到uv值.

多种投影函数:

一个模型的不同部位可以应用不同的投影函数,比如:

Spherical projection: 将点投射到一个虚拟的球体表面.

Cylindrical projection: u坐标的投影方式和球投影一样,v坐标通过计算沿着圆柱轴的距离.

Planar projection: 沿着一个方向将纹理投影在一个平面上.(多用于正交投影)

纹理坐标空间一般是2D空间(u,v),有时候是3D空间(u,v,w),其中的w是沿着投影方向上的深度,有些采用四个维度(s,t,r,q),齐次坐标.

6.1.2 The Corresponder Function

几种模式在[0,1]的范围内是取到正常的纹理采样数据.而超出部分处理方式不同:

wrap(DirectX),repeat(OpenGL),or tile: 超过[0,1]范围的部分采用重复平铺的方式.

mirror:超过[0,1]范围的部分也采用重复平铺,但是每次重复的时候采用与邻近的镜像.

clamp(DirectX) or clamp to edge(OpenGL): 超过[0,1]的部分将采用边缘的采样数据并延伸出去.

border(DirectX) or clamp to border(OpenGL): 超出部分取专门定义的边框的颜色.

平铺的方式在大面积的场景中使用时很廉价的.不过效果可能不太好(可能很容易看出重复的元素),可以采用混合其他的纹理来消除这个周期性的问题.(想到了Unity自带的地形系统,刷地貌).

 

6.2 Image Texturing

DirectX 左上角为(0,0),右下角为(1,1)

OpenGL左下角为(0,0),右上角为(1,1)

6.2.1 Magnification

 nearest neighbor:结果就是像素化.

bilinear interpolation(双线性插值): u,v方向都有差值操作

bicubic filter:比较昂贵.

 

 在0与1的地方一阶导数都为0,中间光滑过度. q(x)的二阶导在0,1处还是为0

6.2.2 Minification

Mipmapping

Mip 指的是拉丁文(multum in parvo),意思是 "many things in a small place"

 

 

6.3 Procedural Texturing

通常的程序纹理是通过一个或多个噪声函数生成的.

其他类型的有通过物理模拟比如水波纹和裂缝的蔓延.

6.4 Texture Animation

通过动态修改UV的值或者纹理的混合等可以实现很多种纹理特效.

 

6.5 Material Mapping

多张纹理贴图对材质效果的影响.

 

6.6 Alpha Mapping

decal Texture往模型表面映射的一个过程.

另一个是在Cutout上的应用. 在不使用广告牌的前提下,通过两个相交的矩形形成一个廉价的3D效果的交叉树(cross tree),效果还是不错的,如图:

不过如果从上面往下看,就会露馅:

这些透明的物体的渲染顺序就没有太多要求,因为通过alpha测试,透明度小于阈值的时候会被丢弃掉,代码描述:

if (texture.a < alphaThreshold) discard;

Mipmapping对 alpha test的影响:

6.7 Bump Mapping

凹凸映射:在不改变几何结构的前提下,达到更具有比普通的纹理映射的方式更具有3D效果,主要是通过修改逐像素着色器代码实现的.

关键点是将带有细节的法线信息编码到纹理中,然后在着色阶段读取法线信息,计算光照的影响。

切空间(a tangent frame, a tangent-space basis)

tangent, bitangent, normal (TBN)

计算光照需要将光向量从世界空间转换到切空间,然后再使用法线计算。

6.7.1 Blinn's Methods

通过存储的UV值去修改法线n得到新的法线n',另一种方法是通过高度值去修改法线方向。

6.7.2 Normal Mapping

直接将新的法线信息存在纹理中( normal map)。(x,y,z)坐标分别存在RGB颜色通道中。

通过高度图生成法线贴图:

 

6.8 Parallax Mapping

左边是理想情况,观察者应该看到的是P(ideal), 右边是一种近似的算法.

 上面的近似处理在多数情况下表现都不错,但是当V与表面的夹角越小(越接近平行),即使h很小,但是offset都会非常大,偏差就会很大.改善方法如下:

 

6.8.1 Parallax Occlusion Mapping (relief mapping)

视差遮挡贴图(浮雕贴图)可以随着观察方向的改变产生不同的自遮蔽效果.

 使用射线的方式产生的视差贴图有更明显的凹凸感,并且可以生成自己投射阴影的效果.

 

6.9 Textured Lights

发布了23 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Vitens/article/details/82962234