考点归纳gogoda的专栏Word文件下载.docx
《考点归纳gogoda的专栏Word文件下载.docx》由会员分享,可在线阅读,更多相关《考点归纳gogoda的专栏Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
5向量和矩阵的计算操作
6简化图像文件的加载和纹理的创建
7绘制简单的形状、精灵和立方体贴图(cubemap)。
DirectX8提供的新的功能:
1、蒙皮网格(skinnedmesh)
2、多分辨率的细节级别(Level-Of-Detail,LOD)几何体
3、.X文件的高阶表面数据(higher-ordersurfacedata)支持
4、N-patches(可以在图形卡的帮助下提高模型的精度,即传入一个低精度多边形模型数据,完成镶嵌操作(加入更多的多边形))
DirectX8.0支持的shader:
顶点shader标准vs_1_1和像素shader标准ps_1_1DirectX8.1支持的shader:
像素shader标准ps_1_2、ps_1_3、ps_1_4DirectX9支持的shader:
像素shader标准ps_2_0、ps_2_x、ps_2_a、ps_3_0DirectX9引入了:
HLSL(High-LevelShaderLanguage)
剪裁测试(scissortest)
行抗锯齿(lineanti-aliasing)
球形映射texgen
双面模板(two-sidedstencil),允许给封闭几何体添加阴影体(shadowvolume)
多重渲染目标(multiplerendertarget)的渲染能力(G-buffer)
多重元素纹理(multi-elementtexture)
位移贴图(displacementmap)
24位颜色精度支持
根据监视器gamma支持来改变gamma值
片断颜色(fragmentcolor)-剪裁测试-alpha测试
第02章HAL和COM概述
HAL(HardwareAbstractionLayer,硬件抽象层)
HAL和COM技术使Direct3D能在不同硬件上发挥最快速度的同时,具有一个通用的接口和向后兼容的能力:
1具备一致的API才有生存力
2若硬件不支持Direct3D所要求的一些特性,应有一种相对低效的机制来保证程序能继续运行
3接口的变革应尽可能降低程序员学习新接口难度
所有使用早期DirectX版本开发的游戏都保证能在将来的DirectX版本下运行
游戏根据HAL所提供的特性来开启或关闭相应的特征,过程如下:
1游戏检查HAL的能力;
2游戏适当地开启或关闭某些特征;
3若某些特征被关闭,便会以一种低效的方法来实现,可能是模拟某个特征。
这通常会导致图像质量降低。
Dircet3D使用HAL通过DDI(DeviceDriverInterface,设备驱动接口)来访问图形硬件。
要检查DDI的版本,可运行DirectXDiagnosticTool(DirectX诊断工具)
HAL支持硬件加速的光栅化、硬/软件顶点处理。
HAL有4种不同的顶点处理方法:
SWVP(软件顶点处理D3DCREATE_SOFTWARE_VERTEXPROCESSING)
MixedVP(混合顶点处理D3DCREATE_MIXED_VERTEXPROCESSING)
HWVP(硬件顶点处理D3DCREATE_HARDWARE_VERTEXPROCESSING)
PureVP(纯顶点处理D3DCREATE_PURE_DEVICE)
注册一个插件式软件设备的函数是:
IDirect3D9:
RegisterSoftwareDeviceCOM的优点:
1、COM接口永远不会改变(永远无法通过任何方式修改);
2、COM是独立于语言的(language-independent);
3、只能访问一个COM组件的方法,而不是它的数据。
COM是一种基于二进制(binary-based)的编程模型
使用顶点着色器的步骤
1.编写和编译顶点着色器
2.创建一个IDircet3DVertexShader接口来代表基于编译过后的着色器代码的着色器
3.用IDirect3DDevice9:
SetVertextShader方法开启这个顶点着色器
第03章编程约定
为了编译DirectX程序,必须导入下列程序库:
1、d3dx9.lib2、d3dxof.lib3、d3d9.lib4、winmm.lib5、dxguid.lib
注意点:
1、Direct3D运行时COM对象和DLL必须由Windows注册和加载。
DirectX安装程序会为你做这件事;
2、必须在Windows项目中包含先前提及的库,才能正确链接到所调用的包装方法;
3、必须在源文件和IDE的包含路径条目表格中都包含正确的头文件。
LPDIRECT3D9:
IDirect3D9接口指针
Direct3DCreate9():
创建一个IDirect3D9的COM对象,并从中获取一个接口指针
命名约定中的前缀和类型:
P19OutputDebugString()函数是一个调试辅助函数,可以在程序运行期间将调试信息输出到IDE的调试窗口中。
DirectX9.0SDK提供的宏SUCCEEDED()和FAILED()可以简化检查返回码的工作。
并不是所有方法都会在成功后返回S_OK,所以不要试图将HRESULT与S_OK进行比较判断。
若没有什么需要做的,一个函数可能会返回S_FALSE来表示它什么都没做。
第04章3D基础、Gouraud着色、纹理映射基础
在默认情况下,Direct3D引擎使用左手坐标系。
x:
宽度,y:
高度,z:
深度
创建一个顶点结构,包含位置、漫反射、法线、顶点坐标信息:
typedefStruct
{
D3DVECTOR3vPosition;
//位置
DWORDdwDidiffuse;
//漫反射
D3DVECTOR3vNormal;
//法线
FLOATu,v;
//纹理坐标
}MYVERTEX;
创建一个顶点结构,包含位置、纹理、法线信息:
typedefStructVertex
D3DVECTOR3vTexture;
//纹理
描述一个物体的朝向需要至少4个向量(LOOK、UP、RIGHT、POSITION):
LOOK:
定义了物体所指的方向;
若要飞机横滚(roll),则需将其绕着LOOK向量旋转
UP:
表示那个方向对于物体来说是"
上"
或"
下"
;
若要改变飞机所面对的方向(yaw:
航向、偏航),则需将其绕着UP向量旋转
RIGHT:
定义物体右侧指向;
若要改变飞机的俯仰度(pitch),则需将其绕着RIGHT向量旋转
POSITION:
定义物体的位置;
要使物体沿着LOOK向量方向移动,则需改变POSITION向量。
任何3D物体都是由面构成。
所有模型和3D世界都可被分解为:
点、线和三角形。
一个由若干三角形构成的物体称为:
网格(mesh)。
注意:
Direct3D会剔除背面。
这种背面剔除(BackfaceCulling)特性可删除所有背对着观看者或照相机的三角形,即那些在默认情况下按逆时针次序的顶点构成的三角形。
平均而言,在任何特定时刻,游戏世界中的一半三角形是背对着照相机的,因此利用该特性有助于缩短渲染时间。
根据要渲染的对象不同,有时可以用D3DCULL_NONE标志来关闭背面剔除。
为了进行背面剔除,需要计算一个三角形两条边的夹积,夹积结果是一个平面(由三角形的那两条边构成)垂直的向量,该向量就是平面的面法线,它的方向决定了这个三角形是面朝照相机的还是背向照相机的。
多边形:
指至少由3个顶点定义的n边封闭形状。
最简单的多边形就是三角形。
法线是垂直于面的向量,可用于定义一个面的朝向或可见侧。
顶点法线垂直于一个面,并且位于顶点之上,具有一个单位的长度,顶点法线被用于Gouraud着色。
面法线垂直于面,并且位于面的中央。
面法线经常被用于Flat着色。
着色是进行光照计算并根据计算结果确定像素颜色的过程。
这些像素颜色稍后将用于在屏幕上表示物体(更专业地说,着色是光栅器对像素进行上色的方法)。
Flat着色是对每一个面进行着色,也就意味着将使用位于三角形中央的面法线来计算光照。
Gouraud着色用顶点法线计算,效果更光滑,这是因为顶点法线的方向随着顶点的不同而不同。
Gouraud着色是Direct3D中的默认模式。
纹理坐标空间中,u表示水平方向,v表示垂直方向。
一个典型的顶点结构,由位置向量、RHW(ReciprocalofHomogeneousW,齐次W的倒数)、纹理的tu、tv坐标组成。
StructVertex
FLOATx,y,z,rhw;
//2D顶点坐标
FLOATtu,tv;
}
第05章基础
CD3DApplicationConfirmDevice()方法是最先被执行的,它用于检查显卡的能力。
以下代码的作用?
答:
用于检查显卡是否支持1.1版的顶点shader。
HRESULTCMyD3DApplication:
ConfirmDevice
(
D3DCAPS9*pCaps,//
DWORDdwBehavior,//
D3DFORMATadapterFormat,//
D3DFORMATbackBufferFormat//同显示的像素格式
)
//检查硬件是否支持顶点shaderIf((dwBehavior&
D3DCREATE_HARDWARE_VERTEXPROCESSING)||(dwBehavior&
D3DCREATE_MIXED_VERTEXPROCESSING))
//如果不支持,则采用软件顶点shaderIf(pCaps-VertexShaderVersionD3DVS_VERSION(1,1))
returnE_FAIL;
//一个错误返回值
returnS_OK;
//返回OK状态
调用顺序:
1、ConfirmDevice()
2、OneTimeSceneInit()一次性永久初始化,完成任何一次性的资源分配
3、InitDeviceObjects()
4、RestoreDeviceObjects()
在应用程序运行期间,会循环执行以下函数:
FrameMove()用于容纳所有动画相关的代码,包括更新矩阵、纹理坐标、对象坐标以及其他一些根据时间而变化的行为。
Render()作为3D渲染的入口点在渲染每一帧时被调用
以上2个函数时每个框架应用程序的主循环。
FinalCleanup()用于销毁为几何数据分配的内存、删除文件对象等。
用户改变窗口大小时,框架将会调用:
InvalidateDeviceObjects():
当游戏关闭、或用户改变窗口大小、或改变设备,都将调用它。
RestoreDeviceObjects()重新创建InvalidateDeviceObject