D3D9学习笔记(五) Resource

Usage

这是强制的属性,使用时要明确确定,下面是每种reource的用途列表

Format

<d3d9types.h>

存储访问顺序 D3DFORMAT_ARGB:内存中存储顺序是BA

                            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是个低效率的操作

 

5.1操纵res

创建

IDirect3DDevice9::Createxxx返回一个buffer

buff::lockxxx 锁住一个buf的某个层面,锁住后可以对其进行修改。

这里有个参数这里是解决gpucpubackbuffer的访问冲突策略。

DISCARD  _DISCARD是指当cpugpu提交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访问方法

5.2 vertext buffer

vertex buffer送给管线渲染

d3dDevice->SetStreamSource();

在设置了vb后所有绘制(如IDirect3DDevice9::DrawPrimitive)调用的顶点缓存都是这个

如果是软渲染那么vertextbufferpool在系统上是最好的

 

5.2.1Vertex Declaration

 

顶点声明。在创建vb时,需要提供一个参数DWORD FVF,对于固定管线来说,你需要告诉管线你的顶点数据结构如struct VERTEX

{

    floatx, y,z;

    float nx, ny, nz;

    floatu, v;

}包含了那些信息,是只有位置,还是有法向,因为单单从VERTEX这结构是无法判断的,所以需要定义顶点的declaration或者说顶点的布局

5.2.1.1 fvf方式

FVFflexible vertex format

FVF使用一些定义好的常量的或在一起,这些常量有

D3DFVF_DIFFUSE(含有漫反射量) D3DFVF_NORMAL D3DFVF_PSIZE

注意当使用了FVF时,VERTEX中的各种类型分量是有先后顺序的,例如位置量永远在法向量之前,就算你定义

{

    floatnx, ny, nz;

    floatx, y,z;

    floatu, v;

}

那么nx ny nz也是位置量

5.2.1.2 新的D3DVERTEXELEMENT9方式

5.3 surface

surface就是D3D9对各种bufferback front depth)等的包装和程序表示

转载于:https://www.cnblogs.com/weizhixiao/archive/2012/11/22/5697334.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值