《DirectX程序设计》复习资料
《DirectX程序设计》课程期末复习资料
第一章3D游戏开发的数学基础
本章包含的全部知识点:
l 点和向量
l 直线与平面
l 矩阵与坐标变换
l 坐标系
章节重点:
矩阵和坐标变换
第二章Windows编程基础
本章包含的全部知识点:
l 基本概念介绍
l Windows程序结构
l Win32程序开发实例
第三章 DirectX快速入门
本章包含的全部知识点:
l DirectX概述
l Direct3D 底层结构概述
l DirectX9.0的配置和安装
章节重点:
DirectX9.0的配置和安装
第四章 DirectX程序框架
本章包含的全部知识点:
l Win32+C+Direct3D的基础框架
l DXUT框架
章节重点:
Win32+C+Direct3D的基础框架
第三章 文本显示
本章包含的全部知识点:
l 文本绘制流程
l Win32程序框架实现
l DXUT程序框架实现
章节重点:
Win32程序框架实现
第六章 基本图形的绘制
本章包含的全部知识点:
l 图元
l 灵活顶点格式(FVF)
l 使用顶点缓存绘制图形
l 索引缓存
l 颜色表示法
l 渲染状态
l 绘制准备
l D3DX几何物体
l 实例设计与实现
章节重点:
顶点缓存
索引缓存
第七章 变 换
本章包含的全部知识点:
l 摄像机
l 顶点变换
l 光栅化
l 实例
章节重点:
顶点变换
第八章 3D数学基础补充
本章包含的全部知识点:
l 常见坐标系
l 向量
l 矩阵
l 线性变换
章节重点:
l 线性变换
第九章 光照和材质
本章包含的全部知识点:
l 真实感图形基本概念
l Direct3D中的光照
l Direct3D中的材质
l 光照和材质例子
章节重点:
Direct3D中的光照
Direct3D中的材质
第十章 纹理映射
本章包含的全部知识点:
l 纹理贴图
l 纹理坐标
l 纹理寻址模式
l 纹理过滤
l 纹理混合状态
l 纹理实例解析
章节重点:
纹理寻址模式
纹理过滤
第十一章 深度测试和反走样
本章包含的全部知识点:
l 深度缓存与深度测试
l 图形反走样
l 深度测试实例
章节重点:
深度缓存与深度测试
第十二章 网格(一)
本章包含的全部知识点:
l ID3DXMesh
l 子集和属性缓存
l 绘制
l 邻接信息
l 优化
l 属性表
l 创建一个Mesh
l 例子
章节重点:
子集和属性缓存
创建一个Mesh
第十三章 网格(二)
本章包含的全部知识点:
l X文件格式解析
l 读取X文件
l 渐进网格
l 渐进网格例子
章节重点:
深度缓存与深度测试
第十四章 混合和模板
本章包含的全部知识点:
l 混合因子
l 混合计算
l Alpha来源
l Alpha混合实例
l 模板
章节重点:
Alpha混合实例
第十五章 着色器入门
本章包含的全部知识点:
l 着色器概述
l HLSL的变量
l HLSL的函数
l HLSL基本语法
l 在Direct3D中使用HLSL
章节重点:
Alpha混合实例
第十六章 顶点着色器
本章包含的全部知识点:
l 顶点着色器概述
l 顶点声明
l 使用顶点着色器
l 顶点着色器实例
第十七章 像素着色器
本章包含的全部知识点:
l 像素着色器概述
l 使用像素着色器
l HLSL采样器对象
l 多重纹理
l 例子程序
一、客观部分:(单项选择、多项选择、不定项选择、判断)
(一)、选择部分
1. D3DPRESENT_PARAMETERS参数很多,关于其中参数之一windowed的理解正确的是( ABD )
A.取值FALSE则渲染全屏 B.取值TRUE则渲染窗口 C. int类型 D.BOOL类型 E.double类型
★考核知识点: D3DPRESENT_PARAMETERS
2. 以下属于Direct 3D定义的图元类型的有( ABCD )
A.点列表 B.线段条带 C.三角形列表 D.三角形条带 E.四边形列表
★考核知识点: 图元
3. 以下属于Direct 3D提供的着色模式的是( AB )
A.平面着色模式 B.高洛德法着色模式 C.渐变着色模式 D.单颜色着色模式
★考核知识点: 着色模式
4. 下面属于Direct3D提供的创建旋转矩阵的函数的是( ABC )
A. D3DXMatrixRotarionX B. D3DXMatrixRotarionY C. D3DXMatrixRotarionZ
D. D3DXMatrixRotX E. D3DXMatrixRotY
★考核知识点: 变换
1. 以下属于Direct3D提供的简化纹理过滤的过程的是( ABCD )
A.最近点采样 B.线性过滤 C.各向异性过滤 D.mipmap过滤
★考核知识点: 纹理过滤
2. D3DPRESENT_PARAMETERS参数很多,下面理解正确的是( ABCD )
A.Windowed取值FALSE则渲染全屏 B. BackBufferCount表示后备缓冲的数目
C. SwapEffect表示交换缓冲类型 D. BackBufferFormat表示后备缓冲的格式
★考核知识点: D3DPRESENT_PARAMETERS
3. 以下属于Direct3D中提供的标准光源的是( ABC )
A. 点光源 B. 方向光源 C. 聚焦光源 D.多点光源
★考核知识点: 光源
4. 关于灵活顶点格式下列说法正确的是( ABD )
A. D3DFVF_DIFFUSE表示顶点数据中包含的是漫反射颜色值;
B. D3DFVF_SPECULAR表示顶点数据中包含的是镜面反射下的颜色值
C. D3DFVF_XYZRHW表示顶点数据中包含的是未经过坐标变换的顶点坐标
D. D3DFVF_XYZ顶点数据中包含未经坐标变换的顶点坐标
考核知识点: 灵活顶点格式
解析:C项应该是经过坐标变换后的顶点坐标
5. 关于顶点Alpha描述正确的是( AB )
A. 如果在程序中直接指定每个顶点的颜色,直接给出每个顶点颜色的Alpha值。
B. 渲染对象中每个像素的Alpha值由该对象的Alpha值和着色模式决定。
C. 高洛德着色模式,所有像素的Alpha值都等于该多边形的第一个顶点的Alpha值。
D. 平面着色模式,每个多边形上的像素的Alpha值由它的各个顶点的Alpha值进行线性插值得到。
考核知识点: 顶点Alpha
解析:C项应该是平面着色模式,所有像素的Alpha值都等于该多边形的第一个顶点的Alpha值。D项应该是高洛德着色模式,每个多边形上的像素的Alpha值由它的各个顶点的Alpha值进行线性插值得到。
(二)、判断部分
1. Direct3D将给每个采样器对象连接一个唯一的纹理阶段(stage),在应用程序中找出与采样器对象相关联的阶段,并设置相应的纹理和采样器状态给该阶段。 ( 正确 )
★考核知识点: 纹理
2. 一个Direct3D对象只能创建一个Direct3D设备对象。 ( 错误 )
★考核知识点: Direct3D设备对象
考核知识点解释
一个Direct3D对象可以创建多个Direct3D设备对象。
3. 由于Direct3D设备对象是由Direct3D对象创建的,因此应先释放Direct3D设备对象。(正确)
★考核知识点: Direct3D对象及设备对象
4. D3DFVF_XYZ顶点数据中包含未经坐标变换的顶点坐标,不能与D3DFVF_XYZRHW同时使用。(正确)
★考核知识点: 灵活顶点格式
5. D3DFVF_XYZ顶点数据中包含未经坐标变换的顶点坐标,可以与D3DFVF_XYZRHW同时使用。(错误)
★考核知识点: 灵活顶点格式
考核知识点解释
D3DFVF_XYZ顶点数据中包含未经坐标变换的顶点坐标,不可以与D3DFVF_XYZRHW同时使用。
6. D3DFVF_XYZRHW顶点数据中包含经过坐标变换的顶点坐标,不能与D3DFVF_XYZ和D3DFVF_NORMAL同时使用。(正确)
★考核知识点: 灵活顶点格式
1. Direct3D创建的场景和对象都是由简单的“图元”按照一定的方式排列组合而成的,Direct3D中的所有图元都是一维或二维对象,包括单个的点和直线及复杂的多边形。(正确)
★考核知识点: 图元
2. 在索引缓存中定位顶点也就是在顶点缓存中定位顶点。(正确)
★考核知识点: 顶点缓存索引缓存
二、主观部分:
(一)、填空部分
1) 像素着色器的输入仅有颜色和纹理坐标两种语义。
考核知识点: 像素着色器
2) 像素着色器的工作是在顶点着色器之后,后者的输出将为前者提供输入。
考核知识点: 像素着色器
3) D3DFVF_DIFFUSE表示顶点数据中包含的是漫反射颜色值;
考核知识点: 灵活顶点格式
4) D3DFVF_SPECULAR表示顶点数据中包含的是镜面反射下的颜色值;
考核知识点: 灵活顶点格式
5) D3DFVF_XYZRHW表示顶点数据中包含的是经过坐标变换的顶点坐标
考核知识点: 灵活顶点格式
6) Direct3DCreate9函数创建一个Direct3D对象并获得指向Direct3D对象接口的指针,且参数必须设置为D3D_SDK_VERSION。
考核知识点: Direct3D对象
7) DXUT(The DirectX Utility Library)是建立在Direct3D9和Direct3D10上的一个程序框架,其目标是建立一个强大而容易使用的Direct3D游戏开发框架,它简化了Win32和Direct3D API的使用。
考核知识点: DXUT
8) 创建DirectX设备对象的函数为CreateDevice。
考核知识点: 设备对象
9) Direct3D图形程序通过调用IDirect3DDevice9::SetRenderState()函数来设置渲染状态。
考核知识点: 设置渲染状态
1) g_pd3dDevice->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_FLAT),这行代码完成的功能是( 设置着色模式为平面着色模式)。
考核知识点: 设置着色模式
2) g_pd3dDevice->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_GOURAUD),这行代码完成的功能是( 设置着色模式为高洛德着色模式)。
考核知识点: 设置着色模式
(二)、名词解释
1、请你给出创建顶点声明,并获得IDirect3DVertexDeclaration9接口指针的方法。
考核知识点: 顶点声明
考核知识点解释
HRESULT IDirect3DDevice9::CreateVertexDeclaration(
CONST D3DVERTEXELEMENT9* pVertexElements, //要创建的顶点声明
IDirect3DVertexDeclaration9** ppDecl //返回创建的IDirect3DVertexDeclaration9接 //口指针 );
2、请你给出环境光(ambient light)的概念,并说明如何设置渲染状态为整个场景添加环境光。
考核知识点: 环境光
考核知识点解释
环境光(ambient light)
由光源发出经环境多次散射而无法确定其方向的光,即好像是来自四面八方的光;室内成分大,室外成分少,没有位置或方向上的特征,只有颜色亮度值,不会衰减;
通过设置渲染状态为整个场景添加环境光:
g_device->SetRenderState(D3DRS_AMBIENT,D3DCOLOR_X#);
3、请你给出镜面反射光的概念,并说明如何设置渲染状态。
考核知识点: 镜面反射光
考核知识点解释
镜面光来自特定方向并被反射到特定方向;在默认状态下,Direct3D不对物体进行镜面反射计算,需设置相关的渲染状态:
g_device->SetRenderState(D3DRS_SPECULARENABLE,TRUE);
如果需要进行漫反射或镜面反射运算,那么在顶点缓冲器中必须包含顶点的法向量信息;
4、请给出设置像素着色器的函数原型及调用示例代码。
考核知识点: 像素着色器
考核知识点解释
HRESULT IDirect3DDevice9::SetPixelShader(
IDirect3DPixelShader9* pShader );
这个方法只接受一个参数,通过它传递一个我们要使用的指向像素着色器的指针。
示例代码如下:
Device->SetPixelShader(MultiTexPS);
5、销毁像素着色器接口函数原型
考核知识点: 像素着色器
考核知识点解释
d3d::Release
(MultiTexPS);
6、在Direct3D的一个场景中,最多可设置几个光源,设置函数形式。
考核知识点: 光源
考核知识点解释
最多可设置8个光源
HRESULT SetLight(DWORD Index,CONST D3DLight9 *pLight );
7、光照程序一般步骤。
考核知识点: 光照
考核知识点解释
(1) 创建光源、设置其位置及相关属性;SetLight函数将光源设置到渲染管道流水线中;LightEnable函数激活光源;
(2) SetRenderState打开渲染管道流水线的光照开关;
(3) 创建材质,设置物体的材质属性,SetMaterial设定材质;
8、请给出点列表图元的含义,并说明其应用。
考核知识点: 图元
考核知识点解释
点列表是一个对每点独立进行渲染的顶点集合。程序可以在3D场景中使用它模拟星空视野,或作为多边形表面的点化线。
9、请给出线段列表图元的含义,并说明其应用。
考核知识点: 图元
考核知识点解释
线段列表是一系列的独立线段,用于为3D场景加入冰雹或大雨等效果,线段列表中顶点的数量必须是大于等于2的偶数。
10、请给出线段条带图元的含义,并说明其应用。
考核知识点: 图元
考核知识点解释
线段条带是一个由相互链接的线段组合成的造型,程序可以用它产生不封闭的多边形;
11、请给出三角形列表图元的含义,并说明其应用。
考核知识点: 图元
考核知识点解释
三角形列表是一系列独立的三角形,它们之间可能靠的很近,也可能不是,顶点总数必须能被3整除;使用三角形列表建立一个由离散面片组成的物体;如建立力场墙的一种方法是指定一个由互相不相连的小三角形组成的大型列表;然后将一个可以发散光线的材质和纹理应用到这个三角形列表上
12、请给出三角形条带图元的含义,并说明其应用。
考核知识点: 图元
考核知识点解释
三角形条带是一连串相邻接的三角形。3D场景中大部分物体都是由三角条带组成的。
13、请给出三角形扇图元的含义,并说明其应用。
考核知识点: 图元
考核知识点解释
三角形扇和三角形条带类似,但其所有三角形共享一个顶点。3D场景中曲面的描述。
14、请给出Direct3D中设置渲染状态的函数原型,并解释其参数含义。
考核知识点: 渲染状态
考核知识点解释
Direct3D图形程序通过调用IDirect3DDevice9::SetRenderState()函数来设置渲染状态。枚举类型D3DRENDERSTATETYPE列举出所有可能的渲染状态;使用SetRenderState()设置:
HRESULT IDirect3DDevice9::SetRenderState(
D3DRENDERSTATETYPE State, //更改的渲染状态
DWORD Value ); //新的状态值
15、请你解释平面着色模式的含义。
考核知识点: 着色模式
考核知识点解释
Direct3D绘制流水线使用多边形第一个顶点的材质颜色作为整个多边形的颜色来渲染该多边形;如果多边形不共面,被平面着色方式渲染的三维物体在多边形之间将具有可视的清晰边缘;平面着色是最快的着色方式。
16、请你解释高洛德着模式的含义。
考核知识点: 着色模式
考核知识点解释
它使用顶点法线和光照参数为每个顶点计算颜色,然后穿越多边形的表面进行插值,插值以线性方式完成,高洛德着色使物体的表面看上去弯曲而平滑。
17、可编程管线渲染一个球体的步骤。
考核知识点: 着色模式
考核知识点解释
1)找到用于渲染该球体的VertexShader和PixelShader;
2)将参数传递给VertexShader,VertexShader的输出再传递给PixelShader;
3)绘制该球体;
18、请说明怎样对多级渐进纹理过滤器进行设置,并具体解释Filter的取值。
考核知识点: 多级渐进纹理过滤
考核知识点解释
Device->SetSamplerState(0,D3DSAMP_MIPFILTER,Filter);
D3DTEXF_NONE:禁用多级渐进纹理过滤;
D3DTEXF_POINT:就会只使用与图元大小最匹配的一级纹理;
D3DTEXF_LINEAR:Direct3D就将与图元大小最匹配的两级纹理以线性方式混合。
19、请你给出物体表面材质的定义方式,并解释每个参数的概念。
考核知识点: 材质
考核知识点解释
typedef strcut D3DMATERIAL9{
D3DCOLORVALUE Diffuse; //慢射光的反射属性
D3DCOLORVALUE Ambient; //环境光的反射属性
D3DCOLORVALUE Specular; //镜面光的反射属性
D3DCOLORVALUE Emissive; //自发光的反射属性
float Power; //镜面光的高光强度
}D3DMATERIAL9,*LPD3DMATERIAL9;
(三)、简答
1、着色器代码编译后,获得一个IDirect3DVertexShader9接口的指针,它代表一个顶点着色器,具体方法,及其调用过程。
考核知识点: 着色器
考核知识点解释
HRESULT IDirect3DDevice9::CreateVertexShader(
const DWORD* pFunction,
IDirect3DVertexShader9**ppShader );
其中,输入参数pFunction指向编译成功的着色器代码段,输出参数ppShader指向最终生成的顶点着色器。
假设变量shader是一个包含已编译的着色器代码的ID3DXBuffer指针,如果要获得一个IDirect3DVertexShader9接口,可以这样写:
IDirect3DVertexShader9* NewShader = 0;
hr=Device->CreateVertexShader( (DWORD*)shader->GetBufferPointer(),&NewShader);
2、如何测定像素着色器的支持。
考核知识点: 像素着色器
考核知识点解释
可用对SetDeviceCaps的调用来测定像素着色器的支持。
Caps结构包括一个叫做PixelShaderVersion的DWORD成员,其值对主版本号和子版本号进行编码,解释这个值的含义的最佳方法是用D3DPS_VERSION宏:
D3DCAPS8 Caps;
M_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&Caps);
If(Caps.PixelShaderVersion == D3DPS_VERSION(1,1))
{
If(Failed(EasyCreateWindowed(m_hWnd,D3DDEVTYPE_HAL,D3DCREATE_HAR DWARE_VERTEXPROCESSING)))
Return FALSE;
}
3、请给出D3DPRESENT_PARAMETERS的定义,并解释BackBufferFormat,SwapEffect,Windowed三个参数的含义。
考核知识点: D3DPRESENT_PARAMETERS
考核知识点解释
typedef struct _D3DPRESENT_PARAMETERS_
{
UINT BackBufferWidth; //全屏幕式后备缓冲的宽度
UINT BackBufferHeight; //全屏幕式后备缓冲的高度
D3DFORMAT BackBufferFormat; //后备缓冲的格式
UINT BackBufferCount; //后备缓冲的数目
D3DMULTISAMPLE_TYPE MultiSampleType; //全屏抗锯齿类型
DWORD MultiSampleQuality; //全屏抗锯齿质量等级
D3DSWAPEFFECT SwapEffect; //交换缓冲类型
HWND hDeviceWindow;
BOOL Windowed; //全屏或窗口
BOOL EnableAutoDepthStencil; //激活深度缓冲
D3DFORMAT AutoDepthStencilFormat; //深度缓冲格式
DWORD Flags;
UINT FullScreen_RefreshRateInHz; //显示器刷新率
UINT PresentationInterval; //图像最大刷新速度
} D3DPRESENT_PARAMETERS;
• BackBufferFormat——后备缓冲的格式,DX9只支持16位和32位的后备缓冲格式,如D3DFMT_R5G6B5表示后备缓冲的格式为每个像素16位,红色5位、绿色6位、蓝色5位,也可设置为D3DFMT_UNKNOWN,这时使用桌面的格式。
• SwapEffect——交换缓冲支持的效果类型,它是D3DSWAPEFFECT枚举类型,此处设定为D3DSWAPEFFECT_DISCARD,即后备缓存的内容被复制到屏幕上后,后备缓存的内容失效,可以丢弃。
• Windowed——如果为FALSE,表示渲染全屏,若为TRUE,则渲染窗口。
4、基于win32基本框架,绘制文本的函数原型及调用。
考核知识点: 绘制文本
考核知识点解释
在Render函数中通过DrawText函数控制文本显示,该函数是LPD3DXFONT类的成员函数,其函数原型如下:
INT DrawText(LPD3DXSPRITE pSprite,LPctstr pString,INT Count,LPRECT pRect,DWORD Format,D3DCOLOR Color);
此处的调用为:g_pFont->DrawText(NULL, strText,-1, &clientRect, DT_SINGLELINE|DT_NOCLIP|DT_CENTER|DT_VCENTER, 0xffffffff );
5、顶点缓存中的顶点可以包含顶点坐标、颜色、法线方向、纹理坐标等属性,具体包含哪些属性,可以使用灵活顶点格式(Flexible Vertex Format,FVF)进行描述;请解释下面部分FVF描述符:
D3DFVF_DIFFUSE, D3DFVF_NORMAL,D3DFVF_XYZ,D3DFVF_XYZRHW,D3DFVF_SPECULAR.
考核知识点: 灵活顶点格式
考核知识点解释
D3DFVF_DIFFUSE:顶点数据中包含漫反射颜色值;
D3DFVF_NORMAL:顶点数据中包含法线向量,不能和D3DFVF_XYZRHW同时使用;
D3DFVF_XYZ:顶点数据中包含未经坐标变换的顶点坐标,不能与D3DFVF_XYZRHW同时使用;
D3DFVF_XYZRHW:顶点数据中包含经过坐标变换的顶点坐标,不能与D3DFVF_XYZ和D3DFVF_NORMAL同时使用;
D3DFVF_PSIZE:顶点信息指明绘制点的大小;
D3DFVF_SPECULAR:顶点数据中镜面反射效果下的颜色值;
6、请给出创建顶点缓存的函数原型,并解释其参数含义。
考核知识点: 顶点缓存
考核知识点解释
创建顶点缓存的函数IDirect3DDevice9::CreateVertexBuffer()声明如下:
HRESULT IDirect3DDevice9::CreateVertexBuffer(
UINT Length, //分配给缓存的字节大小;
DWORD Usage, //指定关于怎样使用缓存的额外信息;
DWORD FVF, //存储在缓存中的灵活顶点格式;
D3DPOOL Pool, //缓存放置在哪一个内存池中;
IDirect3DVertexBuffer9 ** ppVertexBuffer,//返回创建好的顶点缓存的指针;
HANDLE* pSharedHandle ); //没有使用;设置为0;
7、访问顶点缓存数据时需要对其访问区域加锁,请给出加锁函数原型并解释其参数含义。
考核知识点: 顶点缓存访问
考核知识点解释
HRESULT IDirect3DVertexBuffer9::Lock(
UINT OffsetToLock,//偏移量,以字节为单位,从缓存开始位置到锁定开始位置的距离
UINT SizeToLock, //锁定的字节数
BYTE** ppbDate, //返回的指向锁定内存开始位置的指针
DWORD Flags ); //标记描述如何锁定内存
8、请给出创建索引缓存的函数原型,并解释其参数含义。
考核知识点: 索引缓存
考核知识点解释
创建索引缓存的函数如下:
HRESULT IDirect3DDevice9::CreateIndexBuffer(
UINT Length, //分配给缓存的字节大小;
DWORD Usage, //指定关于怎样使用缓存的额外信息;
D3DFORMAT Format, //指定索引大小,使用D3DFMT_INDEX16为16位索引, //D3DFMT_INDEX32为32位索引,但并非所有设备都支持32位索引
D3DPOOL Pool,
IDirect3DIndexBuffer9** ppIndexBuffer, //返回创建好的索引缓存的指针
HANDLE* pSharedHandle );
9、请给出使用带有索引缓存的模型绘制的函数原型,并解释其参数含义。
考核知识点: 索引缓存
考核知识点解释
使用函数IDirect3DDevice9::DrawIndexedPrimitive绘制带索引模型:
HRESULT IDirect3DDevice9::DrawIndexedPrimitive(
D3DPRIMITIVETYPE Type, //要绘制的图元类型
INT BaseVertexIndex, //为索引增加一个基数,用顶点数目度量
UINT MinIndex, //允许被引用的最小索引值
UINT NumVertices, //本次调用中将被引用的顶点总数
UINT StartIndex, //索引缓存中的某个位置,表示开始渲染的开始索引点
UINT PrimitiveCount ); //绘制图元总数
10、创建一个ID3DXMesh对象,然后从X文件中读取集合信息数据填入到这个对象中。 请给出读取函数的定义 ,及相关参数的含义。
考核知识点: ID3DXMesh对象
考核知识点解释
HRESULT D3DXLoadMeshFromX(
LPCSTR pFilename, //X 文件名
DWORD Options, //创建标志
LPDIRECT3DDEVICE9 pDevice, //与创建Mesh有关的设备
LPD3DXBUFFER* ppAdjacency, //返回包含DWORD的ID3DXBuffer类型 //的指针,描述Mesh的邻接信息
LPD3DXBUFFER* ppMaterials, //返回包含D3DXMATERIAL结构的数组 //的ID3DXBuffer指针,存储了Mesh的材质数据
LPD3DXBUFFER* ppEffectInstances, //返回一个包含D3DXEFFECTINSTANCE结 //构的数组的ID3DXBuffer类型指针
PDWORD pNumMaterials, //返回Mesh的材质数
LPD3DXMESH * ppMesh //返回填充了X文件几何信息的ID3DXMesh对象
);
(五)、程序题
1、 下面是Alpha纹理实例程序片段,请将程序补充完整。
考核知识点: Alpha纹理
示例程序及答案
HRESULT InitializeD3D( HWND hWnd)
{
//省略部分代码
g_pd3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
//启用Alpha混合
g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE ,true);
//设置源混合因子
g_pd3dDevice->SetRenderState( D3DRS_SRCBLEND ,D3DBLEND_SRCALPHA);
//设置目标混合因子
g_pd3dDevice->SetRenderState( D3DRS_DESTBLEND ,D3DBLEND_INVSRCALPHA);
g_pd3dDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
g_pd3dDevice->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
g_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE);
g_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
g_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_DIFFUSE);
//设置纹理过滤方式
g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER ,D3DTEXF_POINT);
//省略部分代码
}
2、下面是移动线框正方体的程序片段,完成设置观察矩阵及投影矩阵的片段,请将程序补充完整。
考核知识点: 变换
示例程序及答案
// Position and aim the camera.
D3DXVECTOR3 position(0.0f, 0.0f, -5.0f);
D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
D3DXMATRIX V;
D3DXMatrixLookAtLH(&V, &position , &target, &up );
Device->SetTransform(D3DTS_VIEW, &V );
// Set the projection matrix.
D3DXMATRIX proj;
D3DXMatrixPerspectiveFovLH(
&proj,
D3DX_PI * 0.5f,
(float)Width / (float)Height,
1.0f,
1000.0f);
Device->SetTransform( D3DTS_PROJECTION , &proj );
3、下面是模拟箱子挡住茶壶,进行深度测试的程序片段,请将程序补充完整。
考核知识点: 深度测试
示例程序及答案
bool Setup()
{
//此处省略部分代码
// 设置 Texture Filter States.
Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
//激活深度测试、设置深度测试函数
Device->SetRenderState( D3DRS_ZENABLE ,TRUE);
Device->SetRenderState( D3DRS_ZFUNC ,D3DCMP_LESS);
//此处省略部分代码
}
LRESULT WINAPI MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch ( msg )
{
case WM_KEYUP:
switch (wParam)
{
//此处省略部分代码
case VK_ESCAPE:
{
Cleanup();
PostQuitMessage(0);
}
break;
case 49://开启深度测试
g_pd3dDevice->SetRenderState( D3DRS_ZENABLE ,TRUE);
break;
case 50://关闭深度测试
g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, FALSE );
break;
}
break;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}
4、下面是一程序片段,实现从”Tiger.x”文件中读取Mesh相关信息。请将程序补充完整。
考核知识点: X文件
示例程序及答案
HRESULT InitGeometry()
{
LPD3DXBUFFER pD3DXMtrlBuffer;
if( FAILED( D3DXLoadMeshFromX( "Tiger.x",
D3DXMESH_SYSTEMMEM,
g_pd3dDevice ,
NULL,
&pD3DXMtrlBuffer,
NULL,
&g_dwNumMaterials,
&g_pMesh ) ) )
{
if( FAILED( D3DXLoadMeshFromX( "..\Tiger.x", D3DXMESH_SYSTEMMEM,
g_pd3dDevice, NULL,
&pD3DXMtrlBuffer, NULL, &g_dwNumMaterials,
&g_pMesh ) ) )
{
MessageBox(NULL, "Could not find tiger.x", "Meshes.exe", MB_OK);
return E_FAIL;
}
}
D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*) pD3DXMtrlBuffer ->GetBufferPointer();
g_pMeshMaterials = new D3DMATERIAL9[ g_dwNumMaterials ];
if( g_pMeshMaterials == NULL )
return E_OUTOFMEMORY;
g_pMeshTextures = new LPDIRECT3DTEXTURE9[g_dwNumMaterials];
if( g_pMeshTextures == NULL )
return E_OUTOFMEMORY;
for( DWORD i=0; i< g_dwNumMaterials ; i++ )
{
g_pMeshMaterials[i] = d3dxMaterials[i].MatD3D;
g_pMeshMaterials[i].Ambient = g_pMeshMaterials[i].Diffuse;
g_pMeshTextures[i] = NULL;
if( d3dxMaterials[i].pTextureFilename != NULL &&
lstrlen(d3dxMaterials[i].pTextureFilename) > 0 )
{
if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice,
d3dxMaterials[i].pTextureFilename,
&g_pMeshTextures[i] ) ) )
{
const TCHAR* strPrefix = TEXT("..\");
TCHAR strTexture[MAX_PATH];
StringCchCopy( strTexture, MAX_PATH, strPrefix );
StringCchCat( strTexture, MAX_PATH, d3dxMaterials[i].pTextureFilename );
if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice,
strTexture,
&g_pMeshTextures[i] ) ) )
{
MessageBox(NULL, "Could not find texture map", "Meshes.exe", MB_OK);
}
}
}
}
pD3DXMtrlBuffer->Release();
return S_OK;
}