使用立即模式可以选择通过调用drawprimitive方式或利用执行缓冲区。对于初学者一般从调用drawprimitive方式。不过,千万不要认为两者有优劣之分。在熟悉了direct3d后,使用哪个方法取决于您应用程序的要求。前者的方法与其它com雷同;在利用执行缓冲区的方法时,要创建directdraw和direct3d对象,设置渲染状态,填充执行缓冲区等。
无论哪种模式,应用程序与硬件的通讯都很类似。正如下图所示。由于direct3d相当于directdraw对象的一个接口,这里的hal被表示为directdraw/direct3d hal。
对保留模式的操作是通过使用一些对象来实现的。direct3d和directdraw是紧密联系在一起的。一个directdraw对象将directdraw和direct3d状态封装起来,通过idirectdraw::queryinterface方式将idirect3d接口转换为directdraw对象。
有一个很重要的概念是z缓冲区。它决定了将很多显示内容如何覆盖和裁剪。如果没有z缓冲区,保留模式无法给覆盖层排序。没有指定z顺序的覆盖层被缺省设定为0,处于最底层。一共可以有四十亿个覆盖层(应该够用了吧!),z顺序为2的层将可能遮掩了z顺序为1的层的某些内容。记住,不能有两个层的z顺序相同。
关于3d场景,还有诸如材资、光源等概念,在此不再一一聱述。
第九节 vc++中引入direct sdk
一旦安装了sdk,就得马上通知visual c++ sdk的位置。默认状态下,sdk安装在dxsdk目录下。头文件放在dxsdk/inc目录下,库文件放在dxsdk/lib目录下。
可利用下述两种方法之一通知visual c++ sdk的位置。一种方法是在使用文件时给出完整的文件路径;另一种法是将这些目录加到visual c++的搜索路径中。第二种方法更好一些,可以通过tools[options]directories对话框实现。
增加dxsdk/lib目录的方法大体上同增加dxsdk/inc目录的方法相同。
如果你获得了一个含有比visual c++的directx sdk新的版本,您需要将directx sdk目录置于常规的visual c++目录上面。否则就得使用旧版本。(visual c++从上至下查找目录)
根据我们已经讨论过的内容,你应该能够编辑directx程序了。然而还有最后一个潜在的障碍。除非initguid符号已经被定义,否则在directx guids下调用query-interface()函数的程序同directx2 sdk的链接会失败。initguid符号只能由一个源文件定义,并且必须出现在#include语句之前,如下列代码所示:
#define initguid
#include〈ddraw.h〉
//…other includes…
对于directx3及以上版本,这种解决方法都是有效的,但还有一个更好的方法,即将dxguid.lib文件链接到你的工程上(build[settings]link对话框),以替代initguid符号的定义。