1 前言 3D,顾名思义是三维的绘图,相对于2D绘图来比较的话,3D绘图提供作画者在三维空间中表现的自由度。但是我们的屏幕是一个2D的平面,因此所有的3D绘图都脱离不了一个核心-「投影」(Projection)。
在真实世界中,有各式各样的物体,当我们透过一个窗框看出去,事实上就是看到了世界在窗框上的投影(在这里我们先不考虑立体视觉,请想象你只有一只眼睛)。3D绘图就是类似的感觉,作画者在三维的空间(称作场景,Scene)中绘出许多对象,经过3D绘图技术的演算,成为我们在屏幕上所看到的画面。
要做一个投影,需要知道一些信息,首先是摄影机(camera,或eye point)的位置,摄影机朝向的方向,摄影机的视角(包含上下与左右的开展角度),摄影机的「上向量」(upvector),近平面(near),远平面(far)。有了这些信息,我们定义出了一个「投影」,来说明如何将一个3D Scene投影到一个矩形的平面上。所有的3D绘图技术,讲得简单些,都是在做这个投影而已。
如何表现一个场景? 现在我们知道,场景是一个三维的空间,而我们的计算器是个处理数字数据的机器,那么,如何将一个三维空间中的绘图数据用数字的数据记录下来呢?其中的一个方法是使用顶点(Vertex)组成网眼(Mesh)架构,来记录三维的数据。注意我说是「其中一个」方法,意思就是你也可以选择用各种参数方程式来表达一个曲面,从而表现整个场景,但是今日的技术主流是使用Vertex。
一个Vertex可以带有许多数据,称作属性(Attribute),比如说该点在空间坐标系中的坐标(Coordinate)、法向量(Normal)、该点的颜色(Color)、纹理坐标(Texture coord.)Vertex同时也可以作为贝兹曲面(Bezier surface)或NURBS曲面的control point。因此我们用Vertex来表达一个三维的空间。当我使用越多的Vertex,意味着带有越多的信息,就可以把图形表现得越细致,当然,这不是必然的,却有很大程度的正相关性。
有了顶点,我们必需知道这些顶点如何组成一个3D场景中的对象,也就是说,哪些顶点组成了一个面、哪些面又组成了一个物体。由顶点(Vertex)组成的结构称为Mesh,想象许多的顶点由线连结起来,形成一个类似鱼网状的图形,这是为什么它称为Mesh的理由。这些线条说明了Vertex如何连结成为Mesh,我们称作Primitive,注意Primitive并不是线条而是一个抽像的连结概念,在这里我只是为了解释方便而形容它像是线条。最简单的Primitive有三种,点、线、三角形。而这就是全部了,因为所有的多边形都可以拆成三角形,关于这方面我会在之后讨论硬件时再详细的说明。
于是Vertex与Primitive组成了一个3D scene,而3D绘图技术的主要工作,便是如何将这些Vertex与Primitive的数据,转换成屏幕上一个一个点的颜色。这些颜色由红蓝绿(RGB)组成,根据其颜色深度(color depth),每个点可能从8bit到32bit之类有不同的资料大小。但总而言之是个数字(Digital)数据,从一组数字数据(Vertex与Primitive)运算出另一组数字数据(例如 1024*768,32bit depth color),正是计算器领域的主题。
|