1.D3D基本框架.1
创建D3D对象..... 2
获取显卡显示模式.. 2
创建D3D设备接口..2
开始渲染和结束渲染.2
清空图形绘制区.... 2
屏幕反转... 2
2.绘制基本图形.1
绘制基本图形 ....4
灵活定点格式(FVF) 2
基本图元的绘制.....2
创建顶点缓冲区.....2
基本图元的绘制.....2
保存顶点....2
设置渲染状态.2
图形绘制....2
索引缓冲. 4
顶点设置. 2
创建索引缓冲区... 2
保存顶点索引值... 2
索引图形绘制.....2
D3D中的图形学... 4
D3D中的向量.....2
D3D中的矩阵.....2
D3D中的平面.....2
2
----------------------- Page 3-----------------------
D3D中的射线..... 2
D3D中的图形变换...2
3.纹理 4
从磁盘文件获取纹理..2
设置当前要渲染的纹理2
设置纹理的渲染状态. 2
设置纹理采样属性.. 2
从一张纹理图形中生成多级纹理.2
包装纹理寻址.2
镜像纹理寻址.2
夹取纹理寻址.2
边框颜色纹理寻址... 2
一次镜像纹理寻址... 2
纹理包装....2
4.光照.4
D3D光照的基本实现.4
顶点格式. 2
设置物体材质.....2
添加光源. 2
激活光照运算.....2
5.摄像机 .....4
生成视图变换矩阵... 2
生成投影变换矩阵... 2
6.模型基础... 4
ID3DXMesh接口基础.2
ID3DXMesh接口相关.2
应用.X文件..2
7.游戏中的基本特效 .. 4
3
----------------------- Page 4-----------------------
检查硬件支持的深度缓冲区格式.2
激活深度测试.....2
设置深度缓冲区更新.2
设置深度测试函数.. 2
激活Alpha混合...2
设置Alpha混合计算方式....2
设置Alpha混合系数 2
激活Alpha测试...2
设置Alpha测试参考值.....2
设置Alpha测试函数 2
多边形填充模式... 2
查询设备是否支持多重采样... 2
启用多重采样的全景图形反锯齿.2
设置多纹理混合方式.2
激活雾化. 2
设置雾化计算方式.. 2
设置雾的颜色.....2
设置雾的起始范围.. 2
指数雾化浓度.....2
基于发散的雾化... 2
创建2D字体.....2
绘制字体. 2
4
----------------------- Page 5-----------------------
创建3D文字网格... 2
8. ... 4
88..游戏控制 44
... DirectInput实现键盘控制
.
2
... DirectInput实现鼠标控制
.
2
.鼠标键选
..
2
9.游戏音乐音效.4
5
----------------------- Page 6-----------------------
D3D
DD33DD基本框架
D3D
创建DD33DD对象:
Direct3DCreate9(D3D_SDK_VERSION)
=================================================================
==============
DirectX
=================================================================
==============
获取显卡显示模式:
HRESULT GetAdapterDisplayMode(
UINT Adapter, //指定显示卡序列号
D3DDISPLAYMODE *pMode //存储显示模式的指针
);
=================================================================
==============
DirectX
=================================================================
==============
D3D
创建DD33DD 设备接口:
HRESULT CreateDevice(
UINT Adapter, //显卡序列号
D3DDEVTYPE DeviceType, //D3D设备类型
HWND hFocusWindow, //所属窗口句柄
DWORD BehaviorFlags, //设备进行3D运算
方式
D3DPRESENT_PARAMETERS *pPresentationParameters, //用于存储D3D设
备相关信息的指针
IDirect3DDevice9 ** ppReturnedDeviceInterface //返回
D3D设备接口指针的地址
);
第二个参数DeviceType取值:
D3DDEVTYPE_HAL //硬件抽象层,通过显示硬件来完成图形渲染工作
D3DDEVTYPE_REF //参考光栅器,一般用于测试显卡不支持的
D3D功能
D3DDEVTYPE_SW //用于支持第三方软件
第四个参数BehaviorFlags取值:
D3DCREATE_SOFTWARE_VERTEXPROCESSING //由D3D软件进行顶点运算(常用)
D3DCREATE_FPU_PRESERVE //激活双精度浮点运算或浮点运算异常
检测,设置该项会降低系统性能
D3DCREATE_MULTITHREADED //保证D3D是多线程安全的,设置该项
会降低系统性能
6
----------------------- Page 7-----------------------
D3DCREATE_MIXED_VERTEXPROCESSING //由混合方式进行顶点运算
D3DCREATE_HARDWARE_VERTEXPROCESSING //由D3D硬件进行顶点运算
D3DCREATE_PUREDEVICE //禁用D3D的Get*()函数,禁止D3D
使用虚拟设备模拟顶点运算
=================================================================
==============
DirectX
=================================================================
==============
开始渲染和结束渲染:
BeginScene(); //开始渲染
……
实际的渲染工作
……
EndScene(); //结束渲染
注意:
这两个函数必须成对出现,不允许交错和嵌套的发生,实际的渲染工作在这两个函数的
中间进行。
=================================================================
==============
DirectX
=================================================================
==============
清空图形绘制区:
HRESULT Clear(
DWORD Count, //清除的矩形区域数量
const D3DRECT *pRects, //清除的矩形区域数组指针
DWORD Flags, //清除的缓冲区标志,指定清除哪一个缓
冲区
D3DCOLOR Color, //清除后重置的颜色
float Z, //清除后重置的深度值,从0-1.0
DWORD Stencil //重置的模板值
);
第三个参数Flags取值(可任意组合):
D3DCLEAR_STENCIL //模板缓冲区
D3DCLEAR_TARGET //颜色缓冲区
D3DCLEAR_ZBUFFER //深度缓冲区
=================================================================
==============
DirectX
=================================================================
==============
屏幕反转:
7
----------------------- Page 8-----------------------
HRESULT Present(
CONST RECT *pSourceRect, //复制源的矩形区域指针
CONST RECT *pDestRect, //复制目的地的矩形区域指针
HWND hDestWindowOverride, //D3D设备窗口句柄
CONST RGNDATA *pDirtyRegion //最小更新区域指针
);
注意:
除非D3D的交换链是用D3DSWAPEFFECT_COPY的标志创建,在大多数的情况下,此
函数的各个参数都设置为NULL。
=================================================================
==============
DirectX
=================================================================
==============
绘制基本图形
FVF
灵活定点格式(FFVVFF)
D3D定义的FVF格式:
D3DFVF_XYZ //包含未经变换的顶点坐标
D3DFVF_XYZRHW //包含经过变换的顶点坐标
D3DFVF_XYZW //包含经过变换和裁剪的顶点坐标
D3DFVF_NORMAL //包含法线信息
D3DFVF_PSIZE //点精灵的大小
D3DFVF_DIFFUSE //包含漫反射的颜色信息
D3DFVF_SPECULAR //包含镜面反射的颜色信息
D3DFVF_TEX0……D3DFVF_TEX8 //包含0-8个纹理坐标信息
D3DFVF_XYZB1……D3DFVF_XYZB5 //包含顶点位置信息和影响顶点变换的权重信
息,用于骨骼动画模型中
根据D3D提供的灵活顶点格式,就可以定义自己的顶点结构体,例如,定义一个包含
经过变换的坐标信息和漫反射颜色信息的顶点结构如下:
//创建顶点对象
LPDIRECT3DVERTEXBUFFER9g_pVB = NULL; //顶点缓冲区对象
//自定义顶点格式
struct CUSTOMVERTEX
{
FLOAT x,y,z,rhw; //经过变换的三维坐标
DWORD color; //顶点漫反射颜色
};
#define D3DFVF_CUSTOMVERTEX(D3DFVF_XYZRHW| D3DFVF_DIFFUSE)
//以下函数设置顶点数据
CUSTOMVERTEXvertices[]=
{
8
----------------------- Page 9-----------------------
{ 100.0f,400.0f,0.5f,1.0f,0xffff0000,},
{ 300.0f, 50.0f,0.5f,1.0f,0xff00ff00,},
{ 500.0f,400.0f,0.5f,1.0f,0xff0000ff,},
};
=================================================================
==============
DirectX
=================================================================
==============
基本图元的绘制
HRESULT
(
D3DPRIMITIVETYPE PrimitiveType, //基本图元类型
UINT StartVertex, //起始顶点
UINT PrimitiveCount //绘制图元的数量
);
第一个参数PrimitiveType取值:
D3DPT_POINTLIST //点列集合(一组点的集合)
D3DPT_LINELIST //线列集合(一组线段的集合)
D3DPT_LINESTRIP //线带集合(首尾相连的线段的集合)
D3DPT_TRIANGLELIST //三角形列(一组三角形的集合)
D3DPT_TRIANGLESTRIP //三角形带 (首尾相连的三角形,有两个顶点重
合)
D3DPT_TRIANGLEFAN //三角形扇(组成扇形的一组三角形)
=================================================================
==============
DirectX
=================================================================
==============
创建顶点缓冲区
HRESULT CreateVertexBuffer(
UINT Length, //顶点缓冲区的大小,按字节数算
DWORD Usage, //顶点缓冲区属性
DWORD FVF, //灵活顶点格式
D3DPOOL Pool, //顶点缓冲区的内存类型
IDirect3DVertexBuffer9** ppVertexBuffer, //顶点缓冲区指针地址
HANDLE* pSharedHandle //保留参数,置为0
);
*Usage:参数Usage用于指定顶点缓冲区的属性,其取值可以设为0,或下面任意值的组合。
D3DUSAGE_WRITEONLY //只写属性,不能进行读操作,设置该属性可以提高系统性能
D3DUSAGE_DYNAMIC //指定顶点缓冲区要求使用动态内存
D3DUSAGE_NPATCHES //使用顶点缓冲区绘制N-patches曲线
D3DUSAGE_POINTS //指定顶点缓冲区存储原始点
D3DUSAGE_RTPATCHES //使用顶点缓冲区绘制高阶图元(high-orderprimitive)
9
----------------------- Page 10-----------------------
D3DUSAGE_SOFTWAREPROCESSING //使用软件进行顶点运算,否则使用硬件计算
*Pool:参数Pool属于枚举类型D3DPOOL,指定顶点缓冲区资源的内存位置,如下:
typedef enum _D3DPOOL {
D3DPOOL_DEFAULT = 0, //
DD33DDPPOOOOLL__DDEEFFAAUULLTT == 00,, 默认值,顶点缓冲区尽可能存在于显存中
D3DPOOL_MANAGED = 1, // D3D
DD33DDPPOOOOLL__MMAANNAAGGEEDD == 11,, 由DD33DD的资源管理器自动调度顶点缓冲
区内存位置
D3DPOOL_SYSTEMMEM = 2, //顶点缓冲区位于内存中
D3DPOOL_SCRATCH = 3, //定点缓冲区位于计算机临时内存中,只能进行内存加锁拷贝
D3DPOOL_FORCE_DWORD = 0x7fffffff //强制将此ENUM编译为32位,无其他意
义
} D3DPOOL;
下面的函数创建了一个顶点缓冲区来保存一个三角形的顶点信息:
//创建顶点缓冲
if(FAILED(g_pDevice->CreateVertexBuffer(
UINT Length:3*sizeof(CUSTOMVERTEX),
DWORD Usage:D3DUSAGE_WRITEONLY,
DWORD FVF :D3DFVF_CUSTOMVERTEX,
D3DPOOL Pool:D3DPOOL_DEFAULT,
ppVertexBuffer:& g_pVB,
pSharedHandle:NULL)))
{
returnE_FAIL;
}
=================================================================
==============
DirectX
=================================================================
==============
保存顶点
HRESULT Lock(
UINT OffsetToLock, //加锁内存起始地址
UINT SizeToLock, //加锁内存大小
VOID **ppbData, //返回内存指针地址
DWORD Flags //加锁属性
);
DWORD Flags
DDWWOORRDD FFllaaggss:指定了顶点缓冲区的加锁属性,它可以取值为0,或者如下中的任意组合:
D3DLOCK_DISCARD //仅在动态缓冲区下使用,硬件丢弃原缓冲区并创建一个
新的缓冲区
D3DLOCK_NO_DIRTY_UPDATE //在缺省状态下,对缓冲区加锁将会在该区域设置一个
Dirty标志,该属性将不对该区域设置Dirty标志
D3DLOCK_NOSYSLOCK //在加锁的过程中系统可进行其他操作
D3DLOCK_READONL //设置缓冲区位制度属性
D3DLOCK_NOOVERWRITE //尽在动态缓冲区下使用,保证不覆盖缓冲区数据,即向
10
----------------------- Page 11-----------------------
缓冲区中添加数据,允许在渲染时添加数据到缓冲区
//以下代码保存了顶点
//锁定顶点缓冲
if(FAILED(g_pVertexBuffer->Lock(0,sizeof(Vertices))))
{
return E_FAIL;
}
//拷贝顶点信息
memcpy(g_pVB, vertices,size(vertices));
//解锁
g_pVertexBuffer->Unlock();
=================================================================
==============
DirectX
=================================================================
==============
设置渲染状态
HRESULT SetRenderState(
D3DRENDERSTATETYPE State, //需要渲染的状态
DWORD Value //代表设置的渲染状态的值
);
=================================================================
==============
DirectX
=================================================================
==============
图形绘制
*设置资源流
HRESULT SetStreamSource(
UINT StreamNumber, //渲染数据流序号
IDirect3DVertexBuffer9 *pStreamData, //进行绑定的顶点缓冲区指针
UINT OffsetInBytes, //进行绑定连接的渲染数据流
的起始位置
UINT Stride //渲染数据流中一个顶点所占的内存的大小
);
*设置顶点格式
HRESULT SetFVF(
DWORD FVF //灵活顶点格式
);
*绘制基本图元
HRESULT DrawPrimitive(
D3DPRIMITIVETYPE PrimitiveType, //绘制的图元类型
11
----------------------- Page 12-----------------------
UINT StartVertex, //绘制的起始顶点
UINT PrimitiveCount //绘制的图元数量
);
// Desc:渲染图形
VOID Render()
{
//清空后台缓冲区
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,
255, 255), 1.0f, 0 );
//开始在后台缓冲区绘制图形
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0,
sizeof(CUSTOMVERTEX) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 ); //画
一个三角形
g_pd3dDevice->EndScene();//结束在后台缓冲区绘制图形
}
g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); //将在后台缓冲区绘
制的图形提交到前台缓冲区显示
}
=================================================================
==============
DirectX
=================================================================
==============
索引缓冲
顶点设置
//下面代码片段设置了索引缓冲的值
//-----------------------------------------------------------------------------
// Desc:全局变量
//-----------------------------------------------------------------------------
LPDIRECT3DVERTEXBUFFER9g_pVB =NULL;// 顶点缓冲区对象
LPDIRECT3DINDEXBUFFER9 g_pIB =NULL;// 索引缓冲区对象
//-----------------------------------------------------------------------------
// Desc:顶点结构和灵活顶点格式
//-----------------------------------------------------------------------------
structCUSTOMVERTEX
{ FLOATx, y, z, rhw; // 经过坐标转换的顶点位置
DWORDcolor; // 顶点漫反射颜色值
};
#defineD3DFVF_CUSTOMVERTEX(D3DFVF_XYZRHW|D3DFVF_DIFFUSE)