【Unity Shader入门精要】— 基础纹理

编程入门 行业动态 更新时间:2024-10-04 09:34:01

【Unity Shader入门<a href=https://www.elefans.com/category/jswz/34/1737948.html style=精要】— 基础纹理"/>

【Unity Shader入门精要】— 基础纹理

内容会持续更新,有错误的地方欢迎指正,谢谢!

引言

纹理是如何贴到模型上的:利用纹理映射技术。
纹理映射技术:把纹理想成一张弹性很好的薄膜,然后让顶点UV坐标纹理坐标对应,把这张薄膜蒙在模型上~

单张纹理

通常会使用单张纹理来代替物体的漫反射颜色。

纹理的属性

纹理从广义上讲不是一个普通的图片,我们今后会遇到各种功能性纹理,比如法线纹理,立方体纹理等,我们在Unity中选中一个纹理,属性面板会看到很多属性。

下面我们对这些属性做个大致的介绍:
1)Texture Type
纹理类型,点开后会看到一串选择,Default就是默认的纹理类型,也就是普通的图片,还有后面篇章我们要讲的法线纹理类型Normal map,还有2D中用到的Sprite等,我们要选择合适的类型,Unity才会知道该纹理的功能,也会有适应的优化。
2)Texture Shape
默认2D,还有Cube,也就是立方体纹理,后面篇章再介绍。
3)sRGB(Color Texture)
也就是标准颜色的纹理,如果不需要标准RGB颜色的纹理,可以不勾选。
4)Alpha Source
Alpha通道的来源,如果选择none表示没有该通道,默认Input Texture Alpha,表示来自于该纹理。From Gray Scale,透明通道的值会由每个像素的灰度值生成。
5)Alpha Is Transparency
当alpha用于透明处理时,我们要勾上该选项,可以防止不透明边缘锯齿现象,如果Alpha有他用,可以不勾选。
6)Wrap Mode
它决定了当纹理坐标超过[0, 1]范围后将如何平铺。有两项,repeat和clamp,repeat顾名思义,表示重复,纹理会不断重复;clamp,纹理坐标大于1时会截取到1,小于0时会截取到0。如下图:
7)Filter Mode
它决定了当纹理由于变换产生拉伸时会采用哪种滤波模式。有3种模式:Point,Bilinear,Trilinear。
a、Point模式:最近点采样。这样还不错,因为速度是最快的,但如果拉伸变形了,会出现马赛克现象。
b、Bilinear模式:双线性过滤。以像素对应的纹理坐标为中心,采样它周围4个texel(纹素)的像素,取平均值作为该坐标采样值。这是Unity默认的模式,过渡效果相对平滑,当然速度会比最近点采样有一定下降。
c、Trilinear模式:三线性过滤,会对像素大小和纹素大小最接近的两层Mipmap level分别进行双线性过滤,再对结果进行线性插值。由于使用了两次双线性过滤,也就是计算2x4=8个像素的值,速度会更加下降,当然滤波效果更好。下图是一张64x64的纹理贴在512x512的平面时用三种过滤的效果图:

8)Generate Mip Maps
当纹理缩小时,纹理中多个像素将会对应一个目标像素。这样就会出现锯齿现象。一个最常用的方法就是多级渐远纹理(mipmapping)技术。该技术将原纹理提前用滤波处理来得到很多更小的图像,形成一个图像金字塔,每一层都是对上一层图像降采样的结果。在实时运行时,比如物体远离摄像机时,可以直接用较小的纹理采样。
比如一张128*128的图,会生成64*64,32*32,16*16,8*8,4*4,2*2,1*1的图片,当然,因为要多存储这些图片,通常会多占用33%的空间。这是典型的空间换取时间的方法。所以使用时如果因为摄像机远近会放大缩小的图,比如场景资源,我们尽量用mipmap,否则取消mipmap,比如ui元素。
9)Max Size
纹理最大尺寸。如果我们导入的纹理大小超过了Max Size,那么Unity会把该纹理缩放成这个最大分辨率。导入的纹理可以是非正方形的,但长宽该是2的幂。如果使用了非2的幂大小(Non Power of Two, NPOT)的纹理,这些纹理往往会占用更多的内存空间,GPU读取速度也会下降。所以Unity在内部会把它缩放成最近的2的幂。出于性能和空间考虑,我们应尽量使用2的幂的纹理。
10)Format
Unity内部使用哪种格式存储该纹理。对于不需要使用高精度的纹理,我们要适当的用压缩格式,这对手机平台尤其重要。

凹凸纹理

凹凸映射的目的是使用一张纹理来修改模型表面的法线,以便为模型提供更多的细节。这种方法不会真的改变模型的顶点位置,只是让模型看起来好像是“凹凸不平”的,但可以从模型的轮廓处看出“破绽”。

常用的方法是使用一张法线纹理来直接存储表面法线,这种方法又被称为法线映射。
同时,在代码中会用到UnpackNormal()(该函数用于采样法线方向),而使用UnpackNormal的前提是:将纹理类型成Normal Map。

效果图:

渐变纹理

渐变纹理也叫坡度图,很多卡通风格的渲染都使用了这种技术。

使用不同的渐变纹理控制漫反射光照,左下角给出了每张图使用的渐变纹理

遮罩纹理(mask texture)

非常有用,遮罩允许我们可以保护某些区域,使它们免于某些修改。

应用:有时,我们希望模型表面某些区域的反光强烈一些,而某些区域弱一些。为了得到更加细腻的效果,我们就可以使用一张遮罩纹理来控制光照。另一种常见的应用是在制作地形材质时需要混合多张图片,例如草地的纹理、表现石子的纹理、表现裸露土地的纹理等,使用遮罩纹理可以控制如何混合这些纹理。

原理:通过采用得到遮罩纹理的纹素值,然后使用其中某个通道的值来与某种表面属性进行相乘,这样,当该通道的值为0时,可以保护表面不受该属性的影响。总而言之,使用遮罩纹理可以让美术人员更加精准地控制模型表面的各种性质。

下图显示了只包含漫反射、未使用遮罩的高光反射和使用遮罩的高光反射的对比结果:

依次为:只包含漫反射,未使用遮罩的高光反射,使用遮罩的高光反射

我们使用的遮罩纹理如下图所示:

可以看出,遮罩纹理可以让我们更加精细地控制光照细节,得到更细腻的效果。

更多推荐

【Unity Shader入门精要】— 基础纹理

本文发布于:2024-02-28 00:07:22,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1766845.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:精要   纹理   入门   基础   Unity

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!