|
3D绘图就是在二维的计算机屏幕上创建三维幻觉。我们为了做到这一点,使用了数学变换进行建模和处理图像。 本文将使你熟悉3D算法和概念,作为使用Direct3D创建和处理3D世界和对象的准备。理解3D算法是怎么实现的将有助于你领悟使用Direct3D API的词汇和概念。
3D绘图比2D绘图要复杂的多,这是因为程序需要理解的比显示在屏幕上的要多的多。创建三维图形通常使用商业3维建模软件,比如3DS/MAX等等。
我们可以使用3D绘图算法实时处理各种类似这样的模型,使你的世界中的模型更具有真实感。这种具有真实感的模型由对象、摄像机和光源组成。
3D世界中包含的3D对象有各种属性。我们通过处理这些属性来改变对象。
• 一个对象的形状由表面定义。表面可以被定义成平面的或二次曲面。如果你已经看过一些轮廓模型,你就知道了用于实体对象的基本表面。
• 每个对象都有纹理,定义了表面的粗糙/光滑度。
• 每个对象都有漫反射和镜面反射。反射属性决定了射到对象上的光线反射的程度。漫反射代表对象明亮程度。一个新的干净的球要比又旧又脏求具有更高的漫反射。镜面反射代表了对象看起来的辉亮度。水晶瓶比木块有更高的镜面反射。
• 对象有位置,在3D空间中由三个值定义:x,y,z坐标。
• 对象有方位,即三维空间的某个方向。对方位进行处理的效果是对象旋转。
• 我们可以小的、基本的物体组成大物体,这个处理被称为组合。组合简化了复杂的大物体的移动。比如说一个自行车,它由两个旋转的车轮。当车轮旋转的时候,整个车向前移动。车轮旋转和移动的相对静态坐标系统(即自行车的框架)。组合能使我们向前移动坐标系统,同时保持把车轮约束在上面;我们无需明确的向前移动车轮。组合对一些复杂的移动物体,比如说轿车、飞机、动物等等是非常有用的。
摄像机 为了能看见对象,定义了摄像机代表用户对3D世界的关联。摄像机有一个位置和一个方向,它们定义了观察者在3D世界的何处和看到的是什么。在3D世界里移动摄像机和改变它的方向使我们看到其它的对象。 光源 虽然我们有了对象和摄像机,但是我们还是什么都看不见,除非把一些光线打到对象上。我们可以创建不同风格的光线,通过改变光线照亮的程度来改变对象在场景中的外观。不同光线类型和效果在执行上的开销不同。
• 环境光对场景中所有的对象都提供了固定不变的照明。所有其它的光线在光的强度和/或方向上都与之不同。
• 点光源是从一个点发出的光。反射的角度取决于光点和对象位置之间的角度。
• 平行光同点光源类似,但它是从一个平面发射出来的光。反射角不变。这是的平行光无需太多的计算,但损失了一些真实感。
• 聚光源,正如它的的名字一样,随着接近对象,光线强度产生变化。
• 方向光最经常用于模拟太阳光和其它无穷远的光源。这种光源被看作来自无穷远,一次它的强度不随着接近对象而变化。在唯一的方向上,亮度是固定的。
• 我们可以确定亮度或强度,来影响对象被照亮的程度。聚光源和其它的光源有一个确定光线从哪里发出的方向。
• 某些光源的强度受距离的影响。但对环境光来说不是这样的,它没有位置,不是有方向的光远。通常与场景有无限远的距离。
• 我们可以创建不同的有色光。这比白色光要复杂的多,因为它改变了所照到的每一个对象的颜色。
裁减 3D绘图有两种重要的裁减概念:视区(View Volumes)和可视表面(Visible Surface)。视区用于减少被渲染的对象的数量。越靠近摄像机,对象就越大,细节也越多。当远离摄像机的时候,对象就变小了,细节也少。当对象非常远的时候,它可以从视野中消失,而没有丢失可被察觉的真实感。实际上,对象总是在一个适当的距离上被不被察觉地模拟得更简单。
在摄像机后面的对象能够很好的被裁剪;在2D应用程序中,超过屏幕四个边的对象被裁剪。
在裁剪中使用两种投影。一种是平行(正交)投影,另一种是透视投影。透视投影使用没影点。正如它的名字所示,距离观察者远的对象就变小了。想象一下,我们要画一条铁路。在透视投影中,两条铁轨在远方汇聚成一个点。在平行(正交)投影中,没有使用没影点。透视投影想象观察者在对象的无穷远处,透视投影产生更真实的图像;平行(正交)投影在图像上提供了更精确的度量。
可视表面检测是通过避免计算渲染不可见对象而加速渲染算法的一种方法。它需要计算出哪一个对象的表面在视区中没有被裁剪以及哪些面远离摄像机。
应用考虑 实时地渲染3D场景需要处理大量的计算。我们要找到一些好的方法来减少计算量,而又不至于过于妥协场景的真实性。
首先,我们简化背景。依赖于地平线的距离,我们可以使用2D图像作为背景。
下一步,我们要考虑明暗处理。明暗处理算法使用颜色显示照亮的对象周围的明暗。如果对对象进行明暗处理,就要限制场景中颜色的数量。Direct3D有如下的缺省:
· 单色32种色调 · 纹理中的16种色调 · 纹理映射中,8种不同的颜色
如果你使用256色,你需要构造一个调色板,为色调分配一些表项。另外,在明暗处理应用之前,你必须限制外形中颜色的数量。
我们还要讨论一下位深:场景中使用的内存越多,需要被移除的内存也越多。这种影响不是线性的。位深越大,明暗处理的算法就越复杂。
表面的建模也影响性能。大多数表面使用三角形或其它低阶多边形来构造小区域。你也可以使用二次曲面,比如说圆柱体、角锥和球体。你塑造的几何体越复杂,执行渲染时需要的计算就越多。
小结 随着我们对3D图形编程的概述,我们可以考虑使用Direct3D开始制作应用程序了。Direct3D使我们无须直接地写驱动器就能够访问许多显卡的3D硬件加速。在本文中提到的3D算法可以再显卡中执行和极大地加速应用程序性能。
| | |
|