D3D9学习笔记(五) Resource

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

 

5.1操纵res

创建

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访问方法

5.2 vertext buffer

将vertex buffer送给管线渲染

d3dDevice->SetStreamSource();

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

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

 

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方式

FVF(flexible 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对各种buffer(back front depth)等的包装和程序表示

时间: 2024-07-28 23:17:46

D3D9学习笔记(五) Resource的相关文章

D3D9学习笔记(五) State

一个state就是对(固定)渲染管线的某个特性或参数的一次设置 state block 记录了一个序列很多的state,可以保存相似的一连串对管线的设置 4.0.1创建state block 1.创建一个State Block并将当前state加入 IDirect3DDevice9::CreateStateBlock() 2.自动的捕捉一短时间的state变化 IDirect3DStateBlock9* pStateBlock = NULL; pd3dDevice->BeginStateBloc

kvm虚拟化学习笔记(五)之windows虚拟机性能调整

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1290682 KVM虚拟化学习笔记系列文章列表 ---------------------------------------- kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51cto.com/703525/1288795 kvm虚拟化学习笔记(二)之linuxkvm虚拟机安装htt

C#可扩展编程之MEF学习笔记(五):MEF高级进阶

好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用的基本已经讲完了,相信大家已经能看出MEF所带来的便利了.今天就介绍一些MEF中一些较为不常用的东西,也就是大家口中的所谓的比较高级的用法. 前面讲的导出都是在每个类上面添加Export注解,实现导出的,那么有没有一种比较简便的方法呢?答案是有的,就是在接口上面写注解,这样只要实现了这个接口的类都会

cmake学习笔记(五)

在cmake 学习笔记(三) 中简单学习了 find_package 的 model 模式,在cmake 学习笔记(四)中了解一个CMakeCache相关的东西.但靠这些知识还是不能看懂PySide使用CMakeLists文件,接下来继续学习find_package的 config 模式及package configure文件相关知识 find_package 的 config 模式 当CMakeLists.txt中使用find_package命令时,首先启用的是 module 模式: 按照 C

Caliburn.Micro学习笔记(五)----协同IResult

Caliburn.Micro学习笔记目录 今天说一下协同IResult 看一下IResult接口 /// <summary> /// Allows custom code to execute after the return of a action. /// </summary> public interface IResult { /// <summary> /// Executes the result using the specified context. /

JSP学习笔记(五)-----JSP中使用JavaBean

js|笔记 1. 该实例主要告诉我们怎么样在JSP代码中调用JavaBean构件2. 使用JavaBean的优点是简化了JSP代码,界面代码和逻辑代码互相分离,便于程序员查看和调试3. 该实例需要五个文件:login.jsp,test.jsp, userbean.class4. 首先看一下login.jsp <html><center><form method=post action="http://127.0.0.1:8000/test.jsp">

VC++/MFC学习笔记(五)

 ADO技术介绍ADO是Microsoft最新和最强大的数据访问接口OLE DB而设计的,是一个便于使用的应用程序层.OLE DB为任何数据源都提供了高性能的访问,这些数据源包括关系和非关系数据库.电子邮件.文件系统.文本和图形以及自定义业务对象等.ADO在关键的Internet方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量.高性能的接口.同时ADO使用与DAO相似的约定和特性,使得它更易于学习.这里先介绍一下ADO技术的历史和ADO访问数据源的特点,然

D3D9学习笔记(三) Device

2.1架构 2.2类型 基本的device类型:hal:硬件渲染(发布).这也不是直接访问硬件驱动,而是访问在上一层的hal.(在顶点处理过程中,如果硬件处理失败,可尝试混合处理及纯软处理,设定标志D3DCREATE_MIXED_VERTEXPROCESSING)                                        soft软件渲染(但是这种软渲染并不一定拥有同当前硬件相同的渲染能力,所以要经常检查)                                   

D3D9学习笔记(六) 坐标系统及坐标变换 几何体

6.1坐标系统 D3D9采用左手系,即Z轴朝里 平面法向也是用右手 6.2生成和设置坐标转换矩阵 world trans D3DXMatrixRotationX D3DXMatrixTranslation.. view trans D3DXMatrixLookAtLH   优化 频繁的set 变换矩阵的开销很大,因此可以本地记录world  view矩阵,然后只set 一个整体的world_view矩阵,而让view矩阵永远为单位帧   IDirect3DDevice9::SetTransfor