Direct3D程序设计基础

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

DWORD BehaivorFlags, //Direct3D设备进行3D的运算方式
D3DPRSENT_PARAMETERS* pPresentationParameters, //存储Direct3D设备相关信息的变量地址 IDirect3DDevice9* ppReturnedDeviceInterface //返回Direct3D设备接口指针的地址 );

有了HAL/插件式软件设备/参考设备这一系 列的方法,微软的Direct3D便可保证在缺少 3D硬件支持的环境中,仍可以使用同一套 API,也就是说,如果当前运行环境中无硬 件加速设备,即HAL不可用时,可考虑自己 编写插件式软件设备,再退一步,可以使 用参考设备,而无论使用哪种设备,操作 它们的API都是一样的。
Direct3D设备类型
1.
2.
3.
D3DDEVTYPE_HAL(Hardware Abstraction Layer 硬件提取层):代表一种高带的渲染过程,它尽量 通过显示硬件进行光栅化处理,坐标转换,照明 处理。 D3DDEVTYPE_REF(Reference Rasterizer Device 参考光栅设备):是当显示卡不支持某些硬件功能 时采取的一种替换策略,一般被用来测试显示卡 不支持的Direct3D功能。 D3DDEVTYPE_SW:是一种外挂的Direct3D设备, 用以支持第3方软件。
软件参考层


Direct3D支持另外一种设备,称为参考设备或称为参 考光栅器。只有安装了SDK才会提供参考设备,当一 个应用程序在一台未安装SDK的机器上请示参考设备 时,会一个NULL参考设备。NULL参考设备什么也不 做,所有渲染操作的结果都将呈现一个黑屏。 不同于HAL设备和插件式软件设备,参考光栅器支持 所有的Direct3D特性,由于参考设备注重精确实现 Direct3D的所有特性,而不注重运行速度,并且参考 设备不支持硬件加速,所以使用参考设备绘制图形的 速度很慢,不管硬件是否支持,参考光栅器总是通过 CPU指令来绘制图形。使用参考设备的目的是为了测 试演示Direct3D的特性,例如,如果你想学习 Direct3D的某个高级特性,当前硬件又不支持,这时 就可以使用参考设备来测试和学习当前硬件不支持的 高级Direct3D特性。
像素是指图像在屏幕上显示的最小单元, 即屏幕上的一个亮点。它亦指在frame buffer中的一个最小图形单元。
分辨率(Resolution)
分辨率是指显示设备所能显示 的最大像素个数。
颜色缓冲区(Frame Buffer)
颜色缓冲区是位系统内存或显示内存的一 块内存块,它对应于将要的一块二维显示 区域。图形绘制过程中,Direct3D完成坐标 变换、光照处理和纹理映射,将绘制结构 的值存储于颜色缓冲区中,最后通过图形 刷新,颜色缓冲区的内容被显示在屏幕上。
HAL设备


硬件抽象设备是主要的设备类型,它支持 硬件加速光栅化以及硬件和软件顶点处理。 如果运行Direct3D程序的计算机的显卡支持 Direct3D,那么Direct3D程序就会使用HAL 执行三维操作。Direct3D HAL设备通过硬件 来进行全部或部分坐标变换、光照和光栅 化处理模块。 在程序中不需要直接访问图形硬件,而是 通过HAL访问图形硬件,由HAL调用显卡驱 动程序的函数和方法。
设备行为标志列表
BehaviorFlag值
D3DCREATE_FPU_PRESERVE
D3DCREATE_HARDWARE_VERTEXPROCESSING


激活双精度浮点运算或浮点运算异常 检测,设置该项会降低系统性能。 由Direct3D硬件进行顶点运算 由Direct3D硬件和软件共同进行顶点 运算。 支持多线程绘制,设置该项会降低系 统性能。 禁用Direct3D的Get*()函数,禁止 Direct3D使用虚拟设备模拟顶点运算。 由Diredt3D软件进行顶点运算。
D3DDISPLAYMODE结构定义:
typedef struct _D3DDISPLAYMODE { UINT Width;//屏幕宽度像素数 UINT Height;//屏幕高度像素数 RefreshRate;//屏幕刷新率 D3DFORMAT format;//屏幕显示像素格式。 }D3DDISPLAYMODE;

前台缓冲区(front Buffer)和 后台缓冲区(Back Buffer)
大多数图形显示程序拥有2个颜色缓冲区, 我们将当前用于屏幕刷新的颜色缓冲区称为 前台缓冲区,而将用于图形䌊的其他颜色缓 冲区称为后台缓冲区。同时拥有前台缓冲区 和后台缓冲区的图形显示程序可以同时进行 图形绘制和屏幕刷新操作,系统运行性能优 于仅有单个颜色缓冲区图形显示程序。
5、6、5格式
5、5、5格式 5、5、5格式,带一位透明度
D3DFMT_A4R4G4B4
D3DFMT_R3G3B2 D3DFMT_A8 D3DFMT_A8P8 D3DFMT_P8 D3DFMT_L8
4、4、4格式,带4位透明度
透明度 8位索引值,即256色模式。 8位亮度值,即灰度模式。
查询显示卡的显示模式代码片段
IDirect3D::CreateDevice()函数原型
HRESULT IDirect3D9::CreateDevice ( UINT Adapter, D3DDEVTYPE Devicetype, HWND hFocusWindow, //显示卡序号 //Direct3D设备类型 //所属窗口句柄
*SDKVersion必须为D3D_SDK_VERSION。
创建D3D对象代码片段
LPDIRECT3D9* g_pD3D; …… g_pD3D=DirectCreate9(D3D_SDK_VERSION );
查询显示卡的显示模式
在创建Direct3D Device之前,要使 用GetAdapterDisplayMode()函数获得 计算机显示卡当前的显示模式信息。
视口(Viewport)
视口是一块二维的矩形区域,三维景物投影 为二维图形后,将绘制在这块矩形区域中。在 Direct3D中,视口定义了当前Direct3D绘制的目 标表面的矩形范围,绘制的图形坐标将被 转换 为相对于视口的坐标并绘制于视口中,一般以像 素为单位表示视口的长和宽。
像素(pixel)
创建Direct3D对象并得到Direct3D接口
1. 2.
声明一个LPDIRECT3D9类型的指针变量。 使用IDirect3D9* Direct3DCreate9()函数 创建对象,并获得IDirect3D9指针。
Direct3DCreate9()函数原型
IDIRECT3D9* Direct3DCreate9( UINT SDKVersion );
D3D的基本程序结构
1.创建一个Windows窗口
2.初始化Direct3D程序 3.处理消息循环
4.物体图形显示
5.结束Direct3D程序
D3D程序基本结构伪代码
#include<d3d9.h> Int WINAPI WinMain() { RegisterClass_Window_Class_and_create_a_window();//创建窗口 Initial_Direct3D_object();//初始化D3D While(Is_Running) { Handle_system_message(); if(message==painting) { render();//三维图形绘制 } } Release_Drirect3D_object();//释放D3D占用的资源 }
Direct3D程序设计基础
Win32应用程序
Win32应用程序
Direct3D API GDI HAL
设备驱动程序接口(DDI)
图形硬件
应用程序、Direct3D、GDI和HAL之间的关系
几个基本概念
硬件抽象层HAL
硬件抽象层是硬件制造商提供的特定于 硬件的接口,Direct3D利用该接口实现对显 示硬件的直接访问。就用程序永远不需要访 问HAL,Direct3D通过HAL提供的基础结构, 为程序员提供一套统一的接口和方法,用于 访问图形硬件。
#include <d3d9.h> LPDIRECT3D9 g_pD3D = NULL; LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; HRESULT InitD3D( HWND hWnd ) {if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) return E_FAIL; D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ) ) ) {return E_FAIL;} return S_OK;}
二、初始化Direct3D程序
在使用Direct3D绘制图形之前,必 须初始化Direct3D对象,包括创建并得 到一个Direct3D接口,并以此得到一个 Direct3D设备接口。
初始D3D的基本流程
1. 2.
3.
创建Direct3D对象并得到Direct3D接口 查询显示卡的显示模式 创建Direct3D设备对象并得到接口
D3DCREATE_MIXED_VERTEXPROCESSING
D3DCREATE_MULTITHREADED D3DCREATE_PUREDVICE
D3DCREATE_SOFTWARE_VERTEXPROCESSING
D3DPRESENT_PARAMETERS结构定义
typedef struct_D3DPRESENT_PARAMETERS_{ UINT BackBufferWidth; UINT BackBufferHeight; D3DFORMAT BackBufferFormat; UINT BackBufferCount; D3DMULTISAMPLE_TYPE MultiSampleType; D3DSWAPEFFECT SwapEffect; HWND hDeviceWindow; BOOL Windowed; BOOL EnableAutoDepthStencil; D3DFORMAT AutoDepthStencilFormat; DWORD Flags; UINT FullScreen_RefreshRateInHz; UINT FullScreen_presentationInterval; }D3DPRESENT_PARAMETERБайду номын сангаас;
GetAdapterDisplayMode函数原型
HRESULT IDirect3D9::GetAapterDisplayMode ( UINT Adapter,//显示卡序号 D3DDISPLAYMODE* pMode//存储返回模 //式信息值的指针 ); *如果查询当前桌面使用的显示卡Adapter赋值为: D3DADAPTER_DEAULT。
硬件模拟层

HEL可以在软件中模拟某些特性。但是,自 从DirectX8.0以后就不再提供HEL了。如果 想让游戏 在老式硬件上运行,那只有使用 Direct7.0及其HEL,或者自己开发一个硬件 模拟设备。DirectX9.0就提供了一个使用由 软件开发者编写HEL的接口。这类HEL现在 被称为“插件式软件设备”。
D3DDISKPLAYMODE d3ddm; …… if(FAILED(g_pD3D->GetAdapterDisplayMode (D3DADAPTER_DEFAULT, &d3ddm))) return E_FAIL;
创建Direct3D设备对象并得到接口
Direct3D设备定义了Direct3D的所有绘图 组件,绝大多数Direct3D操作都通过Direct3D 设备进行。调用IDirect3D9::CreateDevice()函 数创建Direct3D设备对象。
D3DFORMAT常用像素格式
取 值 D3DFMT_UNKNOWN D3DFMT_R8G8B8 D3DFMT_X8R8G8B8 D3DFMT_A8R8G8B8 未知像素格式 24位 32位有8位保留 24位色彩,8位透明度 说 明
D3DFMT_R5G6B5
D3DFMT_X1R5G5B5 D3DFMT_A1R5G5B5
相关文档
最新文档