DirectX 9.0 3D 游戏开发编程基础 学习笔记(一)

 

 一个简单的例子Triangle

 

一般创建一个directX的程序需要四个步骤

 

// Step 1: Create the IDirect3D9 object.

IDirect3D9* d3d9 = 0;

d3d9 = Direct3DCreate9(D3D_SDK_VERSION);

 

IDirect3D9是一个用来创建微软directX对象以及初始化环境的接口,主要的作用是枚举和获取设备的capabilities

类主要的成员函数有

IDirect3D9::GetDeviceCaps     //获取设备信息

IDirect3D9::CheckDeviceType   //是否支持硬件加速

IDirect3D9::GetAdapterCount   //获取系统适配器的数目

 

IDirect3D9的创建方法是调用Direct3DCreate9函数

 

// Step 2: Check for hardware vp.

D3DCAPS9 caps;

d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);

 

int vp = 0;

if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )

       vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;

else

       vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

 

这里就是调用上述步骤1IDirect3D9成员函数GetDeviceCaps来获取一个描述硬件的结构体D3DCAPS9。查看相关文档会发现,这是一个相当大的结构体,在这里我们只关心DWORD DevCaps这个成员,用来标示设备性能。在此处,检验当前该硬件是否支持硬件顶点计算。

 

// Step 3: Fill out the D3DPRESENT_PARAMETERS structure.

D3DPRESENT_PARAMETERS d3dpp;

       d3dpp.BackBufferWidth                 = width;

       d3dpp.BackBufferHeight                = height;

       d3dpp.BackBufferFormat               = D3DFMT_A8R8G8B8;

       d3dpp.BackBufferCount                 = 1;

       d3dpp.MultiSampleType                 = D3DMULTISAMPLE_NONE;

       d3dpp.MultiSampleQuality             = 0;

       d3dpp.SwapEffect                          = D3DSWAPEFFECT_DISCARD;

       d3dpp.hDeviceWindow                  = hwnd;

       d3dpp.Windowed                          = windowed;

       d3dpp.EnableAutoDepthStencil     = true;

       d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;

       d3dpp.Flags                                   = 0;

       d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;

       d3dpp.PresentationInterval           = D3DPRESENT_INTERVAL_IMMEDIATE;

 

这里的主角就是D3DPRESENT_PARAMETERS结构体,用来进行参数的描述。可以看到诸如离屏帧缓冲的长宽、格式、数量以及多重采样、是否全屏等设置。

 

// Step 4: Create the device.

HRESULT hr = 0;

hr = d3d9->CreateDevice(

              D3DADAPTER_DEFAULT, // primary adapter

              deviceType,              // device type

              hwnd,                   // window associated with device

              vp,                     // vertex processing

           &d3dpp,                // present parameters

           device);

 

获得刚才设置的结构体后,最后便是创建Device的句柄了。

其中最值得一提的是out参数IDirect3DDevice9** device,这也是direct3D做基础图元绘制的接口,完成例如创建资源、shader等等工作。这个接口的函数也非常多,但在以后应用中都会遇到,是进行图形处理最重要的接口。

 

接着要重点解释的是IDirect3DVertexBuffer9这个接口,DX中要绘制的顶点和图元都是通过这样一个顶点缓存来传给GPU的。一个顶点缓存是一个包含顶点数据的连续空间。之所以用缓存而非数组来存储数据,是因为顶点缓存可以被放置在显存中。进行绘制时,使用显存的数据将比使用系统内存要快很多。

 

IDirect3DVertexBuffer9继承自IDirect3DResource9接口,在DX中,资源是指用来绘制的纹理和缓存,而应用程序需要创建、导入、复制或者使用这些资源,这些接口提供的正是这样的功能。

缓存(几何)资源:IDirect3DIndexBuffer9/IDirect3DVertexBuffer9 直接继承自IDirect3DResource9接口;

纹理资源:IDirect3DCubeTexture9/IDirect3DTexture9/IDirect3DVolumeTexture9 继承自IDirect3DBaseTexture9接口;

 

继承结构如下:

IDirect3DResource9

|-- IDirect3DBaseTexture9

  |-- IDirect3DCubeTexture9

  |-- IDirect3DTexture9

  |-- IDirect3DVolumeTexture9

|-- IDirect3DIndexBuffer9

|-- IDirect3DSurface9

|-- IDirect3DVertexBuffer9

|-- IDirect3DVolume9

 

IDirect3DResource9主要提供了查询和准备这些资源的统一接口方法

比如

IDirect3DResource9::SetPriority     //设置资源的优先级 

IDirect3DResource9::SetPrivateData  //设置应用程序的数据

 

而创建这些资源是通过IDirect3DDevice9的方法来实现

创建纹理资源:

IDirect3DDevice9::CreateCubeTexture

IDirect3DDevice9::CreateTexture

IDirect3DDevice9::CreateVolumeTexture

创建缓存资源:

IDirect3DDevice9::CreateIndexBuffer

IDirect3DDevice9::CreateVertexBuffer

 

现在就具体看下IDirect3DVertexBuffer9这个接口,用来操作顶点缓存。

函数有三个

Direct3DVertexBuffer9::GetDesc  // 获取描述结构体

IDirect3DVertexBuffer9::Lock    // 锁定该缓存,只有锁定后,才能进行读写

IDirect3DVertexBuffer9::Unlock  // 解锁

 

使用实例

IDirect3DVertexBuffer9* Triangle = 0; // vertex buffer to store

// Create the vertex buffer.

Device->CreateVertexBuffer(

              3 * sizeof(Vertex),           // size in bytes

              D3DUSAGE_WRITEONLY,  // flags

              Vertex::FVF,               // vertex format

              D3DPOOL_MANAGED,    // managed memory pool

              &Triangle,                // return create vertex buffer

              0);                      // not used - set to 0

 

// Fill the buffers with the triangle data.

Vertex* vertices;

Triangle->Lock(0, 0, (void**)&vertices, 0);

 

vertices[0] = Vertex(-1.0f, 0.0f, 2.0f);

vertices[1] = Vertex( 0.0f, 1.0f, 2.0f);

vertices[2] = Vertex( 1.0f, 0.0f, 2.0f);

 

Triangle->Unlock();

 

在进行绘制时进行数据源的绑定就可以了

Device->SetStreamSource(0, Triangle, 0, sizeof(Vertex));

 

使用完进行释放

d3d::Release<IDirect3DVertexBuffer9*>(Triangle);

这个应该是继承自IUnknown接口相同的释放方法

 

其中还有一些IDirect3DDevice9的方法,记录下

IDirect3DDevice9::BeginScene

IDirect3DDevice9::DrawPrimitive

IDirect3DDevice9::EndScene

IDirect3DDevice9::SetTransform

IDirect3DDevice9::SetFVF

IDirect3DDevice9::Present

IDirect3DDevice9::SetRenderState

最后这个SetRenderState函数可以设置的东西也不少,下次有时间再继续研究吧

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录: 第Ⅰ部分 基础知识 必备的数学知识 3D空间中的向量 向量相等 计算向量的长度 向量的规范化 向量加法 向量减法 数乘 点积 叉积 矩阵 矩阵相等、矩阵数乘和矩阵加法 矩阵乘法 单位矩阵 逆矩阵 矩阵的转置 D3DX矩阵 基本变换 平移矩阵 旋转矩阵 比例变换矩阵 几何变换的组合 向量变换的一些函数 平面(选读) D3DXPLANE 点和平面的空间关系 平面的创建 平面的规范化 平面的变换 平面中到某一点的最近点 射线(选读) 射线 射线与平面的相交 小结    第Ⅱ部分 Direct3D基础 第1章 初始化Direct3D 1.1 Direct3D概述 1.1.1 REF设备 1.1.2 D3DDEVTYPE 1.2 COM(组件对象模型) 1.3 预备知识 1.3.1 表面 1.3.2 多重采样 1.3.3 像素格式 1.3.4 内存池 1.3.5 交换链和页面置换 1.3.6 深度缓存 1.3.7 顶点运算 1.3.8 设备性能 1.4 Direct3D的初始化 1.4.1 获取接口IDirect3D9的指针 1.4.2 校验硬件顶点运算 1.4.3 填充D3DPRESENT_PARAMETER结构 1.4.4 创建IDirect3DDevice9 接口 1.5 例程:Direct3D的初始化 1.5.1 d3dUtility.h/cpp 1.5.2 例程框架 1.5.3 例程:D3D初始化 1.6 小结 第2章 绘制流水线 2.1 模型表示 2.1.1 顶点格式 2.1.2 三角形单元 2.1.3 索引 2.2 虚拟摄像机 2.3 绘制流水线 2.3.1 局部坐标系 2.3.2 世界坐标系 2.3.3 观察坐标系 2.3.4 背面消隐 2.3.5 光照 2.3.6 裁剪 2.3.7 投影 2.3.8 视口变换 2.3.9 光栅化 2.4 小结 第3章 Direct3D中的绘制 3.1 顶点缓存与索引缓存 3.1.1 创建顶点缓存和索引缓存 3.1.2 访问缓存内容 3.1.3 获取顶点缓存和索引缓存的信息 3.2 绘制状态 3.3 绘制的准备工作 3.4 使用顶点缓存和索引缓存进行绘制 3.4.1 IDirect3DDevice9::DrawPrimitive 3.4.2 IDirect3DDevice9::DrawIndexedPrimitive 3.4.3 Begin/End Scene 3.5 D3DX几何体 3.6 例程:三角形、立方体、茶壶、D3DXCreate* 3.7 小结 第4章 颜色 4.1 颜色表示 4.2 顶点颜色 4.3 着色 4.4 例程:具有颜色的三角形 4.5 小结 第5章 光照 5.1 光照的组成 5.2 材质 5.3 顶点法线 5.4 光源 5.5 例程:光照 5.6 一些附加例程 5.7 小结 第6章 纹理映射 6.1 纹理坐标 6.2 创建并启用纹理 6.3 纹理过滤器 6.4 多级渐进纹理 6.4.1 多级渐进纹理过滤器 6.4.2 使用多级渐进纹理 6.5 寻址模式 6.6 例程:纹理四边形 6.7 小结 第7章 融合技术 7.1 融合方程 7.2 融合因子 7.3 透明度 7.3.1 Alpha通道 7.3.2 指定Alpha来源 7.4 用DirectX Texture Tool 创建Alpha通道 7.5 例程:透明效果 7.6 小结 第8章 模板 8.1 模板缓存的使用 8.1.1 模板缓存格式的查询 8.1.2 模板测试 8.1.3 模板测试的控制 8.1.4 模板缓存的更新 8.1.5 模板写掩码 8.2 例程:镜面效果 8.2.1 成像中的数学问题 8.2.2 镜面效果实现概述 8.2.3 代码解析 8.3 例程:Planer Shadows 8.3.1 平行光阴影 8.3.2 点光源产生的阴影 8.3.3 阴影矩阵 8.3.4 使用模板缓存防止二次融合 8.3.5 代码解析 8.4 小结 第Ⅲ部分 Direct3D的应用 第9章 字体 9.1 ID3DXFont接口 9.1.1 创建一个ID3DXFont 接口对象 9.1.2 绘制文本 9.1.3 计算每秒绘制的帧数 9.2 CD3DFont 9.2.1 创建CD3DFont类的实例 9.2.2 绘制文本 9.2.3 清理 9.3 D3DXCreateText函数 9.4 小结 第10章 网格(一) 10.1 几何信息 10.2 子集和属性缓存 10.3 绘制 10.4 网格优化 10.5 属性表 10.6 邻接信息 10.7 克隆 10.8 创建网格(D3DXCreateMeshFVF) 10.9 例程:网格的创建与绘制 10.10 小结 第11章 网格(二) 11.1 ID3DXBuffer 11.2 XFile 11.2.1 加载XFile文件 11.2.2 XFile材质 11.2.3 例程:XFile 11.2.4 生成顶点法线 11.3 渐进网格 11.3.1 生成渐进网格 11.3.2 顶点属性权值 11.3.3 ID3DXPMesh接口方法 11.3.4 例程:Progressive Mesh 11.4 外接体 11.4.1 一些新的特殊常量 11.4.2 外接体的类型 11.4.3 例程:Bounding Volumes 11.5 小结 第12章 设计一个灵活的Camera类 12.1 Camera类的设计 12.2 实现细节 12.2.1 观察矩阵(取景变换矩阵, View Matrix)的计算 12.2.2 绕任意轴的旋转 12.2.3 俯仰、偏航和滚动 12.2.4 行走、扫视和升降 12.3 例程:Camera 12.4 小结 第13章 地形绘制基础 13.1 高度图 13.1.1 创建高度图 13.1.2 加载RAW文件 13.1.3 访问和修改高度图 13.2 创建地形几何信息 13.2.1 顶点的计算 13.2.2 索引的计算 13.3 纹理映射 13.4 光照 13.4.1 概述 13.4.2 坐标方格的明暗度计算 13.4.3 对地形进行着色 13.5 在地形中“行走” 13.6 例程:Terrain 13.7 一些改进 13.8 小结 第14章 粒子系统 14.1 粒子和点精灵 14.1.1 结构格式 14.1.2 点精灵的绘制状态 14.1.3 粒子及其属性 14.2 粒子系统的组成 14.2.1 绘制一个粒子系统 14.2.2 随机性 14.3 具体的粒子系统 14.3.1 例程:Snow System 14.3.2 例程:Firework 14.3.3 例程:Particle Gun 14.4 小结 第15章 拾取 15.1 屏幕到投影窗口的变换 15.2 拾取射线的计算 15.3 对射线进行变换 15.4 射线/物体相交判定 15.5 例程:Picking 15.6 小结
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值