Unity Shader学习笔记(10)纹理(Texture)的属性
发表于2017-12-29
本篇文章将和大家介绍纹理(Texture)的属性,让大家了解每个功能的用法。
Texture Type
选择适合的类型,Unity会为Unity Shader传递正确的纹理,并对一些纹理进行优化。
Defualt(默认纹理)
Normal map(法线纹理)
使用了法线纹理类型,Unity会根据不同平台对纹理进行压缩,如DXT5nm格式,通过UnpackNormal函数进行采样,见下面UnityCG.cginc中源码。这种压缩只用两个通道(原来三个),减少法线纹理占用的内存空间。
inline fixed3 UnpackNormalDXT5nm (fixed4 packednormal) { fixed3 normal; normal.xy = packednormal.wy * 2 - 1; normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy))); return normal; } inline fixed3 UnpackNormal(fixed4 packednormal) { #if defined(UNITY_NO_DXT5nm) return packednormal.xyz * 2 - 1; #else return UnpackNormalDXT5nm(packednormal); #endif }
Create from Grayscale
用于高度图生成法线纹理。这样就可以和切线空间下的法线纹理同等对待了。
- Bumpiness:控制凹凸程度
- Filtering:决定凹凸程度计算方式
- Smooth:生成平滑的法线纹理
- Sharp:使用Sobel滤波(一种边缘检测使用的滤波器)生成法线纹理
WrapMode
决定纹理坐标超过[0, 1]范围后将会被如何平铺(Tiling)。
- Repeat:如果纹理坐标超过1(同理小于0)时,整数部分会被舍弃,如值为2.23采样值等于0.23。
- Clamp:如果纹理坐标超过1(同理小于0)时,会截取到1(或0)。
渐变纹理应该选择Clamp(下右图)。因为Repeat(下左图)可能产生如下错误,大于1的值如1.01会采样为0.01,为黑色。
FilterMode
决定纹理拉伸时采样哪种滤波模式。
Point,Bilinear,Trilinear对比如下,效果依次提升,性能消耗同样增大。
- Point:最近邻滤波,缩放是采样像素数目只有一个。
- Bilinear:使用线性滤波,找到四个近邻像素,然后进行线性插值混合得到,图像模糊了。
- Trilinear:几乎和Bilinear一样,只是如果开启多级渐远纹理技术,那就会在多级渐远纹理之间进行混合。
多级渐远纹理(mipmapping)
面板中Advanced->Generate Mip Maps默认开启。原理是提前用滤波处理得到更小的图形,每一层都是上一层图像降采样得到,以此类推,形成一个图像金字塔。在物体远离摄像机时,直接使用较小的纹理。缺点是通常会多占用33%的内存空间。
Unity Shader学习笔记系列教程: