您的位置:首页 > 其它

Direct-X学习笔记--Direct-X的基本知识

2015-01-31 13:54 363 查看

一.Direct-X简介

说是Direct-X,其实最主要的还是Direct3D,绘制3D世界的利器。拥有通过HAL(硬件抽象层)直接访问硬件的能力,比GDI/GDI+的效率高得不是一点半点。



开始的时候是想学个游戏引擎的,比如特别火的unity3D,后来一想,还是懂一点底层的东西比较好。于是就选择了D3D。引擎的话应该就是写好的一种框架罢了,还是要基于D3D或者OpenGL等图形API的。

二.COM(组件对象模型)

COM(Component Object Model,组件对象模型),通常称为COM对象接口。我们可以将其视为一个类来使用,获取某一COM接口指针。但是不能用new和delete关键字来处理COM接口,通过COM接口自己的Release方式释放。
COM接口通常是I开头,如:IDirect3DDevice9

三.像素格式

当我们创建一个表面或纹理时候,经常需要指定这些Direct3D资源的像素格式。它是由D3DFORMAT枚举类型的一个成员来定义的。这里例举常用的一部分:

(1) D3DFMT_R8G8B8——表示一个24位像素,从左开始,8位分配给红色,8位分配给绿色,8位分配给蓝色。

(2)D3DFMT_X8R8G8B8——表示一个32位像素,从左开始,8位不用,8位分配给红色,8位分配给绿色,8位分配给蓝色。

(3) D3DFMT_A8R8G8B8——表示一个32位像素,从左开始,8位为ALPHA通道,8位分配给红色,8位分配给绿色,8位分配给蓝色。

四.交换链

Direct3D通常创建2~3个表面组成一个集合,即为交换链。在Front Buffer中的表面将用来在屏幕上显示。显示器不能及时显示Front Buffer中表示的图像。通常情况下,它是每六十分之一秒刷新显示一次,即刷新率为60赫兹。应用程序的帧率经常与监视器的刷新率不同步(比如应用程序的渲染帧速度可能比显示器的刷新速度快)。然而,我们并不希望在显示器已经显示完成当前帧之前就更新有下一帧动画的Front Buffer内容,但是我们又不想让程序停止渲染而去等待显示器显示。因此,我们渲染另一个屏幕表面Back
Buffer。当监视器将Front Buffer显示出来后,Front Buffer就被放到交换链的末端,即变成Back Buffer,而BackBuffer就会变成交换链中的Front Buffer。这个过程就叫做presenting。

简单的来说,就是D3D为我们搞了一个后台,我们只要将要表演的演员放到后台就好,而不是直接在前台“现场排练”。好处有两个:第一个可以控制帧率,第二个就不用像GDI/GID+编程那样,为了实现流畅的画面,搞个缓存DC,D3D已经为我们做好了这一步。

五.深度缓存

深度缓冲也是一个表面,但它不是用来存储图像数据而是用来记录像素的深度信息。它将确定哪一个像素最后被绘制出来。深度缓冲为每一个像素计算深度值并进行深度测试。通过深度测试我们可以比较得出哪个像素离摄相机更近并将它画出来。这样就可以只绘制最靠近摄相机的像素,被遮住的像素就不会被画出来。
这里要注意:(1)深度缓存是像素级别的,每个像素点都有一个深度缓存。
(2)虽然D3D是3D效果,但是实际显示的时候,还是要靠2D的屏幕来显示,所以,前面的物体会遮住后面的物体,就只显示前面的物体。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: