Unity资源-纹理初识(原理篇)

  • 图片格式和纹理压缩格式

  • 图片格式一般常见为 .png .jpg 等等,所代表的意义是硬盘中该图片的压缩格式,以及是否包含Alpha通道。 其数据内容记录的是真彩值信息。

  • 纹理压缩格式Unity常见为 ETC,PVRTC, ASTC等,也可称为纹理压缩算法 ,用于CPU解包后给GPU提供的纹理渲染数据。

  • 纹理压缩格式的意义在于进一步降低纹理在内存中的占比大小,以及提升CPU对纹理的解包速度。

  • 纹理内存计算公式

  • 图片格式存放的是真彩值信息,以一张512 * 512的RGBA 32位的贴图举例,其内存大小占用为 512 * 512 * 32(Bits Per Pixel) / 8 / 1024 / 1024 = 1MB。

  • 同样大小的纹理,经过纹理压缩格式计算,以 ASTC4*4举例,其内存大小占用为 512 * 512 * 8 (Bits Per Pixel) / 8 / 1024 / 1024 = 0.25MB。

  • Unity纹理种类

  • UV图:每像素位存储一个与模型顶点相对应的位置信息,UV坐标为[0, 1]

  • 高度图:每像素位存储一个与模型顶点相对应的纹理高度值信息,使用时经由模拟表面位移计算,得到一个法线值,最终实现凹凸效果。

  • 法线纹理:

  • 模型空间法线纹理:每像素存储一个基于模型空间的法线值,为XYZ三值[-1, 1],所以无法进行压缩或用于其他模型上,仅可适用于原模型,其每个像素颜色各异。

  • 切线空间法线纹理:每像素存储一个基于独立法线空间的法线值, 存储XY两值,采用UV上的坐标信息,所以取值范围为[0, 1],经由XY两值,可计算出切向防线,所以可以适用于其他模型,且像素颜色均为浅蓝色。

  • 渐变纹理

  • 遮罩纹理

  • Cube纹理

  • 光照贴图(_light, _dir, _shadow)

  • 渲染纹理(RenderTexture)

  • Mipmap

  • 开启Mipmap之后,纹理所占内存比原大小多 30%,原因为Mipmap是将一张纹理进行多级生成,并每级差异为2次幂,举例一张1024 * 1024的纹理,生成512 * 512,256 * 256,128 * 128,64 * 64,32 * 32,16 * 16,8 * 8,4 * 4,2 * 2,1 * 1 ,后几级相加内存占用总和约为原纹理的 30%。(无具体设定Level的话,会从纹理的原大小每递减2次幂生成纹理数据,直至1*1)

  • Mipmap是用于处理纹理失真/摩尔纹等问题,假定1:1的情况下,摄像机渲染一个纹理区域需要100个像素点,但在摄像机拉远后,同样的区域可能只需要20个像素点或者更小,此时如果依旧使用原先的大纹理进行渲染,会有多个纹理texel信息传递到模型同一pixel上,出现纹理失真、摩尔纹等问题。

左图为无mipmap,右图为开启mipmap(过滤模式为Point)

  • 采用mipmap会根据实时渲染情况,采用合理Level的纹理数据进行渲染。

  • 过滤模式

  • 纹理经过mipmap处理后,解决了多个纹理texel信息传递到模型同一pixel上问题,但是会出现如上图类似的后续问题,马赛克、锯齿等。原理是,纹理有一个过滤模式,该模式处理纹理的texel与模型的pixel对应有出入的时候,进行纹理平滑过渡,以Unity为例,共有4种模式。

point bilinear trilinear

  • Point(no filter): 默认过滤模式,其原理是取一个与pixel最近的texel信息,直接使用该texel数据。

  • 优点:对于模型上较为远处的点采样效率高

  • 缺点:对于模型上较为近处的点采样效率低,并可能会采到在屏幕上看起来相近,但纹理上很远的点位信息,破坏纹理采样内存的连续性。

  • Bilinear(双线性过滤):原理是先取得1个纹理Level,再以模型的pixel在纹理上相应位置的texel(或最近的texel)为准点,取得周围4个texel点位信息,再取得平均值,以该平均值的数据进行绘制。(基于性能和效果的考虑,是最为适用的一种过滤模式

  • 优点:相邻pixel的信息不会使用同一个texel,画面过渡的比较好

  • 缺点:近点依然会有和Point一样的问题。

  • Trilinear(三线性过滤):原理与Bilinear一致,但是采样范围变为了在相近的两个Level各取4个texel点为信息,以8个数据进行平均值计算。

  • 优点:进一步提升了过渡的画面效果

  • 缺点:GPU消耗较高

  • Bilinear和Trilinear 都需要依赖纹理的不同Level实现,所以需要开启Mipmap

  • Anisotropic(各向异性过滤)

  • 各向同性:当画面平行于我们时,就像是在看纹理一样的感觉,此时模型上的纹理UV就和纹理资源的UV是一样的,这就是各向同性。

  • 各向异性:反之,如果模型纹理与相机有角度,比如3D视角,2.5D视角,此时模型纹理UV和纹理资源UV就有屏幕空间角度的变化。

  • 各向同性、各向异性,其取值原理是一致的,先取得一个区域的所有texel数据,然后进行插值,计算平均值使用。各向同性因为屏幕和纹理的UV比例是可以等比计算,所以一般是在正方型范围内取值,各向异性因为有屏幕空间角度的变化,所有会以一个梯形的范围去取值,大部分是一个长方形。

  • 优点:解决了远处过渡模糊问题。

  • 缺点:采样数据增加,显存占用加大。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值