Direct3D编程基础期末考试模拟试卷1.新建一个Win32的项目,在项目中添加一个.h文件,在头文件中包含所需要的头文件和库文件。(5分)2.在项目中添加一个cpp文件,cpp文件首先要包含上一步的.h文件,然后在cpp文件中添加一个Win32的主函数。(5分)3.在主函数中创建一个窗体,并显示窗体的消息循环和消息处理函数。(5分)4.修改相应的项目属性设置,能够成功运行并显示窗体。(5分)5.定义用于Direct3D渲染的对象和设备,并实现创建它们。(10分)6.在消息循环的中实现Direct3D渲染。(5分)7.定义Direct3D的顶点结构体和格式。(5分)8.定义用于保存顶点数据的顶点缓冲区和纹理对象,并初始化它们。(10分)9.实现顶点和纹理的渲染。(5分)10.定义矩阵实现本地坐标到世界坐标系转换,再到观察坐标系转换,最后实现投影转换。(15分)以上流程代码从文档下方的程序段1-12中复制。11.修改顶点坐标设计出如下一个形状:(5分)12.将给定triangle.jpg图片中的纹理贴到到三个面上。(5分)13.使用如下给定函数,实现该形状沿Z轴不停的旋转,并且在旋转过程中能够慢慢缩小,当缩小到原来大小1/2时,再慢慢放大到原来大小,如此重复缩放。(20分)D3DXMatrixRotationZ//沿Z轴旋转D3DXMatrixScaling//缩放矩阵14.最终程序可以运行,并达到题目要求。(10分)提供如下程序段:程序段1#pragmaonce#includewindows.h//windows扩展库函数的头文件#includewindowsx.h//D3D的头文件#included3d9.h#included3dx9.h//引入D3D的库文件#pragmacomment(lib,d3d9.lib)#pragmacomment(lib,d3dx9.lib)#pragmacomment(lib,winmm.lib)//释放对象的宏#defineSAFE_DELETE(p){if(p){deletep;p=NULL;}}//释放设备对象的宏#defineSAFE_RELEASE(p){if(p){p-Release();p=NULL;}}//按键状态检测的宏#defineKEYDOWN(vk_code)((GetAsyncKeyState(vk_code)&0x8000)?1:0)#defineKEYUP(vk_code)((GetAsyncKeyState(vk_code)&0x8000)?0:1)程序段2LPDIRECT3D9m_pD3D;//Direct3D对象指针LPDIRECT3DDEVICE9m_pD3DDevice;//Direct3D的设备程序段3LPDIRECT3DVERTEXBUFFER9m_pVB;//D3D顶点缓冲LPDIRECT3DTEXTURE9m_pTexture;//D3D纹理程序段4LRESULTCALLBACK//回调函数(自动调用的函数)WinProc(HWNDhWnd,//窗体的句柄UINTmessage,//消息的类型WPARAMwParam,LPARAMlParam//消息的参数){switch(message){caseWM_DESTROY://窗体关闭PostQuitMessage(0);//程序结束break;caseWM_KEYDOWN://按键消息switch(wParam){caseVK_ESCAPE://当按下ESC键时候触发关闭窗口的消息PostMessage(hWnd,WM_CLOSE,0,0);break;}break;}returnDefWindowProc(hWnd,message,wParam,lParam);}程序段5//--创建D3D对象m_pD3D=Direct3DCreate9(D3D_SDK_VERSION);D3DDISPLAYMODEd3ddm;//--定义一个保存当前适配器属性的结构//--获得当前适配器的显示模式m_pD3D-GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm);//--设置传递给LPDIRECT3D9::CreateDevice的参数D3DPRESENT_PARAMETERSd3dpp;ZeroMemory(&d3dpp,sizeof(d3dpp));//--把结构体清空//d3dpp.Windowed=FALSE;//--指明不是窗口模式,而是全局独占模式d3dpp.Windowed=TRUE;d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;//--设定换页效果为丢弃后台缓存d3dpp.BackBufferFormat=d3ddm.Format;//--色彩深度为桌面的色彩深度d3dpp.BackBufferWidth=d3ddm.Width;//--后缓冲宽度d3dpp.BackBufferHeight=d3ddm.Height;//--后缓冲高度d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;//--屏幕刷新率d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_ONE;//--翻转模式d3dpp.AutoDepthStencilFormat=D3DFMT_D16;d3dpp.EnableAutoDepthStencil=true;m_pD3D-CreateDevice(D3DADAPTER_DEFAULT,//--使用当前显卡作注设备D3DDEVTYPE_HAL,//--硬件抽象层设备hWnd,//--窗体句柄D3DCREATE_SOFTWARE_VERTEXPROCESSING,//--用软件的方法处理//--顶点数据参数若为D3DCREATE_HARDWARE_VERTEXPROCESSING则使用硬件&d3dpp,&m_pD3DDevice);程序段6//定义用于观察世界坐标系转换的矩阵变量D3DXMATRIXworldMatrix;//生成平移矩阵D3DXMatrixTranslation(&worldMatrix,0.0f,0.0f,0.0f);//世界坐标系转换矩阵生效m_pD3DDevice-SetTransform(D3DTS_WORLD,&worldMatrix);//定义用于定位虚拟摄像机的向量D3DXVECTOR3position(0.0f,0.0f,-2.0f);//摄像机位置D3DXVECTOR3targetPoint(0.0f,0.0f,-1.0f);//摄像机视口的位置D3DXVECTOR3upway(0.0f,1.0f,0.0f);//摄像机向上的方向//定义用于观察坐标系转换的矩阵变量D3DXMATRIXviewMatrix;//根据摄像机位置生成矩阵的值D3DXMatrixLookAtLH(&viewMatrix,&position,&targetPoint,&upway);//让观察矩阵生效m_pD3DDevice-SetTransform(D3DTS_VIEW,&viewMatrix);//定义用于投影坐标系转换的矩阵变量D3DXMATRIXprojMatrix;//根据参数生成矩阵的值D3DXMatrixPerspectiveFovLH(&projMatrix,//生成的投影矩阵D3DX_PI*0.25f,//视角的弧度800.0f/600.0f,//屏幕的宽高比例0.1f,//要投影的最近距离1000.0f);//要投影的最远距离//让投影矩阵生效m_pD3DDevice-SetTransform(D3DTS_PROJECTION,&projMatrix);//投影矩阵生效//关闭灯光m_pD3DDevice-SetRenderState(D3DRS_LIGHTING,FALSE);//关闭背景消隐m_pD3DDevice-SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);程序段7//win32的主函数intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmLine,intnCmdShow){return1;}程序段8WNDCLASSwc;//定义窗口信息的结构体//初始化窗体信息的结构wc.cbClsExtra=0;//附加内存空间wc.cbWndExtra=0;//附加内存空间wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//背景刷wc.hCursor=NULL;//设置窗口鼠标的形状wc.hIcon=NULL;//窗口的图标wc.hInstance=hInstance;//窗口的实例化句柄//wc.lpfnWndProc=DefWindowProc;//默认的消息处理函数wc.lpfnWndProc=WinProc;wc.lpszClassName=mywindow;//窗口名称(它的名称必须和下面的窗口类名一模一样)wc.lpszMenuName=NULL;//窗口菜单wc.style=CS_HREDRAW|CS_VREDRAW;//支持水平和垂直重绘RegisterClass(&wc);//注册窗口HWNDhWnd;//窗体句柄intposx,posy;posx=(GetSystemMetrics(SM_CXSCREEN)-800)/2;//屏幕宽度posy=(GetSystemMetrics(SM_CYSCREEN)-600)/2;//屏幕高度hWnd=CreateWindow(mywindow,//窗口类名必须和上面的窗体名称一模一样windowtile,//窗口的标题WS_OVERLAPPEDWINDOW,//窗口的风格posx,//窗体左上角相对于屏幕的X坐标posy,//窗体左上角相对于屏幕的Y坐标800,600,//窗体的宽度和高度NULL,//父窗口句柄NULL,//窗口菜单句柄hInstance,//实例句柄NULL);//附加信息ShowWindow(hWnd,SW_SHOWNORMAL);//正常显示窗口//窗体的消息循环MSGmsg;while(true){if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))//接收系统信息(&msg为MSG类型的信息结构体,NULL是窗口句柄,//0,是表示接受所有窗口的消息){if(msg.message==WM_QUIT)break;TranslateMessage(&msg);//把键盘等码转换为系统识别的虚拟键码信息DispatchMessage(&msg);//转到消息的回调函数处理消息}}程序段9//定义四个顶点TexVertexv[]={{-0.5f,0.5f,0.0f,0.0f,0.0f},{0.5f,0.5f,0.0f,1.0f,0.0f},{-0.5f,-0.5f,0.0f,0.0f,1.0f},{0.5f,-0.5f,0.0f,1.0f,1.0f},};//创建顶点缓冲区m_pD3DDevice-CreateVertexBuffer(sizeof(v)////缓冲区大小,D3DUSAGE_WRITEONLY//使用标志,TexVertexFVF//顶点格式,D3DPOOL_MANAGED//内存管理方式,&m_pVB//顶点缓冲区,0);//将顶点数据存入顶点缓冲区中TexVertex*pTemp;//锁定顶点m_pVB-Lock(0,0,(void**)&pTemp,0);//复制数据memcpy(pTemp,v,sizeof(v));//解锁m_pVB-Unlock();//读取纹理D3DXCreateTextureFromF