【NO.4】纹理贴图及相关技术

您所在的位置:网站首页 纹理与贴图 【NO.4】纹理贴图及相关技术

【NO.4】纹理贴图及相关技术

2022-05-26 03:42| 来源: 网络整理| 查看: 265

《real-time提炼总结 第五章》《Real-Time Rendering 3rd  第六章》《unity shader 入门精要  第章 》

 

 

 

 

 

纹理贴图(Texturing):在计算机图形学中,纹理贴图是使用图像,函数或其他数据来源改变物体表面外观的技术

纹理管线(The Texturing Pipeline) 纹理(Texturing):是一种针对物体表面属性进行“建模”的高效技术纹素(Texels):图像纹理中的像素通常被称为纹素,区别于屏幕上的像素。贴图(Mapping 也称映射):通过投影方程(projector function)运用于空间中的点,从而得到一组称为参数空间值(parameter-spacevalues)的关于纹理的数值。这个过程就成为贴图。纹理贴图可以用一个通道的纹理管线进行描述。纹理贴图过程的初始点是空间中的一个位置。这个位置可以基于世界空间,但是更常见的是基于模型空间。因为若此位置是基于模型空间的,当模型移动时,其纹理才会随之移动。 第一步:通过 投影方程 运用于 空间中的点,从而得到一组称为 参数空间值 的关于纹理的数值。第二步:在使用这些新值访问纹理之前,可以使用一个或多个 映射函数 将 参数空间 转换到 纹理空间。第三步:使用这些纹理空间值从纹理中获取相应的值,例如可以使用图像纹理的数组索引来检索像素值。第四步:再使用值变换函数对检索结果进行值变换,最后使用得到的新值来改变表面属性,如材质或者法线等

 

空间位置object space(x,y,z) -|> 参数空间parameter space (u,v)-|>纹理图像空间 texture image space(x,y)-|>颜色值texel color(r,g,b)----

                                 投影函数:映射值域0到1             映射函数:uv乘以分辨率去掉小数                查找对应颜色值

---->颜色值用于着色方程,作为漫反射颜色值,替换之前的漫反射颜色值

 

 

投影函数The Projector Function 功能:将空间中的三维点转换为纹理坐标,也就是获取表面的位置并将其投影到参数空间中。常规情况下投影函数通常在美术建模阶段使用,并将投影结果存储于顶点数据中。也就是说在然健开发过程中我们一般不会去投影函数去计算得到投影结果,而是直接使用在美术建模过程中,已经存储在模型顶点数据中的投影结果。特殊情况: OpenGL的glTexGen函数提供了一些不同的投影函数,包括球形函数和平面函数。利用空闲时间可以让图形加速器来执行投影过程,而这样做的优点是不需要将纹理坐标送往图形加速器,从而可以节省宽带。更一般的情况,可以在顶点或者像素着色器中使用投影函数,这可以实现各种效果,包括一些动画和渲染方法(比如环境贴图,environment mapping ,有自身特定的投影函数,可以针对每个顶点或者每个像素进行计算) 非交互式渲染器(Noninteractive rederers)通常将这些投影方程称为渲染过程本身的一部分。一个单独的投影方程就有可能适用于整个模型,但其实实际上,美术同学不得不使用各样的工具将模型进行分割,针对不同的部分,分别使用不同的投影函数。

  映射函数 The Corresponder Function 作用:将参数空间坐标转换为纹理空间坐标UV的正常取值范围[0,1),超出范围的值域纹理显示方式由映射函数来决定。OpenGL中叫 封装模式(Warapping Mode)。Direct3D 中叫 寻址模式(Texture Addressing Mode)常见的映射函数: 重新寻址模式,Wrap (DirectX),repeat(OpenGL)。图像重复出现镜像寻址模式,mirror。图像在物体表面上不断重复,但每次重复时对图像进行镜像或反转。夹取寻址模式,clamp(DirectX),clamp to edge(OpenGL)。将纹理坐标夹取在[0.0,1.0]之间,也就是说在0到1 之间把纹理复制一遍,然后对之外的内容将沿uv轴进行延伸边框颜色寻址模式,border(DirectX),clamp to border(OpenGL)。在0到1之间绘制纹理,之外的内容用边框颜色填充。

 

体纹理 Volume Texture 即 三维纹理(3D texture),是传统二维纹理(2D Texture)在逻辑上的扩展,可以被认为由很多张2D纹理组成,用于描述三维空间数据图片。三维纹理通过三维纹理坐标进行访问。二维纹理是一张简单的位图图片,用于为三维模型提供表面点的颜色值。volume texture可以理解是一摞2D texture,sample的时候用第几摞+2D坐标来sample.虽然体纹理具有更高的储存要求,并且滤波成本更高,但它们具有一些独特的优势: 可以跳过为三维网格确定良好的二维参数的复杂过程,因为三维位置可以直接用作纹理坐标,从而避免了二维参数化中通常会发生的变形和接缝问题。体纹理也可用于表示诸如木材或大理石的材料的体积结构。使用三维纹理实现出的这些模型,看起来会很逼真,浑然天成。 劣势: 使用体纹理作为表面纹理会非常低效,因为三维纹理中的绝大多数样本都没有起到作用。 立方体贴图 Cube Map 是一种特殊的纹理技术,他用6幅二维纹理图像构成一个以原点为中心的纹理立方体,对于每个片段,纹理坐标(s,t,r)被当做方向向量看待,每个纹素都表示从原点所看到的纹理立方体上的图像。

可以使用三维纹理坐标向量来访问立体贴图中的数据,该矢量指定了从立方体中心向外指向的光线的方向:(x,y,z)中取绝对值最大的相应面,并将绝对值当做单位大小除另两个值,此时范围是(-1,1)。再映射到(0,1)中。eg:(-2,6,-8)->z面->((-2/8+1)/2,(6/8+1)/2)=(0.38,0.88)sample的时候使用vector射线型的sample.立方体贴图支持双线性滤波以及 mip mapping ,但可能在贴图接缝处出问题,可以使用ATI公司的CubeMapGen,采用来自其他相邻样本创建mipmap链,并考虑每个纹素的角度范围,可以得到不错的效果。   纹理缓存 Texture Caching

建议:保持纹理在不需要放大再用的前提下尽可能小,并尝试基于多边形将纹理分组。几遍所有纹理都一直存储在内存中,这种预防措施也可能会提高处理器的缓存性能。

常见纹理储存使用策略:

    1)最近最少使用策略 Least Recently Used ,LRU 最常用的一种策略,作用:加载到图形加速器的内存中的每个纹理都给出一个时间戳,用于最后一次访问与渲染图像时。当需要空间,首先卸载最旧时间戳的纹理。一些API还允许为每个纹理设置一个优先级:如果两个纹理的时间戳相同,则优先级低的纹理首先被卸载。     2)最近最常使用策略 Most Recently Used,MRU 如果自己开发纹理管理器,carmack提出了一种非常有用的策略:对交换出缓冲器的纹理进行核查思想:鉴于如果在当前帧中载入纹理,会发生抖动(Thrashing)的情况。这种情况下LRU会对每张纹理图像进行交换。这种情况可以采用MRU策略直到画面中没有纹理交换为止再切换回LRU     3)预取策略 Perfetching 原因:加载纹理花费时间,特别是在需要将纹理转换为硬件原生格式时。纹理加载在每个框架可以有很大的不同。在单个帧中加载大量纹理使得难以保持恒定的帧速率。做法:在将来需要预期的情况下,预计未来的需求然后加载纹理,将加载过程分摊在多帧中。     4)裁剪图策略 Clipmap 原因:飞行模式和地形模拟系统,图像数据集可能会非常巨大,传统的方法是将这些图像分解成更小的硬件可以处理的 瓦片地图(tiles)思想:将整个数据集视为一个mipmap,但是对于任何特定视图,只需要mipmap的低级别的一部分即可。(DirectX10支持)优点:高分辨率地形图访问海量数据库,使用Clipmap技术可以减少在同一时间所需数据量。

 

纹理压缩 Texture Compression

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3