一文看懂材质/纹理 Material, Texture, Shading, Shader 的区别

在计算机图形学和三维设计中,有几个容易混淆的概念。今天我们来一举拿下。

概念整理

英文 中文 本质 释义
Material 材质 数据集 表现物体对光的交互,供渲染器读取的数据集,包括贴图纹理、光照算法等
Texture mapping 纹理贴图) 图像映射规则 把存储在内存里的位图,通过 UV 坐标映射到渲染物体的表面
Shading 底纹、阴影 光影效果 根据表面法线、光照、视角等计算得出的光照结果
Shader 着色器) 程序 编写显卡渲染画面的算法来即时演算生成贴图的程序
GLSL 程序语言 OpenGL 着色语言

可以这么总结:

Material 是表现 Shading 的数据集。其他几个概念都是生成这一数据集的资源或者工具。

这么多概念,无非是为了完成一个共同目标:用计算机表现真实可信的 Shading

Shading 是真实世界中的光影效果,它是由物体表面材质、灯光、观察者的视角等多种因素共同决定的。要实现计算机的模拟生成,是一个非常复杂的过程。不过它的原理大概可以简化为一个函数:

Intensity = Material (Light, Eye)

也就是说,光影的强度,是由 a.照在材质上的光 b.视线 共同决定的。

如何制造 Shading 效果?

万物看起来不尽相同,它们有各自的材质和纹理。

纹理(Texture)是什么?

Texture is pattern or image applied to a surface to change its color, shininess or just about any other part of its appearance. —— Texture introduction - Udacity

纹理就是一段有规律、可重复的图像。利用纹理,我们可以非常取巧地让三维物体看起来更真实。

方法一:贴上皮肤

贴图可以说是最简单的材质方法:

  • 选定物体表面的某些区域
  • 更改这个区域的一些属性(如颜色、反光度、透明度等)

那么 UV Mapping 又是什么?跟 Texture Mapping 有什么区别呢?

可以这么理解,Texture Mapping 是目标,把材质用一种规则映射到物体表面。而 UV Mapping 就是映射的规则。在这个规则中,给三维体每一个顶点增加两个值 U 和 V,它们记录了三维表面和二维表面的坐标对应关系:

via Texture UVs

有了映射关系,我们就可以分门别类地把影响光照的不同参数,都通过图片映射到三维几何体上。这些参数包括:

  • Diffuse Map 漫反射:模拟一个发光物对物体的方向性影响(Directional Impact)。它是光照模型中最显著的组成部分

  • Specular/Reflection Map 镜面:模拟有光泽物体上面出现的亮点,它的颜色更接近光而不是物体的颜色

  • Normal/Bump Map 法线:决定物体形状的垂直于它的法线向量,提供有关物体表面深度的细节。每一种颜色代表了不同的轴向,看起来类似这样:

  • Displacement Map 位移:使用高度图将经过纹理化的表面的实际几何点位置,沿着表面法线根据保存在纹理中的数值进行移位。相比法线,位移贴图更多用于大规模的地形材质,包括悬崖、岩石等

  • Ambient Map 环境

  • Gloss/Roughness Map 光泽

方法二:长出皮肤

贴上皮肤的方法虽好,但是局限也很明显。如果没有合适的图像,或者要创建真实世界中罕见的材质,皮肤就不好找了。这个时候需要让程序帮忙「生长」出新的皮肤。

我们把这种程序叫做 Shaders。

如果你还记得,Shading 是始终如一的终极目标,那么应该就能明白为什么实现这个目标的程序叫做 Shaders 了。

它实际上是一个程序片段、一系列的指令,可以将三维 Mesh(网格)以指定方式与颜色、贴图等组合,完成复杂的计算输出(渲染器可读取的点和颜色的对应关系),会对屏幕上的每个像素同时下达命令。也就是说,代码必须根据像素在屏幕上的不同位置执行不同的操作。就像活字印刷,你的程序就像一个 function(函数),输入位置信息,输出颜色信息,当它编译完之后会以相当快的速度运行。

为什么 Shaders 运行特别快?因为它们常常运行在专门为并行处理(parallel processing)而设计的 GPU 上面。

最后一个问题,用什么来写 shaders 程序呢?答案是 OpenGL 着色器语言 (GLSL) 。GLSL 是用类 C 语言写成的,它为图形计算量身定制,包含一些针对向量和矩阵操作的有用特性。


好了,今天涉及到的概念实在太多了。希望对大家进入三维世界玩耍有所帮助。

Ref

kidult00 wechat
扫码关注 00 的公众号
如果文章帮您节省时间或者解答疑问,不妨打个赏 :)