Usage
这是强制的属性,使用时要明确确定,下面是每种reource的用途列表
Format
<d3d9types.h>
存储访问顺序 D3DFORMAT_ARGB:内存中存储顺序是B到A
D3DFMT_A8L8代表16位整数,高8位是A
存在未定义通道的格式都被默认为1
数据的底层格式是不同硬件不同的,但是被D3D运行时认可后就都变成这里面D3DFORMAT枚举类里面的某种格式
支持的格式及常见写法
1. (A\R\G\B)bit(A\R\G\B)bit..这种一般只用BackBuffer 或Display
2. D3DFMT_(D\S\X\INDEX\VERTEXDATA\DXTn\A\R\G\B)bit_(\\\)bit_[LOCKABLE]
D-depth S-stencil LOCKABLE-可锁 INDEX-index buf VERTEXDATA-vertex buf data
DXTn- DXTn 压缩纹理格式 agrb-通道 L-照度 p-调色板色标
此外还支持FOURCC 、IEEE格式
带符号和不带符号
有符号的使用UVWQ 无符号的使用rgbalp
D3DFMT_UNKNOWN 未定义
Pool
存储资源的内存类型当一个pool选择了用于一个资源后,不能在被改变也就是说pool不能被多个资源混用
Pool的类型
D3DPOOL_DEFAULT = 0,
这是最通常默认的地方,通常在显存或agp,他会选择合适的地方存储资源,可锁,设备丢失后要使用
IDirect3DDevice9::Reset.
D3DPOOL_MANAGED = 1,
系统内存会对显存做一份备份,在设备丢失时不用重分配内存,只有系统内存的那部分备份能被修改,并且会在合适的时机提交显存,这种方式是可锁的。
对于资源频繁改变的不建议用这种,例如vertex 和index。还有使用
D3DUSAGE_RENDERTARGET.目的的资源也不适合,这会导致频繁的内存显存数据交换。
D3DPOOL_SYSTEMMEM = 2,
系统内存上的,一般用于
IDirect3DDevice9::UpdateSurface or IDirect3DDevice9::UpdateTexture等
D3DPOOL_SCRATCH = 3,
系统上的,但是丢失设备后不会重建
D3DPOOL_FORCE_DWORD = 0x7fffffff
强制编译到到32位内存寻址
Type:
D3DRTYPE_SURFACE
Surface resource.
D3DRTYPE_VOLUME
Volume resource.
D3DRTYPE_TEXTURE
Texture resource.
D3DRTYPE_VOLUMETEXTURE
Volume texture resource.
D3DRTYPE_CubeTexture
Cube texture resource.
D3DRTYPE_VERTEXBUFFER
Vertex buffer resource.
D3DRTYPE_INDEXBUFFER
Index buffer resource.
D3DRTYPE_FORCE_DWORD
创建时必须制定的属性,runtime的查询type是个低效率的操作
创建
IDirect3DDevice9::Createxxx返回一个buffer
锁
buff::lockxxx 锁住一个buf的某个层面,锁住后可以对其进行修改。
这里有个参数这里是解决gpu和cpu对backbuffer的访问冲突策略。
DISCARD _DISCARD是指当cpu为gpu提交buffer时,当发现lock失败时(backbuffer在用于render),那么就标记backbuffer脏了,这时backbuffer就可以马上重建,而接受gpu的提交。当有频繁的VB缓存修改时要置这个参数。
D3DLOCK_DISCARD 程序会忽略锁定区域内的所有缓存
D3DLOCK_READONLY 程序不会去写这片缓存
D3DLOCK_NOOVERWRITE如果缓存被使用立即返回,如果没有则一定会等到在使用完毕后返回
D3DLOCK_NOSYSLOCK执行Lock()函数需要一定的时间,默认状态下,Direct3D会暂停其他的显示操作,直至Lock()函数执行结束。设置D3DLOCK_NOSYSLOCK属性,可以使Direct3D在执行对缓冲区加锁的同时执行其他的显示操作,比如移动鼠标。
D3DLOCK_NO_DIRTY_UPDATE默认情况在缩时会加一个dirty标志,这个标志会保证这个dirty标志永远不会被改掉
texture由系统内存提交显卡内存这只对于非manage方式的资源
IDirect3DDevice9::UpdateTexture.
复制
对于surface可以使用UpdateSurface将某个surface拷贝到另外一个surface,然后可以再拷贝过来,和lock相比,这也是一种间接的buffer访问方法
将vertex buffer送给管线渲染
d3dDevice->SetStreamSource();
在设置了vb后所有绘制(如IDirect3DDevice9::DrawPrimitive)调用的顶点缓存都是这个
如果是软渲染那么vertextbuffer的pool在系统上是最好的
顶点声明。在创建vb时,需要提供一个参数DWORD FVF,对于固定管线来说,你需要告诉管线你的顶点数据结构如
struct VERTEX
{
floatx, y,z;
float nx, ny, nz;
floatu, v;
}包含了那些信息,是只有位置,还是有法向,因为单单从VERTEX这结构是无法判断的,所以需要定义顶点的declaration或者说顶点的布局
FVF(flexible vertex format)
FVF使用一些定义好的常量的或在一起,这些常量有
D3DFVF_DIFFUSE(含有漫反射量) D3DFVF_NORMAL D3DFVF_PSIZE等
注意当使用了FVF时,VERTEX中的各种类型分量是有先后顺序的,例如位置量永远在法向量之前,就算你定义
{
floatnx, ny, nz;
floatx, y,z;
floatu, v;
}
那么nx ny nz也是位置量
surface就是D3D9对各种buffer(back front depth)等的包装和程序表示