搜档网
当前位置:搜档网 › Direct3D编程基础期末考试模拟试卷

Direct3D编程基础期末考试模拟试卷

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
#pragma once
#include

//windows扩展库函数的头文件
#include
//D3D的头文件
#include
#include

//引入D3D的库文件
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib")

//释放对象的宏
#define SAFE_DELETE(p) { if (p) { delete p; p = NULL;}}
//释放设备对象的宏
#define SAFE_RELEASE(p) { if (p) { p->Release();p = NULL;}}

//按键状态检测的宏
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)


程序段2
LPDIRECT3D9 m_pD3D; //Direct3D对象指针
LPDIRECT3DDEVICE9 m_pD3DDevice; //Direct3D的设备


程序段3
LPDIRECT3DVERTEXBUFFER9 m_pVB; //D3D顶点缓冲
LPDIRECT3DTEXTURE9 m_pTexture; //D3D纹理



程序段4
LRESULT CALLBACK //回调函数(自动调用的函数)
WinProc(HWND hWnd, //窗体的句柄
UINT message, //消息的类型
WPARAM wParam ,LPARAM lParam //消息的参数
)
{
switch(message)
{
case WM_DESTROY: //窗体关闭
PostQuitMessage(0); //程序结束
break;
case WM_KEYDOWN: //按键消息
switch(wParam)
{
case VK_ESCAPE: //当按下ESC键时候触发关闭窗口的消息
PostMessage(hWnd, WM_CLOSE,0,0);
break;
}
break;
}
return DefWindowProc(hWnd,message,wParam,lPara

m);
}


程序段5
//--创建D3D对象
m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
D3DDISPLAYMODE d3ddm; //--定义一个保存当前适配器属性的结构
//--获得当前适配器的显示模式
m_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);
//--设置传递给LPDIRECT3D9::CreateDevice的参数
D3DPRESENT_PARAMETERS d3dpp;
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
//定义用于观察世界坐标系转换的矩阵变量
D3DXMATRIX worldMatrix;
//生成平移矩阵
D3DXMatrixTranslation(&worldMatrix , 0.0f , 0.0f , 0.0f);
//世界坐标系转换矩阵生效
m_pD3DDevice->SetTransform(D3DTS_WORLD,&worldMatrix);

//定义用于定位虚拟摄像机的向量
D3DXVECTOR3 position(0.0f,0.0f,-2.0f); //摄像机位置
D3DXVECTOR3 targetPoint(0.0f,0.0f,-1.0f); //摄像机视口的位置
D3DXVECTOR3 upway(0.0f,1.0f,0.0f); //摄像机向上的方向
//定义用于观察坐标系转换的矩阵变量
D3DXMATRIX viewMatrix;
//根据摄像机位置生成矩阵的值
D3DXMatrixLookAtLH(&viewMatrix , &position , &targetPoint , &upway);
//让观察矩阵生效
m_pD3DDevice->SetTransform(D3DTS_VIEW,&viewMatrix);

//定义用于投影坐标系转换的矩阵变量
D3DXMATRIX projMatrix;
//根据参数生成矩阵的值
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的主函数
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,

LPSTR lpCmLine, int nCmdShow)
{
return 1;
}


程序段8
WNDCLASS wc; //定义窗口信息的结构体
//初始化窗体信息的结构
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); //注册窗口

HWND hWnd; //窗体句柄

int posx, posy;
posx = (GetSystemMetrics(SM_CXSCREEN)-800)/2; //屏幕宽度
posy = (GetSystemMetrics(SM_CYSCREEN)-600)/2; //屏幕高度

hWnd = CreateWindow(
"mywindow", //窗口类名必须和上面的窗体名称一模一样
"window tile", //窗口的标题
WS_OVERLAPPEDWINDOW, //窗口的风格
posx, //窗体左上角相对于屏幕的X坐标
posy, //窗体左上角相对于屏幕的Y坐标
800,600, //窗体的宽度和高度
NULL, //父窗口句柄
NULL, //窗口菜单句柄
hInstance, //实例句柄
NULL); //附加信息

ShowWindow(hWnd, SW_SHOWNORMAL); //正常显示窗口

//窗体的消息循环
MSG msg;
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
//定义四个顶点
TexVertex v[]=
{
{-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();

//读取纹理
D3DXCreateTextureFromFile(m_pD3DDevice,"pic/pic.jpg",&m_pTexture);

程序段10
//定义顶点结构体
struct TexVertex
{
float x,y,z; //顶点坐标
float u,v; //纹理坐标
};
//定义顶点格式说明的宏
#define TexVertexFVF D3DFVF_XYZ|D3DFVF_TEX1


程序段11
m_pD3DDevice->SetFVF(TexVertexFVF); //

设置顶点格式
//设置顶点来源
m_pD3DDevice->SetStreamSource(0
,m_pVB //顶点缓冲区
,0
,sizeof(TexVertex));//顶点格式大小
//设置纹理
m_pD3DDevice->SetTexture(0,m_pTexture);
//画图
m_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);


程序段12
//--将填充后台缓冲区置为黑色
m_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0),1.0f,0);
m_pD3DDevice->BeginScene(); //--开始通知显卡要进行渲染

//--中间将来是整个图形的绘制部分
m_pD3DDevice->EndScene(); //--结束图形的渲染
m_pD3DDevice->Present(NULL, NULL, NULL, NULL);//--翻页



附加题
将整个图形的绘制背景刷成蓝色

相关主题