您的位置:首页 > 其它

DirectX 3D_基础之顶点缓存 索引缓存 访问缓存 颜色表示 顶点颜色 着色

2013-03-28 21:01 435 查看
每日一语:

人经常可以自欺欺人,用来欺骗自己,从而让自己得到些许的慰藉或安慰。我们从来都是看到的是别人光鲜的一面,从来没有看到别人的努力的一面。作为程序员,我们应该耐得住寂寞,耐得住性子,但又应该不甘寂寞。所以现在需要拒绝浮躁,我们应该不鸣则已,一鸣惊人。厚积薄发。总有一天,我也会破茧成蝶。走向成功。

正文:

Direct3D中的绘制:

顶点缓存和索引缓存:

顶点缓存是一个包含顶点数据的连续内存空间,索引缓存是包含索引数据的连续内存空间,我们之所以用顶点缓存和索引缓存而非数据来存储数据,是因为顶点缓存和索引缓存可以放置在显存中。进行绘制时,使用显存中的数据将获得比使用系统内存中的数据快得多的绘制速度。我们可以使用如下函数来创建顶点缓存:

HRESULT IDirect3DDevice9::CreateVetexBuffer(

UINT Length,

DWORD Usage,

DWORD FVF,

D3DPOOL Pool,

IDirect3DVertexBuffer9** ppVertexBuffer,

HANDLE* pSharedHandle

)

可用下面函数创建索引缓存:

HRESULT IDirect3DDevice9::CreateIndexBuffer(

UINT Length,

DWORD Usage,

D3DFORMAT Format,

D3DPOOL Pool,

IDirect3DIndexBuffer9** pIndexBuffer,

HANDLE* pShareHandle

)

下面就其参数进行说明:

Length: 为缓存分配的字节数。

Usage: 指定如何使用缓存的一些附加属性,该值可为0(表明无需附加属性)或是以下标记中的某一种或某种组合。

D3DUSAGE_DYNAMIC: 将缓存设为动态缓存。动态缓存一般放置在AGP存储区中,其内容可以迅速更新,如果需要频繁更新缓存中的内容,该缓存应该设置为动态的。粒子

系统就是使用动态缓存的一个很好的例子。

D3DUSAGE_POINTS: 该标记规定缓存将用于存储点图元。

D3DUSAGE_SOFTWAREPROCESSING:指定软件顶点运算方式。

D3DUSAGE_WRITEONLY:指定应用程序对缓存的操作模式为“只写”。这样驱动程序就可以将缓存放在最合适写操作的内存地址中。

创建缓存时,如果没有指定为动态的,则所创建的缓存为静态缓存。静态缓存一般放置在显存中,以保证存储于其中的数据得到最高效的处理。然而,静态缓存是以牺牲对静态缓存读写操作的速度为代价的,所以一般静态缓存存储静态数据。

FVF: 存储在顶点缓存中的顶点的灵活顶点格式。

Pool: 容纳缓存的内存池。

ppVertexBufer: 用于接收所创建的顶点缓存的指针。

pShareHandle: 不使用,该值设为0.

Format: 指定索引的大小。设为D3DFMT_INDEX16表示16位索引,设为D3DFMT_INDEX32表示32位索引。注意并非所有的图形设备都支持32位索引。

ppIndexBuffer: 用于接收所创建的索引缓存的指针。

访问缓存的内存:

为了访问顶点缓存或索引缓存中的数据,我们需要获得指向缓存内部存储区的指针。可以通过Lock来获取,对缓存访问完毕后,必须对缓存进行解锁unlock。

如果创建顶点缓存或索引缓存时,使用了D3DUSAGE_WRITEONLY标记,你便无法对缓存进行读操作。

我们调用Lock方法,分别得到顶点缓存和索引缓存的指针。

HRESULT IDirect3DVertexBuffer9::Lock(

UINT OffsetToLock,

UINT SizeToLock,

BYTE** ppbData,

DWORE Flags

)

HRESULT IDirect3DIndexBuffer9::Lock(

UINT OffsetToLock,

UINT SizeToLock,

BYTE** ppbData,

DWORE Flags

)

下面就其参数进行说明:

OffsetToLock: 自缓存的起始点到开始锁定的位置的偏移量,单位为字节

SizeToLock: 要锁定的字节数

ppbData: 指向被锁定的存储区起始位置的指针

Flags: 该标记描述了锁定的方式,可以是0,也可是下列标记之一或某种组合。

D3DLOCK_DISCARD: 该标记仅用于动态缓存。它指示硬件将缓存内容丢弃,并返回一个指向重新分配缓存的指针。该标记十分有用,因为这允许在我们访问新分配的内存时,硬件能够继续使用被丢弃的缓存中的数据进行绘制,这样硬件的绘制就不会终止。

D3DLOCK_NOOVERWRITE: 该标记仅用于动态缓存。使用该标记后,数据只能以追加方式写入缓存。即您不能覆盖当前用于绘制的存储区中的任何内容。这十分有用,因为,它可以保证在您往缓冲中增加数据时,硬件仍可持续进行绘制。

D3DLOCK_READONLY 该标记表示对于您所锁定的缓存只可读不可写。利用这一点可以作一些内部优化。

标记D3DLOCK_DISCARD和D3DLOCK_NOOVERWRITE表明缓存区的某一部分在锁定之后可以使用(用于绘制)。如果环境(硬件配置)允许使用这些标记,在对缓存进行锁定

时,其他的显示操作就不会中断。

颜色:

颜色表示:

在Direct3D中,颜色用RGB三元组来表示,我们认为颜色都可分解为红色,绿色和蓝色。RGB数据可用两种不同的结构来保存。第一种是D3DCOLOR,它实际上与DWORD类型完全相同(由关键字typedef定义),共有32位。D3DCOLOR类型中的各位被分成四个8位项,每项存储了一种颜色分量的亮度值。第四个字节分配给Alpha分量。目前还不必关心这个分量,它主要用于Alpha融合。

另一种存储颜色数据的结构是D3DCOLORVALUE,在该结构中,我们使用单精度浮点数来度量每个颜色分量的亮度值,亮度值的取值范围为0到1.

Typedef struct D3DCOLORVALUE{

float r;

float g;

float b;

float a;

}

D3DCOLORVALUE和D3DXCOLOR结构都有4个浮点类型的成员。这样我们就可将颜色表达成一个4D向量,记为(r,g,b,a)。颜色向量的加法,减法以及比例运算与常规的向量完全相同。而颜色向量的点积和叉积没有实际意义,但是对应分量相乘却是有意义的。所以,在类D3DXCOLOR中,颜色的乘法定义为对应分量分别相乘。

顶点颜色:

图元的颜色由构成该图元的顶点的颜色决定的。所以,我们必须为顶点数据结构添加一个表示颜色的数据成员。注意,此处无法使用D3DCOLORVALUE结构,因为Direct3D希望用一个32位的值来表示顶点的颜色。(实际上,使用顶点着色器(vertex shader)时,我们就可以使用4D颜色向量,即每种颜色用128位表示。

着色:

在光栅化的过程中,需要对多边形进行着色。着色规定了如何利用顶点的颜色来计算构成图元的像素的颜色。目前,我们使用两种着色模式:平面着色和Gouraud着色。如果使用平面着色,每个图元的每个像素都被一致赋予该图元的第一个顶点所指定的颜色。平面着色容易是物体呈现“块状”,这是因为各颜色之间没有平滑的过度。一种更好的着色模式是Gouraud着色(也称平滑着色)在Gouraud着色模式下,图元中像素的颜色值由各顶点的颜色经线性插值得到。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐