在计算机图形学和三维设计中,有几个容易混淆的概念。今天我们来一举拿下。
概念整理
英文 | 中文 | 本质 | 释义 |
---|---|---|---|
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 语言写成的,它为图形计算量身定制,包含一些针对向量和矩阵操作的有用特性。
好了,今天涉及到的概念实在太多了。希望对大家进入三维世界玩耍有所帮助。