首页 D3D学习笔记整理

D3D学习笔记整理

举报
开通vip

D3D学习笔记整理D3D学习笔记整理 D3D学习笔记整理 最近想要把由CUDA计算生成的图像直接做显示,所以开始学一下D3D,把我自己学习记录整理,既可以与同道分享交流,又是对自己的鞭策吧!开篇我还是比较喜欢把要学的东西整理结构理解下,所以从D3D的简述开始写吧! 一、D3D简述 由微软公司开发的DirectX,并不是一个单纯的图形API,它包含有Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direc...

D3D学习笔记整理
D3D学习 笔记 哲学笔记pdf明清笔记pdf政法笔记下载课堂笔记下载生物化学笔记PDF 整理 D3D学习笔记整理 最近想要把由CUDA计算生成的图像直接做显示,所以开始学一下D3D,把我自己学习记录整理,既可以与同道分享交流,又是对自己的鞭策吧!开篇我还是比较喜欢把要学的东西整理结构理解下,所以从D3D的简述开始写吧! 一、D3D简述 由微软公司开发的DirectX,并不是一个单纯的图形API,它包含有Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多个组件,它提供了一整套的多媒体接口 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 。 D3D即Direct3D是DirectX的三维部分,集成了开发DirectX程序三维图形部分的所有API程序,同时它支持与CUDA的互操作,这样经CUDA并行计算后图像数据可以直接供D3D做显示,这非常适合图形图像系统的研发。 二、D3D程序基本结构 一个D3D程序除去Windows窗口生成和消息传递(这属于MFC的工作),主要包含3个步骤:初始化D3D设备资源,图形显示设置和D3D资源设备释放。 1、初始化D3D设备资源 这个步骤的目的就是完成Direct3D对象的创建,D3D初始化的几个主要函数和结构体说明: 因为D3D是基于COM 机制 综治信访维稳工作机制反恐怖工作机制企业员工晋升机制公司员工晋升机制员工晋升机制图 的,而COM对象是对实际模型的抽象定义,只有通过接口才能访问操作COM对象,所以首先需要创建一个D3D接口,方法如下: LPDIRECT3D9 g_pD3D = NULL; g_pD3D=Direct3DCreate9(D3D_SDK_VERSION); LPDIRECT3D9的对象是D3D程序的最顶层对象,其它对象都必须通过它的接口函数调用得到。 Direct3DCreate9(D3D_SDK_VERSION)函数就是创建一个当前版本的一个D3D对象并返回接口。 然后就是创建D3D设备对象,由LPDIRECT3D9的对象调用HRESULT IDirect3D9:: CreateDevice()函数完成,参数说明可以参考下面代码和说明文档 D3DPRESENT_PARAMETERS结构体包含了D3D设备的相关信息,这些信息会影响D3D设备的显示方法。 下面是初始化D3D设备资源比较通用的一个代码示例 IDirect3DDevice9* g_pd3dDevice; //Direct3D 设备指针 void Cdig_D3DDlg::InitD3D(UINT hWnd)//函数的入口参数为窗口句柄 { m_hwndRender =GetDlgItem(hWnd)->GetSafeHwnd();//当前显示窗口 LPDIRECT3D9 g_pD3D = NULL; //Direct3D对象指针(不是设备指针) g_pD3D=Direct3DCreate9(D3D_SDK_VERSION); //D3D_SDK_VERSION是版本的检查 D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp,sizeof(d3dpp)); d3dpp.Windowed=TRUE;//window or full screen d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;//Surface format is unknown d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD; //The handle of the Windows window attached to //this CWnd. The m_hWnd data member is a public variable of type HWND. d3dpp.hDeviceWindow= m_hwndRender; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.EnableAutoDepthStencil = TRUE; d3dpp.AutoDepthStencilFormat = D3DFMT_D16; //显卡序号:D3DADAPTER_DEFAULT //D3D设备类型:D3DDEVTYPE_HAL,D3DDEVTYPE_REF和D3DDEVTYPE_SW //所属窗口:m_hwndRender //运算方式:D3DCREATE_SOFTWARE_VERTEXPROCESSING //D3D相关参数:d3dpp //Direct3D 设备指针:g_pd3dDevice g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL, m_hwndRender,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice); g_pD3D->Release(); } 2、图形显示 D3D的程序习惯将这一步骤用Render函数,当然可以随便取名。这一步骤最核心的四个函数。 HRESULT IDirect3DDevice9::Clear函数的作用是在绘制函数前,重置viewport的缓冲区,这是在绘制3D图形前必须调用的。用法可以参见说明文档 BeginScene()和EndScene()分别为开始和结束渲染,两者必须成对出现,并且不允许嵌套和交错。注意图形渲染的结果是存储在后台缓冲区的。 HRESULT IDirect3DDevice9:: Present()函数是将图形渲染的结果由后台缓冲区复制到前台缓冲区予以显示。 下面就是一个完整的图形渲染显示程序框架,可以得到一个没有任何图元的背景图像: HRESULT Cdig_D3DDlg::render() { if( g_pd3dDevice ) { // // Draw the scene. // g_pd3dDevice->Clear(0, 0, D3DCLEAR_TARGET , D3DCOLOR_XRGB(125,0,255), 1.0f,0); g_pd3dDevice->BeginScene(); //添加纹理渲染,图元绘制等函数 g_pd3dDevice->EndScene(); //将渲染的结果存储到后台缓冲区 //0 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示更新所有的缓冲区 g_pd3dDevice->Present(0, 0, 0, 0); } return S_OK; } 3、D3D设备资源释放 释放D3D设备资源的方法如下: if( g_pd3dDevice ) g_pd3dDevice->Release(); Release()函数会将调用这个设备的DirectX对象的引用计数减1,当DirectX对象的引用计数为0时,它就会释放它所占有的资源。虽然这个步骤很简单,但却不能忽略。 好了,到此为止,一个最基本的D3D程序结构就有了,想一想觉得其实蛮简单的,后面边学边写吧! 对了,附上一个编译配置的说明: 第一步:安装DirectX SDK(June 2008)和Microsoft Visual Studio 2005 第二步:设置DirectX和Visual Studio 2005关联: <1> 打开Visual Studio 2005,将D3D需要的Lib 文件目录在链接器中指定路径。具体步骤是:工具->选项->项目和解决方案->VC++目录,在右边“显示以下内容的目录”中选择“包含文件”,加入directx中的Include目录,我电脑上的该目录为D:\program files\directx9\Include。添加完Include头文件后,再选择库文件,加入lib文件,我电脑上的该目录为D:\program files\directx9\Lib\x86 <2> 打开sdk的sample里面的一个例子,打开时打开.sln文件,引用几个相关的lib文件,具体步骤是:项目->属性->配置属性->链接器->输入,在附加依赖项里面加入下面几个lib文件: d3dxof.lib dxguid.lib d3dx9d.lib d3d9.lib winmm.lib 第三步:设置好后,就可以执行D3D程序了。 三、图形绘制 前面的程序框架可以生成一个不含任何图形的背景图像,下面介绍的是如何显示一个基本的图形。D3D中定义了6种基本的图形表示,称为图元。 图元类型 D3D表示 意义 顶点集合 D3DPT_POINTLIST 一组点的集合 线段集合 D3DPT_LINELIST 一组线段的组合 首尾相接形式的线段集合 D3DPT_LINESTRIP 以不间断点表示的一组线段 三角形集合 D3DPT_TRIANGLELIST 一组三角形组合 首尾相接形式的三角形集合 D3DPT_TRIANGLESTRIP 以不间断点表示的一组三角形 扇形形式的三角形集合 D3DPT_TRIANGLEFAN 用扇形表示的一组三角形 绘制方法,以使用顶点缓冲区来绘制图形为例。 1、创建一个顶点缓冲区 这里有两个重要概念,顶点缓冲区和FVF(Flexible Vertex Format)。顶点缓冲区是D3D用来保存顶点数据的内存缓冲区,可以保存任何类型的顶点信息,由IDirect3DVertexBuffer9对象接口表示。 FVF是用来描述顶点缓冲区中的顶点存放格式,包含坐标,颜色,法线方向,纹理坐标等,它的值可以使用|进行组合,具体值可参见开发文档。这里给出一个简单示例: #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE) D3DFVF_XYZRHW表示顶点格式包含经过坐标转换的顶点坐标(与D3DFVF_XYZ相对应,D3DFVF_XYZ是未经转换的) D3DFVF_DIFFUSE是顶点格式包含的漫反射颜色值 注意,这里定义的宏D3DFVF_CUSTOMVERTEX中的FVF值组合必须与下面定义的顶点信息结构体的含义保持一致。 typedef struct _StrCUSTOMVERTEX { FLOAT x, y, z, rhw;//三角形顶点在投影矩阵中的坐标值,rhw为投影矫正系数 DWORD color; }CUSTOMVERTEX; IDirect3DDevice9:: CreateVertexBuffer()就是顶点缓冲区创建函数,参数说明参见后面的示例代码。 2、顶点数据拷贝 对顶点缓冲区的内存操作必须通过IDirect3DVertexBuffer9::Lock()和IDirect3DVertexBuffer9::Unlock()来实现,即对顶点缓冲区进行加锁和解锁操作。默认情况下,D3D系统在lock执行时会暂停其它的显示操作。可以设置加锁属性来使其它操作同时执行。示例代码如下: LPDIRECT3DVERTEXBUFFER9 g_pVB; HRESULT Cdig_D3DDlg::InitVB()//D3DXCreateTextureFromFile { CUSTOMVERTEX g_Vertices[] = { {50.0f,50.0f,0.5f,1.0f,0xffff0000}, {150.0f,150.0f,0.5f,1.0f,0xff00ff00}, {50.0f,150.0f,0.5f,1.0f,0xff00ffff}, }; // Create the vertex buffer //3*sizeof(CUSTOMVERTEX):缓冲区大小 //顶点缓冲区属性 //FVF //D3DPOOL_DEFAULT:指定顶点缓冲区资源内存位置的枚举变量 //顶点缓冲区指针 //保留参数 if (FAILED(g_pd3dDevice->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT,\ &g_pVB, NULL))) { return E_FAIL; }; VOID *pVertices; //0:加锁内存的起始位置 //sizeof(g_Vertices):加锁内存的大小 //(void**)&pVertices:返回内存指针的地址 //0:加锁属性 if(FAILED(g_pVB->Lock(0, sizeof(g_Vertices), (void**)&pVertices,0))) return E_FAIL; memcpy(pVertices, g_Vertices, sizeof(g_Vertices)); g_pVB->Unlock(); return S_OK; }; 3、顶点缓冲区图形显示 在前面程序Render函数的g_pd3dDevice->BeginScene()和g_pd3dDevice->EndScene()之间加入以下三个函数就可以实现图形的显示: IDirect3DDevice9:: SetStreamSource()是链接顶点缓冲区和渲染数据流 IDirect3DDevice9:: SetFVF()是指定当前渲染数据流中的FVF IDirect3DDevice9:: DrawPrimitive是用来绘制当前的渲染数据流中的图元至后台 示例代码如下,可以绘制出一个三角形: g_pd3dDevice->BeginScene(); //0:渲染数据流序号 //g_pVB:进行绑定的顶点缓冲区指针 //0:进行绑定的渲染数据流的起始位置 //sizeof(CUSTOMVERTEX):单位顶点的大小 g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX)); g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX); //图元类型 //绘制的顶点起始索引值 //绘制的图元数量 // g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); g_pd3dDevice->EndScene(); 另外一种绘制图形的方法是使用索引缓冲区,目的在于减少重复的顶点坐标,因为方法类似这里就不赘述了! 四、顶点坐标变换和设置光照 1,顶点坐标变换 我们在计算机图形学里已经学过要显示一个三维景物模型,应用程序必须经历从世界坐标系到屏幕坐标系的转换,这里主要有三个坐标系及相应的变换:世界坐标系和模型几何变换,观察坐标系和取景变换,以及投影坐标系与投影变换。相关概念在我们大学《计算机图形学》的课程里已经有很清楚的讲解,这里主要说明在D3D中如何实现。 我个人对图形学中各种坐标变换的理解就是矩阵运算,更直接地说,就是矩阵乘法。在D3D中有一个函数IDirect3DDevice9:: SetTransform()用以设定D3D顶点变换矩阵。这个函数的第一个参数用以标识当前设定的矩阵类型(D3DTS_WORLD,D3DTS_VIEW和D3DTS_PROJECTION ),第二个参数就是矩阵的指针。用法见后面的示例代码。 I.模型几何变换 这个变换的主要工作是通过矩阵乘法完成图形平移,旋转和放缩操作,在D3D功能扩展库上提供了相应的生成函数。 D3DXMATRIXA16是D3D提供的一个变换矩阵类型,生成相关变换的矩阵如下: D3DXMatrixTransformation()//生成一个平移变换矩阵 D3DXMatrixRotationX()//生成一个绕X轴旋转的变换矩阵 D3DXMatrixRotationY()//生成一个绕Y轴旋转的变换矩阵 D3DXMatrixRotationZ()//生成一个绕Z轴旋转的变换矩阵 D3DXMatrixScaling()//生成一个缩放变换矩阵 下面的示例代码,完成了一个绕X轴旋转的变换矩阵的设定: D3DXMATRIXA16 matWorld; //建立一个绕X轴动态旋转的模型几何变换矩阵 UINT iTime = timeGetTime() % 1000; FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f; D3DXMatrixRotationX(&matWorld, fAngle); g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld); 如果需要复合多个变换,只需将各个变换矩阵相乘,D3D也提供了一个完成这个乘法的函数D3DXMatrixMultiply,示例代码如下: D3DXMATRIXA16 matTranslation; D3DXMatrixTranslation(&matTranslation,fAngle,0.0f,0.0f); D3DXMatrixMultiply(&matWorld,&matWorld,&matTranslation); II.取景变换 取景变换就是设置一个虚拟的相机,使用函数D3DXMatrixLookAtLH就可以生成一个观察矩阵,使用D3D内置的D3DXVECTOR3类型进行设置,如下例 //建立一个观察矩阵 D3DXVECTOR3 vEyePt(0.0f, 3.0f, -5.0f);//观察点的位置坐标 D3DXVECTOR3 vLookatPt(0.0f, 0.0f, 0.0f);//被观察点的坐标 D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f);//虚拟相机的向上向量 D3DXMATRIXA16 matView; D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUpVec); g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView); 观察坐标系的几个坐标含义在图形学里有明确的定义,这里也不赘述了哦! III.投影变换 投影的目的就是将三维景物投影到二维屏幕上显示,主要包含正交投影和透视投影两大类。 D3D提供函数D3DXMatrixOrthoLH()生成一个正交投影矩阵.需要设置的参数为存放地址,取景宽度,取景高度,取景到观察点的最短距离以及取景到观察点的最远距离。 函数D3DXMatrixPerspectiveFovLH()生成一个透视投影矩阵,用法如下例 // 建立一个透视投影矩阵 D3DXMATRIXA16 matProj; //矩阵存放地址:matProj //在竖直方向的成像角度(弧度表示)D3DX_PI/4 //取景范围的纵横比:1.0f //取景到观察点的最短距离:1.0f //观察点的最远距离:100.0f D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f); g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj); 2、视区变换 在完成了三维顶点坐标的转换后,需要通过定义屏幕显示区域属性完成顶点裁剪和将点的投影坐标转换为屏幕坐标,予以最终显示,此变换过程称为视区变换。 D3D中定义了D3DVIEWPORT9结构,用以设置进行视区变换的各项参数,原型如下: typedef struct _D3DVIEWPORT9 { DWORD X;//左上角x坐标 DWORD Y; //左上角y坐标 DWORD Width;//视区宽度 DWORD Height;//视区高度 float MinZ;//视区最小深度,0.0f~1.0f float MaxZ;// 视区最大深度,0.0f~1.0f } D3DVIEWPORT9; 函数SetViewport用来设置D3D的视区。示例代码如下: D3DVIEWPORT9 vp; vp.X = 0; vp.Y = 0; vp.Width = rect.right; vp.Height = rect.bottom; vp.MinZ = 0.0f; vp.MaxZ = 1.0f; g_pd3dDevice->SetViewport(&vp); 3、光照设置 要让需要显示的图形更符合现实场景,就必须模拟真实世界中的光照环境,在D3D中使用函数IDirect3DDevice9::SetRenderState来设置整体的光照模型,主要包括环境光,漫反射和镜面反射。 光照模型说明了图形工作系统以怎样的方式计算灯光照射在物体上的颜色值,而不是具体的灯光。因此,我们还需要定义光源,它包含了三维场景中具体灯光的位置、方向等信息。D3D中提供了3种光源类型:方向光、点光源和聚灯光,用枚举类型D3DLIGHTTYPE表示。而光源的属性由结构D3DLIGHT9来组织。各属性值可以参考示例代码和开发文档。使用的设置函数为函数IDirect3DDevice9::SetLight。需要注意的是,仅仅调用设置函数并没有激活D3D使用光照进行计算,还需要调用函数IDirect3DDevice9::SetLightEnable启用灯光。 除光源外,影响光照效果的另一大要素就是物体材质,它决定了物体反射什么颜色以及能反射多少光线。D3D中提供结构D3DMATERIAL9来定义材质的属性,并由IDirect3DDevice9::SetMaterial完成设置。 下面是设置光照示例代码: //在激活了光照计算并使用了漫反射或镜面反射,在FVF中就需要设定顶点的法线向量 #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL) VOID Cdig_D3DDlg::SetupLights() { // Set up a material. D3DMATERIAL9 mtrl; ZeroMemory(&mtrl, sizeof(mtrl)); mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f; mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f; mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f; mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f; g_pd3dDevice->SetMaterial(&mtrl); //set up lights D3DXVECTOR3 vecDir; D3DLIGHT9 light; ZeroMemory(&light, sizeof(light)); //方向光 light.Type = D3DLIGHT_DIRECTIONAL; light.Diffuse.r = 0.0f; light.Diffuse.g = 1.0f; light.Diffuse.b = 0.0f; vecDir = D3DXVECTOR3(10, 10, -10); //将向量单位化 D3DXVec3Normalize((D3DXVECTOR3*)&light.Direction, &vecDir); light.Range = 1000.0f; g_pd3dDevice->SetLight(0, &light); g_pd3dDevice->LightEnable(0, TRUE); g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE); D3DXVECTOR3 vecPos2; D3DLIGHT9 light2; ZeroMemory(&light2, sizeof(light2)); //点光源 light2.Type = D3DLIGHT_POINT; light2.Diffuse.r = 0.9f; light2.Diffuse.g = 0.0f; light2.Diffuse.b = 0.0f; light2.Position = D3DXVECTOR3(10 * sinf(timeGetTime()/350.0f), 10, 10 * cos(timeGetTime()/350.0f)); light2.Range = 100.0f; light2.Attenuation0 = 1.0f; g_pd3dDevice->SetLight(1, &light2); g_pd3dDevice->LightEnable(1, TRUE); g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE); //打开环境光,并设置颜色 g_pd3dDevice->SetRenderState(D3DRS_AMBIENT, 0x00202020); 五、纹理绘制 要使渲染的图形更真实,可以使用D3D提供的物体表面纹理绘制功能。纹理,也称纹理贴图,就是表现物体图形细节的一幅或多幅二维图形,纹理绘制的目的就是通过一些特定的方式将纹理映射到物体上,使物体的视觉效果更加栩栩如生。 D3D纹理绘制的一般步骤如下: 1、载入纹理 首先使用IDirect3DDevice9:: CreateTexture创建一个D3D纹理对象并得到数据对象接口。当然还有其他一些类似的创建函数,例如D3DXCreateTextureFromFile()创建由图形文件得到的纹理对象。 在生成了D3D纹理对象后需要对纹理资源写入内容,这里使用IDirect3DDevice9::LockRect和UnlockRect访问纹理资源。 2、分配顶点纹理坐标 在定义FVF使需要加入纹理说明和定义相应的顶点结构,如下例: #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1) typedef struct StrCUSTOMVERTEX { FLOAT x, y, z, rhw; DWORD color; FLOAT u, v; }CUSTOMVERTEX; 3、设置当前渲染纹理 IDirect3DDevice9::SetTexture函数将纹理与指定的纹理层相关联,通过这个函数就可以将各个纹理对应到特定的纹理显示层. 4、设置纹理渲染状态 IDirect3DDevice9:: SetTextureStageState的作用在于控制D3D的纹理渲染状态,主要用于指定纹理颜色和顶点颜色的混合方法 5、渲染顶点缓冲区 使用的方法类似,由FVF决定了,这里不再赘述。 这里给出一个设置D3D纹理的简单例子: HRESULT CSRDisplayDlg::InitTexture() { //m_pgmnew.width:纹理的宽度 //m_pgmnew.height:纹理的高度 //1:多级渐进纹理序列级数 //0:纹理使用方法 //D3DFMT_A32B32G32R32F:指定纹理像素的格式 //D3DPOOL_DEFAULT:指定顶点缓冲区资源的内存位置 //&g_texture_2d.pTexture:返回生成的D3D纹理对象地址 //系统保留值 if (FAILED(g_pd3dDevice->CreateTexture(m_pgmnew.width,m_pgmnew.height, 1, 0, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &g_pTexture, NULL))) { return E_FAIL; } D3DLOCKED_RECT stLockedRect; g_pTexture->LockRect(0,&stLockedRect,0,0); // char *pch=(char*)stLockedRect.pBits; for (int i=0;iUnlockRect(0); return S_OK; }; HRESULT CSRDisplayDlg::render() { if( g_pd3dDevice ) { // // Draw the scene. // g_pd3dDevice->Clear(0, 0, D3DCLEAR_TARGET , D3DCOLOR_XRGB(0,0,255), 1.0f,0); g_pd3dDevice->BeginScene(); // Draw Texture. //0表示纹理层 g_pd3dDevice->SetTexture(0, g_pTexture); g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX)); g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX); g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); g_pd3dDevice->EndScene(); g_pd3dDevice->Present(0, 0, 0, 0); } return S_OK; }
本文档为【D3D学习笔记整理】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_266310
暂无简介~
格式:doc
大小:77KB
软件:Word
页数:10
分类:互联网
上传时间:2010-12-07
浏览量:28