Direct3D是一套底层图形API,借助API,我们能够利用硬件加速功能绘制3D场景,Direct3D 可以被视为应用程序与图形设备交互式的中介,它们之前的关系可以描述如下

应用程序--->Direct3D--->HAL--->图形设备

在Direct3D和图形设备之间有一个中间环节,HAL(Hardware Abstraction Layer)由于市面上的图形卡品种繁多,每种卡性能和实现方式功能和机理都有差异,所以Direct3D无法与图形设备直接交互,所以Direct3D就需要设备制造商实现一个HAL,HAL是一个指示设备完成一些操作的代码集.
设备制造商将其产品所支持的全部功能都实现都到HAL中,那些,Direct3D支持,但是设备不支持的功能无法在HAL中实现,调用一个没有在HAL中实现的Direct3D函数将会导致调用失败,除非它是一个项点运算,并且用户已经指定了使用软件运算方式,在这种情况下,用户所期望的实现的功能便可Direct3D运算以软件方式来模拟.

1.REF设备
有时,D3D 提供的某些功能键不为您的图形设备支持,但您希望使用这些功能,为了满足这种需求,D3D提供了参考光栅设备(Reference rasterizer device) 也就是REF 设备,它能以软件运算方式完全支持D3D API,借助REF,您可以在代码中使用那些当前硬件不支持的特性,并对特性进行测试,注意REF设备仅用于开发阶段,它与DX SDK 捆绑在一起,无法发布给最终用户,此外REF速度十分缓慢,在测试以外的场合都不实用

2.D3DDEVTYPE
在程序代码中,HAL值用D3DDEVTYPE_HAL来指定,该值是D3DDEVTYPE枚举类型之一,REF值用D3DDEVTYPE_HAL来指定,全部类型值可以看SDK开发文档

二.Direct3D 的初始化

1.获取接口IDirect3D 的指针,该接口用于获取系统中物理设备的信息并创建接口IDirect3DDevice9,
2.检查设备性能,判断主显卡是否支持硬件顶点运算功能,
3.初始化D3DPRESENT_PARAMETERS结构,
4.创建IDirect3dDevice9对像

2.1获取接口IDirect3D9的指针

IDirect3D9 * g_d3d = Direct3DCreate9(D3D_SDK_VERSION)

2.2校验硬件顶点运算

IDirect3D9::GetDeviceCaps Method
函数原型如下
HRESULT GetDeviceCaps(         
    UINT Adapter,        //指定的物理显示序号
    D3DDEVTYPE DeviceType,      //指定设备类型
    D3DCAPS9 *pCaps             //返回已初始化的设备性能结构实例
);

D3DCAPS9 caps;
d3d9->GetDeviceCaps(
    D3DADAPTER_DEFAULT,
    D3DDEVTYPE_HAL,
    &caps
)
int vp = 0;
if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
{
    vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
else
{
    vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING
}

2.3填充D3DPRESENT_PARAMETER结构
该结构的定义如下
typedef struct _D3DPRESENT_PARAMETERS_ {
    UINT BackBufferWidth, BackBufferHeight;
    D3DFORMAT BackBufferFormat;
    UINT BackBufferCount;
    D3DMULTISAMPLE_TYPE MultiSampleType;
    DWORD MultiSampleQuality;
    D3DSWAPEFFECT SwapEffect;
    HWND hDeviceWindow;
    BOOL Windowed;
    BOOL EnableAutoDepthStencil;
    D3DFORMAT AutoDepthStencilFormat;
    DWORD Flags;
    UINT FullScreen_RefreshRateInHz;
    UINT PresentationInterval;
} D3DPRESENT_PARAMETERS;

BackBufferWidth, BackBufferHeight;// 后台缓存中表面的宽度,高度,单位为像素
BackBufferFormat;//后台缓存的像素格式
UINT BackBufferCount;//后台缓存的个数,通常指定为1
MultiSampleType;//多重采样类型(当SwapEffect=D3DSWAPEFFECT_DISCARD ,该值必须为 D3DMULTISAMPLE_NONE )
hDeviceWindow;//与设备相关的窗口
BOOL Windowed;//值为true时,表示为窗口模式,为false时为全屏模式

填充该结构的一个示例如下
D3DPRESENT_PARAMETER d3dpp;
d3dpp.BackBufferWidth = 800;
d3dpp.BackBufferHeight = 600;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = true;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHZ = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRENT_INTERVAL_IMMEDIATE

2.4创建IDirect3DDevice9接口
该函数原型如下
HRESULT CreateDevice(        
    UINT Adapter,
    D3DDEVTYPE DeviceType,
    HWND hFocusWindow,
    DWORD BehaviorFlags,
    D3DPRESENT_PARAMETERS *pPresentationParameters,
    IDirect3DDevice9** ppReturnedDeviceInterface
);

其中DWORD BehaviorFlags值可以为
D3DCREATE_HARDWARE_VERTEXPROCESSING
D3DCREATE_SOFTWARE_VERTEXPROCESSING
示例如下
IDirect3DDevice9 *g_device;
g_d3d->CreateDevice(
    D3DADAPTER_DEFAULT,
    D3DDEVTYPE_HAL,
    hwnd,
    D3DCRATE_HARDWARE_VERTEXPROCESSING,
    &d3dpp,
    &g_device
)

全部例子如下

#include <windows.h>
#include <d3d9.h>#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")LPDIRECT3D9        g_d3d;
LPDIRECT3DDEVICE9  g_device;bool InitD3d(HWND hwnd,UINT width,UINT height)
{g_d3d = Direct3DCreate9(D3D_SDK_VERSION);if(g_d3d==NULL){return false;    }D3DDISPLAYMODE displaymode;if(FAILED(g_d3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&displaymode))){return false;}D3DPRESENT_PARAMETERS d3dpp;ZeroMemory(&d3dpp,sizeof(d3dpp));d3dpp.Windowed = true;d3dpp.BackBufferWidth = width;d3dpp.BackBufferHeight = height;d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;d3dpp.BackBufferFormat = displaymode.Format;if(FAILED(g_d3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&g_device))){return false;}return true;
}void RenderScene()
{g_device->Clear(0,0,D3DCLEAR_TARGET,0xff000000,1.0f,0);g_device->BeginScene();//g_device->EndScene();g_device->Present(0,0,0,0);
}void Shutdown()
{if(g_d3d){g_d3d->Release();}if(g_device){g_device->Release();}
}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{static TCHAR szAppName[] = TEXT ("DX SDK 9.0");HWND         hwnd;MSG          msg;WNDCLASSEX   wndclassex = {0};wndclassex.cbSize        = sizeof(WNDCLASSEX);wndclassex.style         = CS_HREDRAW | CS_VREDRAW;wndclassex.lpfnWndProc   = WndProc;wndclassex.cbClsExtra    = 0;wndclassex.cbWndExtra    = 0;wndclassex.hInstance     = hInstance;wndclassex.hIcon         = LoadIcon (NULL, IDI_APPLICATION);wndclassex.hCursor       = LoadCursor (NULL, IDC_ARROW);wndclassex.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);wndclassex.lpszMenuName  = NULL;wndclassex.lpszClassName = szAppName;wndclassex.hIconSm       = wndclassex.hIcon;if (!RegisterClassEx (&wndclassex)){MessageBox (NULL, TEXT ("RegisterClassEx failed!"), szAppName, MB_ICONERROR);return 0;}hwnd = CreateWindowEx (WS_EX_OVERLAPPEDWINDOW,szAppName,TEXT ("WindowTitle"),WS_OVERLAPPEDWINDOW,100,100,800,600,NULL,NULL,hInstance,NULL);if(!InitD3d(hwnd,800,600))return -1;ShowWindow (hwnd, iCmdShow);UpdateWindow (hwnd);ZeroMemory(&msg,sizeof(msg));while (msg.message!=WM_QUIT){if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){TranslateMessage (&msg);DispatchMessage (&msg);}//else{RenderScene();}}Shutdown();return msg.wParam;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{switch (message){case WM_DESTROY:PostQuitMessage (0);return (0);}return DefWindowProc (hwnd, message, wParam, lParam);
}

Direct3D 初始化相关推荐

  1. DirectX11 Direct3D初始化

    Direct3D初始化 1. Direct3D初始化步骤 下面将讲解如何初始化Direct3D.我们将Direct3D的初始化过程分为如下几个步骤: 1.使用D3D11CreateDevice方法创建 ...

  2. Direct3D初始化代码含义

    // Desc: 初始化Direct3D //----------------------------------------------------------------------------- ...

  3. DirectX9.03D Direct3D初始化

    Direct3D 的初始化分解为如下步骤: 1 获取接口 IDrirect3D8的指针. 2 检查设备性能(D3DCAPS9), 判断主显(primaty display adapter or pri ...

  4. Direct3D初始化

    Objectives 1.基本理解Direct3D在3D硬件编程中的作用 2.理解COM组件在Direct3D 3.学习基本图形概念,例如2D图像的储存,交换页,深度缓冲,多重采样,CPU\GPU的相 ...

  5. Direct3D初始化失败的原因

    有些开发员在用D3D库开发时经常遇到初始化失败的问题,我把几个常见的原因归纳一下: 1. 系统没有安装显卡驱动,刚装的系统使用的是默认的驱动,是不支持D3D加速的,这个务必要检查一下. 2. 没有调用 ...

  6. 初始化Direct3D

    一.Direct3D概述     DirectX是微软公司开发的一套功能丰富的底层API,其功能涵盖了:            2D/3D图形加速的支持.            各种输入设备的控制. ...

  7. DirectX入门之初始化Direct3D及常见问题

    这篇文章主要讲解如何初始化Direct3D.Direct3D初始化成功后,我们将的到一个代表显卡的C++对象(类型:IDrect3DDevice9). 初始化流程图: 完整代码: //全局变量IDir ...

  8. DirectX11 With Windows SDK--01 DirectX11初始化

    DirectX11 With Windows SDK--01 DirectX11初始化 原文:DirectX11 With Windows SDK--01 DirectX11初始化 前言 由于个人觉得 ...

  9. 【Visual C++】游戏开发笔记三十四 浅墨DirectX提高班之三 起承转合的艺术:Direct3D渲染五步曲...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8223965 作者:毛星云(浅墨 ...

最新文章

  1. ELMo:基于上下文的语言模型,5分钟构建语义搜索引擎代码实战
  2. RxJS 6有哪些新变化?
  3. vue中的if判断和for循环语句
  4. jQuery源码学习第二天--jQuery的extend扩展
  5. 垃圾收集算法,垃圾收集器_确定活动的热点垃圾收集器
  6. python 当前时间的前一天_python中time、datetime模块的使用
  7. java检索txt文本_lucene索引word/pdf/html/txt文件及检索(搜索引擎)
  8. RCP:如何保存TaskList及如何获取TaskList
  9. CSS综合案例——淘宝焦点图(轮播图)布局及网页布局总结
  10. ES6文档 思维导图笔记
  11. Java入门 J2SE
  12. 看图四级作文 快速技术的发展计算机,【英语四级看图作文范文11篇】_英语四级看图作文范文大全_2021年英语四级看图作文范文_东城教研...
  13. Mac上Java环境变量配置_飘云羽逸_新浪博客
  14. ArcGIS坡度分析(解决坡度分析80-89°高值居多)
  15. Moyqv 唐纳.卡兰 cnsl
  16. Godaddy注册的域名转发、转向教程
  17. 代码传奇 | 身价10亿程序员的传奇一生
  18. 线性代数---魏福义版 第一章习题答案
  19. php riak,Riak的分布式数据库模型 - 分布式数据库相关理论 Part3
  20. 传奇服务器都有哪些文件,传奇服务端每个文件夹的含义

热门文章

  1. char*cstr 转 ushort
  2. 实现倒计时的几种方案汇总
  3. Java GUI 知识总结
  4. loadrunner 录制脚本出现乱码解决方法
  5. python turtle绘图-案例集锦(小猪佩奇、哆啦A梦、小黄人、樱花树、皮卡丘、汉诺塔、高达、星空等)
  6. 远距离无线音视频传输方案,物联网技术应用,无线远距离WiFi通信技术
  7. 经典好用的软件,不容错过
  8. Ardunio开发实例-红外避障传感器
  9. 实验30:避障传感器实验
  10. 计算机考研面试------简历的制作