.plan

everybody lies

导航

2008年的D3D学习笔记(2)

水曜日:DirectX绘制图形

2008/06/25 01:40

1,首先需要考虑顶点信息的存储,也就是顶点缓存和索引缓存的实现
IDirect3DVertexBuffer9
是顶点存储,IDirect3DIndexBuffer9是索引缓存。
可以使用Creat函数来创建它们:
HRESULT IDirect3DVertexBuffer9::CreatVertexBuffer

UINT Length,//
为缓存分配的字节数,如果需要缓存n个顶点,应为n*sizeofVertex
DWORD Usage,//
指定缓存的附加属性,0为无属性
DWORD FVF,//
存储在顶点缓存中的顶点的灵活顶点格式
D3DPOOL Pool,//
内存池
IDirect3DVertexBuffer9** ppVertexBuffer,//
用于接受创建的顶点缓存的指针
HANDLE *pSharedHandle // 0
);

HRESULT IDirect3DDevice9::CreatIndexBuffer(
UINT Length,//
为缓存分配的字节数,如果需要缓存n个顶点,应为n*sizeofVertex
DWORD Usage,//
指定缓存的附加属性,0为无属性
D3DFORMAT FVF,//
存储在顶点缓存中的顶点的灵活顶点格式
D3DPOOL Pool,//
内存池
IDirect3DIndexBuffer9** ppIndexBuffer,////
用于接受创建的索引缓存的指针
HANDLE *pSharedHandle // 0
);

2,访问缓存
写缓存:
使用Lock函数来进行写操作
HRESULT IDirect3DVertexBuffer9::Lock(
UINT OffsetToLock,//
自缓存的起始点到开始锁定的位置的偏移字节数
UINT SizeToLock,//
需要lock的字节数
BYTE** ppData,//
指向被锁定的存储区起始位置的指针
DWORD Flags//
锁定方式,可以是0
);

3,绘制状态
我们能访问我们所保存的顶点或者索引缓存信息之后,我们要决定绘制状态,也就是以什么样的形式来绘制我们的图形。
使用HRESULT IDirect3DDevice9::SetRenderStateD3DRENDERSTATETYPE State,DWORD Value)来设定我们的绘制状态。

4,准备绘制
我们的工作做的差不多了,但是在绘制图形之前,我们还需要做一些准备活动:
*
指定数据流的输入源,也就是将我们缓存中的信息传输到绘制流水线中。
使用SetStreamSource方法。
*
设定顶点格式,使用SetFvF方法
*
设置索引缓存,如果我们需要的话,使用SetIndices方法。

5,开始绘制
绘制的方法有两种,分别对应了顶点缓存和索引缓存:
分别是:
HRESULT IDirect3DDevice9::DrawPrimitive(
D3DPRIMITIVETYPE PrimitiveType;//
需要绘制的图元类型,比如三角形D3DPT_TRIANGLELIST
UINT StartVertex;//
顶点数据流中标示顶点读取起点的元素索引,该参数使得我们可以选择绘制图形的一部分
UINT PrimitiveCount//
需要绘制的数量
);

HRESULT IDirect3DDevice9::DrawIndexedPrimitive(
D3DPRIMITIVETYPE Type;//
所要绘制的图元类型
INT BaseVertexIndex;//
索引基数
UINT MinIndex;//
允许的最小索引值
UINT NumVertics;//
顶点总数
UINT StartIndex;//
顶点缓存中标示索引读取起点的元素的索引
UINT PrimitiveCount//
需要绘制的数量
);

--------------------------------------------------------

PS:绘制操作之前需要执行BeginScene(),之后需要执行EndScene()

PPS:所谓的索引基数,是为了保证多个图元在同一索引缓存中我们能找到正确的索引,是每个局部索引的偏移量。基数是按顶点个数计算而不是字节数。

 

日曜日:Direct3D的颜色

2008/06/29 13:54

1,颜色表示

Direct3D中的颜色是RGB表示的,所用保存的数据结构一种是D3DCOLOR,实际是一个DWORD类型,32位,分成了48位,分别是alphargb。当然,指定值的时候仿佛需要位运算,但是实际提供了一个宏来帮助我们实现这样的工作:D3DCOLOR_ARGB(a,r,g,b),或者D3DCOLOR_XRGB(r,g,b)其中a默认为255

还有一种是D3DCOLORVALUE,定义为:

Typedef struct D3DCOLORVALUE{

    float r;

    float g;

    float b;

    float a;

}D3DCOLORVALUE;

取值范围是0-1,类似於opengl

还有一个结构是D3DXCOLOR,该结构不但和D3DCOLORVALUE一样的数据,还提供了一些列的构造函数和运算符。

2,顶点颜色

现在我们有一个图元,他的颜色要怎么确定呢?

图元的颜色由构成该图的顶点的颜色决定。我们必须为顶点数据结构添加一个表示颜色的数据成员。

此处无法使用D3DCOLORVALUE结构,因为Direct3D希望用一个32位的值来表示颜色。、

struct ColorVertex{

    float x,y,z;

    D3DCOLOR color;

    static const DWORD FVF;

};

3,着色

着色(shading)发生在光栅化的过程中,着色规定了如何利用顶点的颜色来计算图元像素的颜色。

现在,我们使用两种着色模式:

(1) 平面着色(flat shading)

使用平面着色,每个图元的每个像素都被一致赋予该图元的第一个顶点所指定的颜色,其他顶点颜色被忽略。

(2)Gouraud着色

图元中各像素的颜色值由各顶点的颜色经线性插值得到。

我们使用D3D的状态机来控制颜色模式:SetRenderState

 

木曜日:光照

2008/07/03 13:21

1,光照的组成

D3D中,光源发出的光由3个类型或者说分量组成:

环境光(Ambient Light):这种类型的光是经由其他表面反射到达物体表面,并照亮整个场景。

满射光(Diffuse Light):这种类型的光是沿着某个特定的方向传播,当它到达某一表面的时候,将沿着各个方向均匀反射。由于这种光是沿着各个方向反射,所以不需要考虑观察者的位置。

镜面光(Specular Ligth):这种类型的光按特定方向传播,当它到达某一表面的时候,将严格按另一个方向反射,从而形成某一个方向才能观察的高亮度照射。

镜面光的和其它类型相比,计算量要大的多,一般D3D默认关闭,如果要打开需要把D3DRS_SPECULARENABLE设置为true

2,材质

所谓的物体的颜色是他所反射的光的颜色,所以我们使用材质(materials)来模拟相同的现象,来定义物体表面对各种颜色光的反射比例。

数据结构为:

typedef struct D3DMETRIAL9{

    D3DCOLORVALUE Diffuse//指定材质对漫射光的反射率

    D3DCOLORVALUE Ambient//指定材质对环境光的反射率

    D3DCOLORVALUE Specular//指定材质对镜面光的反射率

    D3DCOLORVALUE Emissive//用于增强物体亮度,使之看起来好像是自己发光

    float Power//指定锐度

}

3,顶点法线  

法线是标志一个面或者点的朝向的向量。顶点法线是描述构成多边形的各个顶点的法线。

D3D需要知道顶点的法线方向,以确定光照到达表面时的入射角。而且,由于光照计算是对每个顶点进行的,所以D3D需要知道表面在每个顶点处的法线方向。

4,光源

D3D中有3种光源:

点光源(Point lights):在世界坐标系中有一个固定位置,向所有方向发射光

方向光(Directional lights):该光源没有位置信息,所发射的光线相互平行的向某一个特定方向传播

聚光灯(Spot lights):和手电筒类似,有一个位置信息,发射锥形的光

光源的数据结构是

typedef struct D3DLIGHT9{
D3DLIGHTTYPE Type;//
我们创建的光源类型
D3DCOLORVALUE Diffuse;//
漫射光颜色
D3DCOLORVALUE Specular://
镜面光颜色
D3DCOLORVALUE Ambient;//
环境光颜色
D3DVECTOR Position;//
光源位置,对方向光没意义
D3DVECTOR Direction;//
光的传播方向,对点光源没意义
float Range;//
光线消亡前的最大光距,对于方向光没意义
float Falloff;//
锥形光的递减
float Attenuation0;//
光强递减,常量
float Attenuation1;//
线性
float Attenuation2;//2

float Theta;//
聚光灯的内锥的圆锥角
float Phi;//
外缀的圆锥角
}

posted on 2009-07-22 23:05  housechen  阅读(943)  评论(0编辑  收藏  举报