利用D3D绘制一个三角形
d3dxcreatetexture应用实例

d3dxcreatetexture应用实例D3DXCreateTexture是Direct3D中的一个函数,用于创建一个纹理对象。
下面是一个使用D3DXCreateTexture函数的应用实例:```c++#include <Windows.h>#include <d3d9.h>#include <d3dx9.h>// 函数声明LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);HRESULT CreateDirect3DDevice(HWND hwnd);HRESULT LoadTexture(LPDIRECT3DDEVICE9 pDevice, LPDIRECT3DTEXTURE9* ppTexture);// 全局变量LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;LPDIRECT3DTEXTURE9 g_pTexture = NULL;// 程序入口int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){// 创建窗口WNDCLASSEX wc = {sizeof(WNDCLASSEX), CS_CLASSDC, WindowProc, 0, 0, hInstance, NULL, NULL, NULL, NULL, _T("D3D Example"), NULL};::RegisterClassEx(&wc);HWND hwnd = ::CreateWindow(wc.lpszClassName, _T("D3D Example"),WS_OVERLAPPEDWINDOW, 100, 100, 800, 600, ::GetDesktopWindow(), NULL, wc.hInstance, NULL);// 初始化Direct3Dif (SUCCEEDED(CreateDirect3DDevice(hwnd))){// 加载纹理if (SUCCEEDED(LoadTexture(g_pd3dDevice, &g_pTexture))){// 窗口消息循环MSG msg;ZeroMemory(&msg, sizeof(msg));while (msg.message != WM_QUIT){if (::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)){::TranslateMessage(&msg);::DispatchMessage(&msg);}else{// 渲染g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);if (SUCCEEDED(g_pd3dDevice->BeginScene())){// 绘制纹理if (g_pTexture){g_pd3dDevice->SetTexture(0, g_pTexture);g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);g_pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);// 在屏幕中心绘制纹理RECT rect = {300, 200, 500, 400};g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, rect,sizeof(WORD));}g_pd3dDevice->EndScene();}g_pd3dDevice->Present(NULL, NULL, NULL, NULL);}}}// 释放资源if (g_pTexture){g_pTexture->Release();g_pTexture = NULL;}if (g_pd3dDevice){g_pd3dDevice->Release();g_pd3dDevice = NULL;}}// 销毁窗口::UnregisterClass(wc.lpszClassName, wc.hInstance);return 0;}// 窗口消息处理函数LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){switch (uMsg){case WM_DESTROY:::PostQuitMessage(0);return 0;}return ::DefWindowProc(hwnd, uMsg, wParam, lParam);}// 创建Direct3D设备HRESULT CreateDirect3DDevice(HWND hwnd){// 创建D3D设备LPDIRECT3D9 pD3D;if (NULL == (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(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice)))return E_FAIL;// 设置渲染状态g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE);return S_OK;}// 加载纹理HRESULT LoadTexture(LPDIRECT3DDEVICE9 pDevice, LPDIRECT3DTEXTURE9* ppTexture) {if (FAILED(D3DXCreateTextureFromFile(pDevice, L"C:\\path\\to\\your\\texture.png", ppTexture))) return E_FAIL;return S_OK;}```这个实例展示了如何创建一个Direct3D设备,并加载一张纹理,然后在窗口中心绘制这个纹理。
利用D3D绘制一个三角形

朋友们,在前期我们只是实现了一个简单的D3D空白窗口,只是实现了D3D的初步,接下来我们要学习怎样利用D3D提供的接口绘制一个三角形。
好了,让我们还按照第一讲中的方法(如果不清楚的,请再仔细阅读第一篇文章),创建一个三角形程序。
咱们先不管什么原理的问题,先让程序运行起来,达到我们的期望要求,再来探讨他的原理。
让我们在先定义一个结构体,用来存放三角形的坐标顶点以及颜色,这个结构体名字随意起,下面是我的定义:typedefstruct _CustomVertexTrigon_{float x, y, z; // 顶点坐标DWORD dwColor; // 渲染颜色}CustomVertexTrigon, *LPCustomVertexTrigon;//定义一个FVF用到的数据项:坐标颜色#define D3DFVF_CUSTOMVERTEX_TRIGON (D3DFVF_XYZ | D3DFVF_DIFFUSE)再写定点缓冲区代码private:LPDIRECT3DVERTEXBUFFER9 m_pVB; //顶点缓存区的的接口指针void InitGeometry();//该函数用于建模void CD3DWnd::InitGeometry(){//三角形实体的数学模型CustomVertexTrigonvertices[] ={{ -1.0f, -1.0f, 0.0f, D3DCOLOR_XRGB(255,0,0) }, //点A,红色{ 0.0f, 1.0f, 0.0f, D3DCOLOR_XRGB(0,255,0) }, //点B,绿色{ 1.0f, -1.0f, 0.0f, D3DCOLOR_XRGB(0,255,255) }//点C,浅蓝};//创建顶点缓存区,并获取接口IDirect3DVertexBuffer9的指针m_pDevice->CreateVertexBuffer(sizeof(vertices), //缓存区尺寸0, D3DFVF_CUSTOMVERTEX_TRIGON,D3DPOOL_DEFAULT, &m_pVB, NULL );//把顶点数据填入顶点缓存区void* pVertices;m_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 );memcpy(pVertices, vertices, sizeof(vertices) );m_pVB->Unlock();}在int CD3DWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)函数中InitCD3DWnd();后添加InitGeometry(); //进行建模由于顶点缓存区是COM对象,所以还需要释放。
DirectX3D 笔记

内容摘自《DirectX 9.0 3D 游戏开发编程基础》章节一.1.必备数学知识二.1.初始化Direct3D2.(固定)绘制流水线3.Direct3D 中的绘制4.颜色5.光照6.纹理映射7.融合技术8.模板三.9.字体10.网格(一)11.网格(二)12.自定义Camera 类13.地形绘制14.粒子系统15.拾取四.16.着色语言HLSL17.顶点着色器18.像素着色器19.效果框架一.1.必备数学知识1.1向量及坐标系选取,D3D 中以LH/RH 标记左手/右手坐标系。
1.2向量运算:数乘点积-用于计算两个向量的夹角(cos θ)及判断向量垂直。
叉积-计算与两个向量所在平面垂直的向量,可用于面片法向量的计算。
1.3矩阵:在3D 图形应用中,常用4X4矩阵和1X4行向量进行运算。
由于多数变换无法用3阶矩阵表示3维变换,因此3D 变换中的矩阵为4维矩阵。
由于3维坐标空间中点和向量具有相同的表示形式,因此在进行运算时,将点和向量扩展至4D 空间时,通过如下形式:123(,,,1)p p p p =表示点(保证能平移变换);以123(,,,0)v v v v =表示向量(防止平移变换)。
1.4 3维空间中的变换:平移矩阵、旋转矩阵、比例变换矩阵1.5平面D3DXPLANE 在D3D 中存储平面及相应操作。
平面定义为满足0()0n p p ∙-=的所有点的集合,因此可通过平面法向量n 和平面上一点0p 表示,在代码中存储n 和0d n p =-∙表示平面;平面可被看做4D 向量(n,d )进行变换;当平面被规范化(法向量为单位向量且重新计算d ),则n p d ∙+为p 点到平面的最短有符号距离。
1.6射线定义为0()p t p tu =+。
射线与平面的相交判定用于拾取的实现。
二.1. 初始化Direct3D1.1 Direct3D 提供了操纵图形设备(通过HAL 硬件抽象层)的API 。
由HAL 提供的硬件支持的功能可被D3D 接口操作;硬件不支持时由REF 设备实现,由D3DDEVTYPE 枚举类型成员指定。
DX基础知识

DX基础知识DX基础知识0001、 D3D中任何复杂的图形由什么图元组成:三角形2、向量的属性包括:长度和方向3、三维空间的变换:(3种)平移、放缩、旋转4、像素的格式: ARGB 和 XRGB (常用)5、如果贴上图片,顶点格式必须有D3DFVF_TEX1,取值范围[0,1] 。
6、最基础的对象是 D3D对象,由它创建 Device ,再由Device创建索引、顶点等。
7、创建和释放应符合栈(先进后出)的顺序。
8、 D3D在设备创建时选择两种方式,用硬件是 HAL ,用软件是REF 。
9、表示纯红颜色的颜色的常量是: 0xFFFF000010、在D3D中,本地空间指局部坐标系,世界空间指世界坐标系。
11、使用索引缓冲区相对于顶点缓冲区的优点:对于可重用的点,用索引代替,省去重复空间。
12、 D3D中,绘制基本图元的函数是: DrawPrimitive()。
13、实现光照的效果需要通过光照和模型的法线来实现。
法线分为顶点法线和面法线。
14、 D3D中,顶点是程序员的定义格式,叫做:灵活顶点格式(FVF),FVF的值必须与顶点结构体一一对应。
15、处理纹理坐标的值在(0,1)边界外,纹理坐标的方式叫纹理寻址。
三种纹理寻址的方式:包装、边框、镜面、夹取。
16、 D3D中,模型表面的材质是指物体表明对光的反射能力,也包括α通道。
17、在DX中,渲染需要占用大量的CPU时间,要想获得稳定的帧速率,调用 PeekMessage()。
18、只要不去修改,就会一直保持状态,则这些状态叫做开关量。
19、设置渲染状态的函数是SetRenderState()。
20、纹理尺寸最好符合什么标准?长宽最好是2的n次幂,矩形也行。
21、 DX最多支持同时 8 个光源, 8 层纹理。
22、 DX中正确体系物体遮挡关系,使用 Z-Buffer(深度缓冲)。
23、为了增加场景的真实感,通常添加雾效。
24、 DX中,专门封装了一个处理2D图形的接口:D3DXSprite1、 DX图形库的开发方式,使用这种机制有什么好处?DX图形库的开发方式是基于Windows的COM机制(ComponentObject Model组件对象模型)。
directx函数大全

1网络游戏开发—DirectX函数归纳总结23003李翔李森2DirectX目录1.D3D 基本框架 (1)创建D3D 对象 (2)获取显卡显示模式 (2)创建D3D 设备接口 (2)开始渲染和结束渲染 (2)清空图形绘制区 (2)屏幕反转 (2)2.绘制基本图形 (1)绘制基本图形 (4)灵活定点格式(FVF) (2)基本图元的绘制 (2)创建顶点缓冲区 (2)基本图元的绘制 (2)保存顶点 (2)设置渲染状态 (2)图形绘制 (2)索引缓冲 (4)顶点设置 (2)创建索引缓冲区 (2)保存顶点索引值 (2)索引图形绘制 (2)D3D 中的图形学 (4)D3D 中的向量 (2)D3D 中的矩阵 (2)D3D 中的平面 (2)3D3D 中的射线 (2)D3D 中的图形变换 (2)3.纹理 (4)从磁盘文件获取纹理 (2)设置当前要渲染的纹理 (2)设置纹理的渲染状态 (2)设置纹理采样属性 (2)从一张纹理图形中生成多级纹理 (2)包装纹理寻址 (2)镜像纹理寻址 (2)夹取纹理寻址 (2)边框颜色纹理寻址 (2)一次镜像纹理寻址 (2)纹理包装 (2)4.光照 (4)D3D 光照的基本实现 (4)顶点格式 (2)设置物体材质 (2)添加光源 (2)激活光照运算 (2)5.摄像机 (4)生成视图变换矩阵 (2)生成投影变换矩阵 (2)6.模型基础 (4)ID3DXMesh 接口基础 (2)ID3DXMesh 接口相关 (2)应用.X 文件 (2)7.游戏中的基本特效 (4)4检查硬件支持的深度缓冲区格式 (2)激活深度测试 (2)设置深度缓冲区更新 (2)设置深度测试函数 (2)激活Alpha 混合 (2)设置Alpha 混合计算方式 (2)设置Alpha 混合系数 (2)激活Alpha 测试 (2)设置Alpha 测试参考值 (2)设置Alpha 测试函数 (2)多边形填充模式 (2)查询设备是否支持多重采样 (2)启用多重采样的全景图形反锯齿 (2)设置多纹理混合方式 (2)激活雾化 (2)设置雾化计算方式 (2)设置雾的颜色 (2)设置雾的起始范围 (2)指数雾化浓度 (2)基于发散的雾化 (2)创建2D 字体 (2)绘制字体 (2)5创建3D 文字网格 (2)8.游戏控制................ . . . . . . . . . . . . . . . . . . . .4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....DirectInput 实现键盘控制 (2)...........................................DirectInput 实现鼠标控制 (2)..........................................................鼠标键选 (2)9.游戏音乐音效 (4)6D3D基本框架创建D3D对象:Direct3DCreate9(D3D_SDK_VERSION)===============================================================================DirectX===============================================================================获取显卡显示模式:HRESULT GetAdapterDisplayMode(UINT Adapter, //指定显示卡序列号D3DDISPLAYMODE *pMode //存储显示模式的指针===============================================================================DirectX===============================================================================创建D3D设备接口:HRESULT CreateDevice(UINT Adapter, //显卡序列号D3DDEVTYPE DeviceType, //D3D 设备类型HWND hFocusWindow, //所属窗口句柄DWORD BehaviorFlags, //设备进行3D 运算方式D3DPRESENT_PARAMETERS *pPresentationParameters, //用于存储D3D 设备相关信息的指针IDirect3DDevice9 ** ppReturnedDeviceInterface //返回D3D 设备接口指针的地址);第二个参数DeviceType 取值:D3DDEVTYPE_HAL //硬件抽象层,通过显示硬件来完成图形渲染工作D3DDEVTYPE_REF //参考光栅器,一般用于测试显卡不支持的D3D 功能D3DDEVTYPE_SW //用于支持第三方软件第四个参数BehaviorFlags 取值:D3DCREATE_SOFTWARE_VERTEXPROCESSING //由D3D 软件进行顶点运算(常用)D3DCREATE_FPU_PRESERVE //激活双精度浮点运算或浮点运算异常检测,设置该项会降低系统性能D3DCREATE_MULTITHREADED //保___________d+_证D3D 是多线程安全的,设置该项会降低系统性能7D3DCREATE_MIXED_VERTEXPROCESSING //由混合方式进行顶点运算D3DCREATE_HARDWARE_VERTEXPROCESSING //由D3D 硬件进行顶点运算D3DCREATE_PUREDEVICE //禁用D3D 的Get*()函数,禁止D3D使用虚拟设备模拟顶点运算===============================================================================DirectX===============================================================================开始渲染和结束渲染:BeginScene(); //开始渲染……实际的渲染工作……EndScene(); //结束渲染注意:这两个函数必须成对出现,不允许交错和嵌套的发生,实际的渲染工作在这两个函数的中间进行。
《3d游戏设计》013-014 绘制基本图形

3.1 绘制基本图形
3.1.1 图元与顶点
1.顶点(Vertices)
中引入了一个灵活顶点格式(FVF:Flexible Vertex Format)的概 Direct3D中引入了一个灵活顶点格式 念,用来描述顶点信息。 Direct3D定义的灵活顶点格式可以是以下类型的组合 定义的灵活顶点格式可以是以下类型的组合。
3.1 绘制基本图形
3.1.2 绘制基本图形
设置渲染状态
在进行图形绘制之前,需要指定Direct3D Direct3D的渲染状态,Direct3D提供了多种 渲染状态,它影响几何体如何被渲染 它影响几何体如何被渲染。
HRESULT SetRenderState( D3DRENDERSTATETYPE State, DWORD Value ); g_pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); >SetRenderState(D3DRS_CULLMODE,
顶点设置 首先设定顶点结构,并定义灵活顶点格式 并定义灵活顶点格式。
//自定义顶点格式 struct CUSTOMVERTEX { FLOAT x, y, z, rhw; DWORD colour; }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE) define // 三维坐标 三维坐标. // 顶点颜色.
第3章 绘制基本图形 章
网络游戏开发 ——DirectX
专业教程 理论讲解部分
绘制基本图形 索引缓冲
顶点缓冲与基本图形绘制 索引缓冲 索引缓冲
掌握D3D中的基本图元 掌握利用顶点缓冲绘制基本图形 掌握利用索引缓冲绘制基本图形
《DirectX游戏设计》考试样题一

《DirectX游戏设计》考试样题一一、单选题(30题,每题1分,共30分)1.典型的windows SDK方式的开发中,遵循这样一个过程:( C )A.创建窗口—〉显示窗口—〉注册窗口类—〉初始化窗口类B。
注册窗口类-〉初始化窗口类—〉创建窗口-〉显示窗口C.初始化窗口类->注册窗口类—>创建窗口—〉显示窗口D.创建窗口->注册窗口类—〉初始化窗口类—〉显示窗口2.Windows编程中,退出消息循环的条件是:(A )A.GetMessage()从消息队列中获得WM_QUIT消息B.用户按下窗口关闭按钮C.用户调用DestroyWindow()函数D.用户利用Ctrl+Alt+Del,在Windows任务管理器中关闭进程3.Windows SDK方式的开发中,响应菜单或按钮我们需要关注的消息是:( B ) A.WM_CREATE B。
WM_COMMANDC.WM_MENU D.WM_BUTTON4.D3D中属于旋转函数的是:(B )A.D3DXMatrixScaling()B.D3DXMatrixRotationX()C.D3DXMatrixTranslation()D.D3DXMatrixTranspose()5.单位矩阵、矩阵转置、逆矩阵的调用函数分别是:( C )A.D3DXMatrixInverse、D3DXMatrixIdentity、D3DXMatrixTransposeB. D3DXMatrixIdentity、D3DXMatrixInverse、D3DXMatrixTranspose C.D3DXMatrixIdentity、D3DXMatrixTranspose、D3DXMatrixInverse D.D3DXMatrixInverse、D3DXMatrixTranspose、D3DXMatrixIdentity 6.逆矩阵的特点是:( C)A.和原矩阵相乘等于原矩阵B。
DirectX 8.0编程专题2 绘制三角形

第二章:绘制三角形Introduction(序)所有的 3D 图形都是由三角形构成的。
为什么是三角形而不是别的图形呢?因为三角形有许多优越之处,例如:绘制效率。
(译者:而且我们知道,任意不在同一条直线上的三个点都能构成三角形,这对于在空间中形成某种复杂图形是很有益处的,我的理解)所以,如果我们想得到一个矩形,最有效率的是绘制两个相同的合并的三角形,这样要优于直接绘制一个矩形。
所以,本教程下面将告诉你如何绘制复杂物体的最小单元:三角形。
(译者:神奇的三角形啊..)Vertices (顶点)顶点(vertex)是什么?顶点就是3D空间中的一个点。
例如,三角形有三个顶点,而矩形有四个。
在3D空间中,你可以用三个顶点来指定一个三角形。
想做到这些,你需要了解迪卡尔坐标系统。
2D Cartesian coordinate system (2D 迪卡尔坐标系统)下面的两幅图演示了2D 迪卡尔坐标系统是怎样工作的。
2D迪卡尔坐标系统是很简单的,用两条轴x、y的值来表示点的位置,进而表现出图形的位置。
这是初中时我们就学习过的。
3D Cartesian coordinate system (3D 迪卡尔坐标系统)下面的两幅图演示了左手3D 迪卡尔坐标系统是怎样工作的。
2D坐标系统只有x轴与y轴,因为它是平面的。
而在3D空间里,两个轴显然不够用了,所以,有了第三个轴:z 轴。
现在,我们用这三个轴就能在3D空间中表示出物体的任意位置了。
这其实是很简单的事情,我就不多说了。
3D PrimitivesPrimitive 为“原始”之意,3D primitive 就是设备所支持的原始的类型。
它包括:点列、线列、线代、三角形列、三角形带和三角扇形。
使用3D primitive 完成上述的图形是很方便的。
以后我们会用3D primitive 来绘制图形。
下面的一些例子演示了上述的各种方式:Point ListsFig 2.5Line ListsLine StripsFig 2.7Triangle ListsTriangle StripsTriangle FansFlexible Vertex Format (FVF) (灵活顶点格式)Flexible的意思是“灵活的”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
朋友们,在前期我们只是实现了一个简单的D3D空白窗口,只是实现了D3D的初步,接下来我们要学习怎样利用D3D提供的接口绘制一个三角形。
好了,让我们还按照第一讲中的方法(如果不清楚的,请再仔细阅读第一篇文章),创建一个三角形程序。
咱们先不管什么原理的问题,先让程序运行起来,达到我们的期望要求,再来探讨他的原理。
让我们在先定义一个结构体,用来存放三角形的坐标顶点以及颜色,这个结构体名字随意起,下面是我的定义:typedefstruct _CustomVertexTrigon_{float x, y, z; // 顶点坐标DWORD dwColor; // 渲染颜色}CustomVertexTrigon, *LPCustomVertexTrigon;//定义一个FVF用到的数据项:坐标颜色#define D3DFVF_CUSTOMVERTEX_TRIGON (D3DFVF_XYZ | D3DFVF_DIFFUSE)再写定点缓冲区代码private:LPDIRECT3DVERTEXBUFFER9 m_pVB; //顶点缓存区的的接口指针void InitGeometry();//该函数用于建模void CD3DWnd::InitGeometry(){//三角形实体的数学模型CustomVertexTrigonvertices[] ={{ -1.0f, -1.0f, 0.0f, D3DCOLOR_XRGB(255,0,0) }, //点A,红色{ 0.0f, 1.0f, 0.0f, D3DCOLOR_XRGB(0,255,0) }, //点B,绿色{ 1.0f, -1.0f, 0.0f, D3DCOLOR_XRGB(0,255,255) }//点C,浅蓝};//创建顶点缓存区,并获取接口IDirect3DVertexBuffer9的指针m_pDevice->CreateVertexBuffer(sizeof(vertices), //缓存区尺寸0, D3DFVF_CUSTOMVERTEX_TRIGON,D3DPOOL_DEFAULT, &m_pVB, NULL );//把顶点数据填入顶点缓存区void* pVertices;m_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 );memcpy(pVertices, vertices, sizeof(vertices) );m_pVB->Unlock();}在int CD3DWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)函数中InitCD3DWnd();后添加InitGeometry(); //进行建模由于顶点缓存区是COM对象,所以还需要释放。
在CD3DWnd::Cleanup()中添加他的释放代码m_pVB->Release(); //释放顶点缓存区m_pDevice->Release(); //释放设备对象m_pD3D->Release(); //释放Direct3D对象大家可以看到红色代码要放到释放设备对象之前,主要因为他的生命周期必须小于下面的设备对象的生命周期,如果他的生命周期大于其他两个时,程序有可能会出现崩溃现象。
接下来我们要添加显示图像部分,也叫设置变换矩阵。
添加一个方法private:void SetupMatrices();//用于设置三个变换矩阵顺便添加一个变量intm_nRotateY; //实体的旋转角度(单位:度)添加的这个变量,为下一步我们实现三角形旋转时使用void CD3DWnd::SetupMatrices(){D3DXVECTOR3 eye( 0.0f, 3.0f,-5.0f ); //观察点D3DXVECTOR3 lookat( 0.0f, 0.0f, 0.0f ); //视线目标点D3DXVECTOR3 up( 0.0f, 1.0f, 0.0f ); //上方向D3DXMATRIX matView;//计算视角变换矩阵::D3DXMatrixLookAtLH( &matView, &eye, &lookat, &up );//把视角变换矩阵设置到渲染环境m_pDevice->SetTransform( D3DTS_VIEW, &matView );D3DXMATRIXA16 matProj;//计算透视投影变换矩阵::D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );//把投影变换矩阵设置到渲染环境m_pDevice->SetTransform( D3DTS_PROJECTION, &matProj );}我们使用VC的向导生成一个OnTimer事件,用于刷新视窗。
让我们切入到D3DWnd.Cpp文件中,点击鼠标又建,如下图:选择ClassWizard(类向导),有以下图显示在类向导中在“Object IDs”列表中选择CD3DWnd,在Messages列表中找到WM_TIMER,双击会在“Member functions”列表中添加一个“OnTimerON_WM_TIMER”条目,在点下图中的OK按钮生成的函数如下void CD3DWnd::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call default//在这里我们加上渲染函数Render(); //渲染m_nRotateY += 2; //这里每次旋转2度CWnd::OnTimer(nIDEvent);}在int CD3DWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)里设置一个Timer并开始建模,代码如下InitGeometry(); //进行建模m_nRotateY = 0;SetTimer(1, 1, NULL);我们有了渲染,但是如果这样运行起来是看不到三角形输出的,还需要在渲染void CD3DWnd::Render()函数中添加一些相应的处理。
代码如下:void CD3DWnd::Render(){//用指定颜色清除后备缓存区m_pDevice->Clear(0, NULL, D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255), //指定使用蓝色1.0f, 0);//Direct3D规定在渲染前必须调用方法IDirect3DDevice9::BeginScene,//结束时要调用IDirect3DDevice9::EndScene。
m_pDevice->BeginScene();SetupMatrices(); //设置变换矩阵//设置自定义的FVFm_pDevice->SetFVF( D3DFVF_CUSTOMVERTEX_TRIGON );//绑定顶点缓存区至设备数据源m_pDevice->SetStreamSource( 0, m_pVB, 0, sizeof(CustomVertexTrigon) );//绘制图元,其中参数1为图元格式,参数3为三角形数目m_pDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );//实际的渲染代码放在此处。
因为本节只是为了演示如何初始化Direct3D,//所以这里为空,生成的Direct3D窗口将是一个蓝色背景的空白窗口m_pDevice->EndScene();//交换当前/后备缓存区,刷新窗口m_pDevice->Present(NULL, NULL, NULL, NULL);}接下来,需要处理一下灯光效果,这里采用禁用灯光,下面专门说一下为什么,先得到结果void CD3DWnd::InitCD3DWnd(){//创建Direct3D对象,并获取接口IDirect3D9的指针,//我们将通过该指针操作Direct3D对象。
m_pD3D = ::Direct3DCreate9(D3D_SDK_VERSION);D3DPRESENT_PARAMETERS d3dpp;::ZeroMemory(&d3dpp, sizeof(d3dpp));d3dpp.Windowed = TRUE; //创建窗口模式的Direct3D程序d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;//调用方法IDirect3D9::CreateDevice创建设备对象,并获取//接口IDirect3DDevice9的指针,我们将通过该指针操作设备对象m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, //使用缺省的显卡D3DDEVTYPE_HAL, //指定设备类型为HALm_hWnd, //Direct3D窗口的句柄D3DCREATE_SOFTWARE_VERTEXPROCESSING,//软件顶点处理&d3dpp, &m_pDevice);//因为使用顶点颜色渲染,所以要禁用光照处理,否则会得到一个黑忽忽的三角形m_pDevice->SetRenderState( D3DRS_LIGHTING, FALSE );//关闭“挑选”功能,允许渲染背面,在没有做旋转之前,可以把这句话屏蔽掉,如果要加上旋转,三角形转到背面时消失看不到m_pDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );}大家可以尝试一下,把红色区域中的代码屏蔽几句看看能得到什么样的结果。
现在距离选择只有一步的距离了,上面已经完成设置一个Timer,首先让我们在void CD3DWnd::SetupMatrices()中添加如下代码,这里我贴出整个函数的写法void CD3DWnd::SetupMatrices(){//把旋转角换算成弧度float angle = m_nRotateY * D3DX_PI / 180;D3DXMATRIX matWorld;//计算世界变换矩阵::D3DXMatrixRotationY( &matWorld, angle );//把世界变换矩阵设置到渲染环境m_pDevice->SetTransform( D3DTS_WORLD, &matWorld );D3DXVECTOR3 eye( 0.0f, 3.0f,-5.0f ); //观察点D3DXVECTOR3 lookat( 0.0f, 0.0f, 0.0f ); //视线目标点D3DXVECTOR3 up( 0.0f, 1.0f, 0.0f ); //上方向D3DXMATRIX matView;//计算视角变换矩阵::D3DXMatrixLookAtLH( &matView, &eye, &lookat, &up );//把视角变换矩阵设置到渲染环境m_pDevice->SetTransform( D3DTS_VIEW, &matView );D3DXMATRIXA16 matProj;//计算透视投影变换矩阵::D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );//把投影变换矩阵设置到渲染环境m_pDevice->SetTransform( D3DTS_PROJECTION, &matProj );}好了,我们看到的是一个旋转的三角形了,大功算搞一个段落。