关系1:
Material 引用 shader ,shader 引用 Texture.
材质引用着色器,着色器引用纹理.
关系 2:
纹理包含 2D 图片,包含法线贴图
2D 图片只有像素点, RGB 值只表示像素.没有空间感
法线贴图中的 RGB 点表示方向矢量的 X、Y 和 Z 值,有空间感,通常具有蓝色色调,并且不包含任何实际的浅色或深色着色
纹理具有凹凸感,像素值,这些东西都可以存储在一张图片上面.
2D图像的导入以及设置
- Unity支持的图像文件格式包括TIFF、PSD、TGA、JPG、PNG、GIF、BMP、IFF、 PICT等。
- Unity支持含多个图层的PSD格式的图片。PSD格式图片中的图层在导入Unity之后将会自动合并显示,但该操作并不会破坏PSD;原文件的结构。
- 图片纹理的尺寸是2的n次幕,例如32、64、128、256、102硅争,以此类推(最小像素大千等千32,最大像素小于等于8192) , 图片的长、宽则不需要—致。例如512X 1 024、256X 64等都是合理的.
- 出于性能上的考虑, 模型的贴图要尽量使用Mip Maps。 该方式虽然会多消耗33%的内存, 但在渲染性能和效果上有很大的优势。 可 以使距相机较远的游戏对象使用较小的纹理。
最后在非地面和地板模型对象上,尽量不要使用Anisotropic filtering。 - 在图片的Inspector检视面板中,设置Format格式。 该项用来设置图片的压缩格式, 有3种格式可供选择(如果 Texture Type设置为Advanced, 则会有34种格式.其中 3 种为:► Compressed : 压缩纹理, 该项为默认选项, 是最常用的纹理格式。 压缩的格式会根据发布的平台自动选择。► 16 bit: RGB彩色 , 16位彩色图最多可以有216种颜色。 (佃贡量的真彩色)16 bit格式为非压缩格式, 会占用较大磁盘空间。► Truecolor: 真彩色, 是晟离质量的真彩色 , 也就是32位色彩(256 X 256的纹理大小为256 KB)。 Truecolor格式为非压缩格式, 会占用较大磁盘空间。
- Non Power of 2: 图片尺寸非2的n次幕。该项在导入并选择了非2的次幕尺寸图像的清况下才可用。该项的主要作用是将图像尺寸缩放到2的次露,有4种方式可供选择。► None: 无。对图像尺寸不进行处理。► ToNearest: 到最接近的(尺寸)。将图像尺寸缩放到最接近2的次幕大小。例如513X 1 023像素的图像将被缩放成512X 1 024像素。► Tolarger : 到较大的(尺寸)。将图像尺寸放大到较大的最接近2的次幕大小。例如257X 513像素的图像将被放大成512X 1 024像素。► ToSmaller: 到较小的(尺寸)。将图像尺寸缩小到较小的最接近2的次幕 大小。例如254X 511像素的图像将被缩小成256X 256像素。
- Convolution Type: 反色贴图旋转类型。► None: 无反色类型。► Specular: 镜面反射。► Diffuse (lrradiance) : 漫反射。
- Fixup Edge Seams: 固定边缘接缝处。当反射贴图有接缝时可尝试选中该选项进行控制。
Read/Write Enabled: 读/写启用。选中该项将允许从脚本(GetPixels、SetPixels—
和其他Texture2D函数)访问纹理数据。同时会产生个纹理副本,会消耗双倍的内存,建议谨滇使用。 - • Import Type: 导入类型。该项用来指定导入图像的类型,可理解为用千指定 图像在导入前计划的应用类型。例如图像在三维软件烘焙出来的法线贴图、光照贴图等,在导入之前就知道这类图片的用途,导入后需要根据图像的用途指定相应的类型。有3种类型可供选择。
► Default: 初始默认的。指定此类型就代表将图像作为普通纹理被导入、使用。选择该项时,有如下5个子项。
Alpha from Grayscale: 依据灰度产生Alpha诵道。选中该项,将依据图像 —
自身的灰度值产生个Alpha透明度通道。
Alpha is Transparency: 依据Alpha通道产生透明度。
Bypass sRGB Sampling: 通过sRGB采样。使用精确颜色值而非补偿值来对其进行校正,当纹理被用作GUI或被编译成非图像信息时才选中该项,且此选项只在纹理导入类型为Default时可用。
Encode as RGBM: 编码方式为RGBM,下拉菜单里可凶钳圣自动、开、关、编码。 —
Sprite Mode: Sprite模型。有None(无)、Single(单的)、Multiple(多重的)可选。
► Normal Map: 法线贴图。指定此类型就代表将图像作为法线贴图导入、使用。► Lightmap: 光照贴图。 指定此类型就代表将图像作为光照贴图导入、 使用. - Generate Mip Maps: 生成MipMaps。选中该项将生成仙pmap。例如当纹理 在屏幕上非聿小时,Mipmaps会自动调用该纹理较小的分级。包括如下几个 选项。
► In Linear Space: 选择该项代表依据线性颜色空间产生Mipmaps。
► Border Mip Maps: 选择该项代表避免色彩渗出边缘。一般应用于灯光游戏对象的 cookie.► Mip Map Filtering: Mip Map过滤方式, 有两种方式可供选择。
Box: 采取最基本的方法处理Mipmaps级别, 随着纹理尺寸的减小,将仙p级别做平滑处理。
Kaiser: 此种是随着纹理的减小对Mipmaps进行锐化的篇法。 该方法可以改善纹理在摄像机与纹理的距离过远时出现的纹理模糊问题。
► Fadeout Mip Maps: 淡出Mip映射贴图。 选中该项将使Mipmaps随着Mip的级别而褪色为灰色, 该方式适用于DetailMaps (细节贴图)。 滑块在最左—侧代表开始淡出的第 个Mip级别, 最右侧代表Mip级别完全变灰。
图片资源类型的设置
- Texture Type: 纹理类型。 此处可选择Defalut(纹理)、Normal map (法线贴图)、Editor GUI and Legacy GUI (图形用户界面)、Sprite(2D and UI)、Cursor(光标文件)、Single Channel(单通道)、Cookie(作用于光原的Cookie)、Lightmap (光照贴图)等8种类型。
- Alpha Is Transparency: 依据透明度产生Alpha通道。 选中该项,将依据图像自身的透明度值产生一个Alpha透明度诵道。
- Alpha Source from Gray Scale: 依据灰度产生Alpha诵道。 选中该项,将依据图像自身
的灰度值产生一个Alpha透明度诵道。 - Wrap Mode:循环模式。控制纹理平铺时的样式,有两种方式可供选择。► Repeat: 重复。该项为默认选项,选择该项后纹理将以雷复平铺的方式映射在游戏对象上。► Clamp: 夹钳/截断。 选择该项后将以拉伸纹理的边缘的方式映射在游戏对象上。
- Filter Mode: 过滤模式。控制纹理通过三维变换拉伸时的计算(过滤)方式,有3种方式可供选择。
1)Point: 点模式。是 一种较简单材质图像插值的处理方式, 会使用包含像素最多部分的图素来贴图.简单说就是图素占到最多的像素就用此图素来贴图,这种处理方式比较快,材质的品质较差,有可能出现马赛克现象.2)Bilinear:双线性.这是一种较好的材质图像插值的处理方式,会先找出最接近像素的四个图素,然后在他们之间做插值计算,最后产生的结果才会被贴到像素位置上,这样不会看到"马赛克"现象.这种处理方式教适用于有一定景深的静态影像,不过无法提供最佳品质,也不适用于移动的游戏对象.3)Trilinear: 三线性。这是—种更复杂材质图像插值处理方式,会用到相当多的材质贴图,而每张的大小恰好会是另—张的四分之—。例如有—张材质影像是512X 512个像素,第二张就会是256X 256个像素,以此类推。凭借这些多重解析度的材质影像,当遇到景深较大的场景时,可以提供最高的贴图品质,会去除材质的“闪烁"效果。对于需要动态物体或景深很大的场景应用方面而言,选用此种方式会获得最佳的效果。 - Aniso Level: 各向异性级别。当以一个过小的角度观察纹理时,此数值越高观察到的纹理质量就越高,该参数对于提高地面等纹理的显示效果非常明显。
法线贴图
- Texture Type选择Normal map: 法线贴图类型。选择此类型,可将图像颜色通道变成—个适合于法线映射的格式.
- Create from Grayscale: 依据灰度产生Alpha诵道。选中该项,依据图像自身的灰度值计算法线贴图的凹凸值,选中。
- Bumpiness: 凹凸强度调节,该项用来控制贴图凹凸的量。
- Filtering : 过滤。控制法线贴图的凹凸的计笢方式,有两种方式可供选择:► Sharp: 锐化,这种方式产生的法线贴图更加清晰、锐利。► Smooth: 平滑,这种方式产生的法线贴图比较平滑。
图形用户界面类型
- Editor GUI and Legacy GUI: 图形用户界面类型。选择此类型,纹理适用 于HUD/GUI所用的纹理格式,参数如玺8-29所示。需要注意的是,如果纹理的大小非2的N次幕,且纹理的类型被设置为GUI,Unity会将该纹理强制转换为Truecolor(真彩)格式。
Sprite (2D and UI)
- Sprite Mode: Sprite模式,有两种模式可选择,► Single: 单独的。► Multiple: 多个的。
- Packing Tag: 标签。 在输入框中可以输入标签名称。打图集时使用.
- Pixels To Units: 像素单位。 输入生成的网格尺寸。
- Pivot: 对齐方式。► Center: 中心对齐。► Top Left: 左上对齐。► Top: 上对齐。► Top Right: 右上对齐。► Left: 左对齐。► Right: 右对齐。► Bottom Left: 左下对齐。► Bottom: 下对齐。► Bottom Right: 右下对齐。► Custom: 自定义。
- Generate Mip Maps: 生成仙mip贴图。选中该选项,可以打开Mip贴图。其他参数参考Texture类型
Cursor
- Cursor: 光标文件。选择此类型,纹理适用于光标所用的纹理格式.
Cubemap
- Cubemap: 立方体贴图。选择此类型,此类型纹理适用千反射所用的纹理格式
- Mapping: 映射。 该项决定映射到立方体贴图上的反射贴图方式。 有4种方 式可供选择。► Auto: 自动。是默认设置。► 6 Frames Layout (Cubic Environment) : 6框架布局。 可以理解为将图片包含的6个图像分别映射到—个立方体的6个面上。► Latitude-Longitude Layout (Cylindrical) : 圆柱方式。 纹理以圆柱的方式 映射到反射贴图上。► Mirrored Ball (Spheremap) : 球形包裹方式。 图像以包裹球形的方式映 射到反射贴图上。
- Glossy Reflection: 光泽反射。
- Fixup Edge Seams: 固定边缘接缝处。 当反射贴图有接缝时可尝试选中该项进行控制。
Cookie
- Cookie: 作用千光凉的Cookie, 选择此类型, 纹理适用于灯光游戏对象的Cookie, 参数如图8-33所示。
- Light Type: 光源类型。 该项用来指定该纹理计划作用千光源的类型, 有3种 光涌可供选择。►Spotlight: 聚光灯。 如选择此类型光源, 建议纹理的边缘保证为纯虽色, 这样会获得正确的结果。► Directional: 平行光源。如选择此类型光;原,实现整个场景的照明。► Point: 点光源。 如选择此类型光源, 会多出Mapping 、Fixup edge seams两项, Mapping参考Cubemap类型的相关讲解。 选中Fixup edge seams项 可对固定边缘处接缝进行控制。
- Alpha from Grayscal: 选中该项,可通过灰度计笢通道。 其他参数参考Texture类型。
图片渲染过程(iOS)
转载声明
作者:vony
相关名词
GPU(Graphic Processor Unit)
图形处理单元
GLSL(OpenGL Shading Language)着色语言
是用来在OpenGL中着色编程的语言,也即开发人员写的短小的自定义程序,他们是在显卡的 GPU 上执行的,代替了固定的渲染管线的一部分,使渲染管线中不同层次具有可编程性。比如:视图转换、投影转换等。GLSL 的着色器代码分成2个部分:Vertex Shader(顶点着色器)和Fragment(片元着色器)
顶点着色器(VertexShader)
一般用来处理图形每个顶点变换(旋转/平移/投影等)
顶点着色器是OpenGL中用于 计算顶点属性 的 程序 。顶点着色器是逐顶点运算的程序,也就是说 每个顶点数据都会执行一次顶点着色器,当然这是 并行 的,并且顶点着色器运算过程中无法访问其他顶点的数据。
一般来说典型的需要计算的顶点属性主要包括顶点坐标变换、逐顶点光照运算等等。顶点坐标由自身坐标系转换到归一化坐标系的运算,就是在这里发生的。
片元着色器程序(FragmentShader)
一般用来处理图形中每个像素点颜色计算和填充
片段着色器是OpenGL中用于计算片段(像素)颜色的程序。片段着色器是逐像素运算的程序,也就是说 每个像素都会执行一次片段着色器 ,也是 并行 的。
顶点 & 顶点数据
顶点指的是我们在绘制一个图形时它的顶点位置数据。这个数据可以直接存储在数组中或者将其缓存到GPU内存中。
画图一般是先画好图像的骨架,然后再往骨架里面填充颜色。顶点数据就是图像的骨架,OpenGL中的图像都是由图元组成。在OpenGLES中,有3种类型的图元:点、线、三角形。
顶点数组(VertexArray) & 顶点缓冲区(VertexBuffer)
开发者可以选择设定函数指针,在调用绘制方法的时候,直接由内存传入顶点数据,也就是说这部分数据之前是存储在 内存 当中的,被称为 顶点数组 。而性能更高的做法是,提前分配一块 显存 ,将顶点数据预先传入到显存当中。这部分的显存,就被称为 顶点缓冲区 。
光栅化(Rasterization)
是把 顶点数据转换为片元的过程 ,将图转化为一个个栅格组成的图象。把物体的数学描述以及与物体相关的颜色信息转换为屏幕上用于对应位置的像素及用于填充像素的颜色。
光栅化包含了两部分的工作。第一:决定窗口坐标中的哪些整型栅格区域被基本图元占用;第二:分配一个颜色值和一个深度值到各个区域。
纹理
可以理解为图片。
图片加载的工作流程(iOS)
UIImage *image = [UIImage imageWithContentsOfFile:@"filePath"];
从磁盘中加载一张图片,这个时候的图片并没有解压缩;
imageView.image = image;
然后将生成的 UIImage 赋值给 UIImageView ,这一步确认显示图片,CPU 才开始解码;
接着一个隐式的 CATransaction 捕获到了 UIImageView 图层树的变化;
在主线程的下一个 runloop 到来时,Core Animation 提交了这个隐式的 transaction ,这个过程可能会对图片进行 copy 操作。
受图片是否字节对齐等因素的影响,这个 copy 操作可能会涉及以下部分或全部步骤:
- 分配内存缓冲区用于管理文件 IO 和解压缩操作。
- 将文件数据从磁盘读到内存中。
- 将压缩的图片数据解码成未压缩的 位图 形式。
- 最后 Core Animation 中 CALayer 使用未压缩的位图数据渲染 UIImageView 的图层。
- CPU 计算好图片的Frame,图片解压 后就会交给 GPU 来做图片渲染。
解压缩
- 解压默认是在 主线程(CPU) 中执行的。
- 图片的解压缩是一个非常耗时的 CPU 操作,所以只有在 确认要显示时,CPU 才会对其进行解压缩。
- 解压过的图片会缓存起来,不会重复解压。
- 在子线程提前对图片进行强制解压缩,而强制解压缩的原理就是对图片进行重新绘制,得到一张新的解压缩后的位图。其中,用到的最核心的函数是 CGBitmapContextCreate。
CPU / GPU渲染过程中具体分工
- CPU: 计算视图 frame,图片解码,需要绘制纹理图片通过数据总线交给 GPU
- GPU: 纹理混合,顶点变换与计算,像素点的填充计算,渲染到帧缓冲区。
- 时钟信号: 垂直同步信号V-Sync / 水平同步信号H-Sync。
- iOS设备双缓冲机制: 显示系统通常会引入两个帧缓冲区,是 CPU 与 GPU 协作完成的
渲染流程
- GPU 获取获取图片的坐标
- 将坐标交给 顶点着色器 (顶点计算)
- 将图片 光栅化 (获取图片对应屏幕上的像素点)
- 片元着色器 计算 (计算每个像素点的最终显示的颜色值)
- 从帧缓存区中渲染到屏幕上
总结
- 读取文件
- 计算Frame
- 图片解码
- 解码后纹理图片位图数据通过数据总线交给GPU ->
- GPU获取图片Frame ->
- 顶点变换计算 ->
- 光栅化 ->
- 根据纹理坐标获取每个像素点的颜色值
- 渲染到帧缓存区
- 渲染到屏幕