1:计算机3D介绍:
1.1 图像数字化:
最早,我们的图像用过色盘来表示图像的颜色,既256种不同的颜色来表示,画面内存只需要1Byte的索引数值,但是色彩很单调,现在在已经淘汰了。现在我们通过RGB各8bit来表示颜色,既,3元色,可以混合出我们的所有颜色。在1024X768的分辩率下,其占存储量:1024X768X3Bytes = 2.25MB,而在硬件上都是4的倍数的地址才能运行,所以实际占用了1024X768X4Bytes = 3MB,那我们不就浪费了空间了吗,其实么有,我们在RGB上又加上了一个Alpha(透明色)来表示颜色的透明度。
1.2 3D画面的产生:
其实3D和我们的照相一样,把3D的世界拍成2D的照片。在3D中,所有的物体都是基本多边形组合成,3角形最常用。我们把世界上的物体的表面通过多边形拼凑起来,再通过在面上贴图,来模拟现实的物体。这时,我们会发现其实我们的3D物体都是空心的,对。但在游戏中,我们会通过碰撞检测来防止玩家进入到物体内部去。
在现实中,前面的物体会挡住后面的物体,让我们只能看到前面的物体,但是在3D程序中,没有什么时丽说当然的,现在的显卡,我们都是通过一个z_buffer的来保存当前像素离我们Camera的距离,当我们的一个多边形点转换成像素点时,显卡会计算当前点到Camera的距离,然后和前面已保存的像素点的Z_buffer进行比较,如果更近,那么更新像素的色彩,并更新Z-buffer,如果更远,那么不更新当前像素点。可以看到这样离我们远的物体就被近的物体挡住了,不会显示出来。但是问题也跟着出来,想想,如果是透明的物体,那么这样会出现什么样的问题。那么透明的物体我们又该怎么处理呢?(这里,我们就不能使用Z-buffer了,只有把透明的物体排序,先画远的,再画近的)。我们通常用16bits/24bits来保存z-buffer,但是硬件4Bytes的规则,我们还是用了32bits来保存了,是不是又浪费了呢,其实没有,在24bits的z-buffer下,我们又加上了8bits的stencil-buffer,来占用空间,后面会介绍s-buffer.
1.3 动画:
最常见的动画是帧动画,当帧率超过30fps的时候人的眼睛就看不出来一页页的变化了,而是感觉成一个连贯的动画了。在我们d3d中,我们是通过double buffer来实现交换页的操作的,一块用来存储已经画的buffer,一块用来存储正在画的buffer,而屏幕上显示的永远是画好的buffer,这样不会让玩家看到画画的过程。其实在我们d3d中,调用device->present的时候,就是在交换2个buffer,让将刚画好的现实出来,而另一又用来准备新的画面。在win下,是通过copy buffer来实现的,在full下是通过swap buffer来实现的,这样省略的拷贝动作。
1.4 GPU:
图形处理芯片:我们游戏爱好者的上帝J,其强力的浮点运算能力和并行处理能力让我们的3D世界变得更加强大。我们常说的GPU编程是,vertex shader/pix shader/Geometry shader.使我们的多边形的操作和色彩的设置都放到的GPU中,例如矩阵,4vector等运算放到了Gpu中,通过并行能力,远远超过了cpu的运算能力,现在吵的火热的Cuda就是一个很好的例子。以后的发展,Gpu将不只是图形的处理专用,而是平行算法的核心应用领域。
好了,今天就这些了,希望能坚持下去,虽然很多是书上的,但是还是加了些自己的理解:)