天行健 君子当自强而不息

Direct3D中的颜色和资源

Direct3D中的颜色表示

颜色在Direct3D中占据比较重要的位置,所有的操作无论是光照还是纹理贴图,其结果最终都归结到如何影响每个顶点或像素的颜色。

 

1、用DWORD定义颜色

struct sCustomVertex
{
float x, y, z, rhw;
DWORD color;
};

用DWORD类型定义的参数color的取值是一个32位无符号长整数。这32位每8位一组,从左至右分为4组,第一组表示透明度,第二组表示颜色中的红色成分,第三组表示绿色成分,第四组表示蓝色成分。四组数按图形学中三原色原理组合决定一个顶点的颜色。每组数的取值范围是0~255。这些数值通常用16进制表示,例如:

sCustomVertex vertices[] =
{
{ 100.0f, 650.0f, 0.5f, 1.0f, 0xffff0000, }, // 不透明,红色
{ 500.0f, 100.0f, 0.5f, 1.0f, 0xff00ff00, }, // 不透明,绿色
{ 900.0f, 650.0f, 0.5f, 1.0f, 0xff0000ff, }, // 不透明,蓝色
};

 

2、用D3DCOLOR定义颜色

D3DCOLOR是Direct3D中定义的一个表示颜色的变量类型,事实上,它和DWORD颜色类型本质是一样的,在Direct3D中D3DCOLOR类型的定义为:

typedef DWORD D3DCOLOR;

由于DWORD和D3DCOLOR都使用一个32位无符号长整数定义一个颜色,使用不便,所以在Direct3D中定义了许多宏来方便地指定颜色,常见的有D3DCOLOR_ARGB,它的定义为:

// maps unsigned 8 bits/channel to D3DCOLOR
#define D3DCOLOR_ARGB(a,r,g,b) \
((D3DCOLOR)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff)))

在这种颜色类型中,用透明度、红色成分、绿色成分、蓝色成分来初始化一个颜色值。其中参数a表示颜色的透明度,参数r表示红色成分,参数g表示绿色成分,参数b表示蓝色成分。各个参数的取值范围都是0~255。

类似的还有宏D3DCOLOR_RGBA和D3DCOLOR_XGBA,它们的定义为:

#define D3DCOLOR_RGBA(r,g,b,a) D3DCOLOR_ARGB(a,r,g,b)
#define D3DCOLOR_XRGB(r,g,b) D3DCOLOR_ARGB(0xff,r,g,b)

需要注意的是,宏D3DCOLOR_XGBA中不包含a,即不指定透明度,而默认完全不透明。

 

3、用D3DCOLORVALUE定义颜色

可以使用结构体D3DCOLORVALUE来定义Direct3D中的颜色,这种颜色类型多用于指定灯光和材质的颜色,结构体D3DCOLORVALUE的定义如下:

typedef struct _D3DCOLORVALUE {
float r;
float g;
float b;
float a;
} D3DCOLORVALUE;

结构体中的各个成员都是浮点型,其取值范围是0.0~1.0,当全部取0.0时为黑色。其中,r表示颜色的红色成分,g表示颜色的绿色成分,b表示颜色的蓝色成分,a表示颜色的alpha成分,即透明度。

需要注意的是,可以使结构体成员不在0~1之间取值以产生一些特殊效果,当取值大于1时的效果是强光,几乎冲掉一个场景;取值为负数时产生弱光,好像从场景中撤掉灯光一样。

 

4、用D3DXCOLOR定义颜色

在Direct3D中,还可以使用结构体D3DXCOLOR定义颜色,该结构体的定义如下:

typedef struct D3DXCOLOR
{
#ifdef __cplusplus
public:
D3DXCOLOR() {}
D3DXCOLOR( DWORD argb );
D3DXCOLOR( CONST FLOAT * );
D3DXCOLOR( CONST D3DXFLOAT16 * );
D3DXCOLOR( CONST D3DCOLORVALUE& );
D3DXCOLOR( FLOAT r, FLOAT g, FLOAT b, FLOAT a );
    // casting
operator DWORD () const;
    operator FLOAT* ();
operator CONST FLOAT* () const;
    operator D3DCOLORVALUE* ();
operator CONST D3DCOLORVALUE* () const;
    operator D3DCOLORVALUE& ();
operator CONST D3DCOLORVALUE& () const;
    // assignment operators
D3DXCOLOR& operator += ( CONST D3DXCOLOR& );
D3DXCOLOR& operator -= ( CONST D3DXCOLOR& );
D3DXCOLOR& operator *= ( FLOAT );
D3DXCOLOR& operator /= ( FLOAT );
    // unary operators
D3DXCOLOR operator + () const;
D3DXCOLOR operator - () const;
    // binary operators
D3DXCOLOR operator + ( CONST D3DXCOLOR& ) const;
D3DXCOLOR operator - ( CONST D3DXCOLOR& ) const;
D3DXCOLOR operator * ( FLOAT ) const;
D3DXCOLOR operator / ( FLOAT ) const;
    friend D3DXCOLOR operator * ( FLOAT, CONST D3DXCOLOR& );
    BOOL operator == ( CONST D3DXCOLOR& ) const;
BOOL operator != ( CONST D3DXCOLOR& ) const;
#endif //__cplusplus
FLOAT r, g, b, a;
} D3DXCOLOR, *LPD3DXCOLOR;

在Direct3D中,该结构体已经进行了扩展,可以进行赋值、加减、乘除等多项运算。

 

资源的概念

Direct3D资源是指用来渲染一个场景的纹理或缓冲区。应用程序需要创建、加载、复制、使用资源。Direct3D所有的资源,包括几何数据资源IDirect3DIndexBuffer9、IDirect3DVertexBuffer9等,都继承于接口IDirect3DResource9。纹理资源IDirect3DCubeTexture9,IDirect3DTexture9和IDirect3DVolumeTextre9是从接口IDirect3DResource9的子接口IDirect3DBaseTexture9中继承而来的。

 

1、资源属性

所有资源具有下列属性:

  • 用法(usage):资源的使用方法,例如,作为一种纹理或一个渲染目标使用。
  • 格式(format):数据的格式,例如一个二维表面的像素格式。
  • 内存池(pool):资源所申请的内存存储空间的类型。
  • 类型(type):资源的类型,例如一个顶点缓冲区或一个渲染目标。

(1)资源用法

资源的使用是强制的。在应用程序中,要以特定的操作使用资源,则在创建该资源时就必须指定使用方法。Direct3D定义了一系列的常量(以D3DUSAGE开发的大写表示符),用来表示资源使用方法,详细情况请参考DirectX帮助文档。例如D3DUSAGE_RTPATCHES,D3DUSAGE_NPATCHES和D3DUSAGE_POINTS表示的资源使用方法,通知驱动程序,在缓冲区内的数据将可能用于渲染高序元(high-order primitives)、网格patches、N-patches和点精灵(point scripts)。提供这些标志是为了防止没有主操作(host processing)时硬件不能执行这些操作。因此,驱动将在系统内存中分配这些表面,使CPU可以操作它们。如果驱动完全可以通过硬件实现这些操作,那么就能在显存中申请这些表面从而避免一次内存复制,这样至少能提高运行性能两倍。需要指出的是这些标志提供的信息不是绝对必须的。驱动能检测到这些将要对数据的操作,并将缓冲区数据移动到系统内存,进行下一帧内容的绘制。

(2)资源格式

有关资源表面格式的详细内容,可以参考DirectX帮助文档中枚举类型D3DFORMAT。

(3)内存池

资源缓冲区所占内存的类型称为内存池。内存池的值由枚举类型D3DPOOL指定,该类型定义如下:

typedef enum _D3DPOOL {
D3DPOOL_DEFAULT = 0,
D3DPOOL_MANAGED = 1,
D3DPOOL_SYSTEMMEM = 2,
D3DPOOL_SCRATCH = 3,
    D3DPOOL_FORCE_DWORD      = 0x7fffffff
} D3DPOOL;

如果在创建资源时使用D3DPOOL_DEFAULT内存池,则Direct3D通常会将资源保存到显存或AGP内存中,以得到更高的性能,但是,Direct3D设备丢失后,在调用IDirect3DDevice9::Reset()恢复设备前,必须释放用D3DPOOL_DEFAULT创建的资源,并且在恢复设备后必须重新创建这些资源。

使用D3DPOOL_MANAGED标志创建的资源称为托管资源。对于托管资源,Direct3D会自动在系统内存中进行备份,当设备丢失时,Direct3D将自动释放这类资源;恢复设备时也不需要重新创建,Direct3D会自动从系统内存恢复这些资源。

对于那些设备不经常访问的资源,通常使用D3DPOOL_SYSTEMMEM内存池标志创建。这些资源将常驻系统内存,所以在设备丢失后,这类资源不会丢失,恢复设备时也不需要重新创建。

D3DPOOL_DEFAULT和D3DPOOL_MANAGED资源是最常使用的两种资源,要牢记这两种资源在设备丢失和恢复时的区别。不能为同一个对象使用多种内存池,当为一个资源选定一个内存池后,该内存池就不能再改变了。

(4)资源类型

当应用程序调用一个资源创建函数如CreateCubeTexture()时,需要指定资源类型。资源类型由枚举类型D3DRESOURCETYPE指定,其枚举类型定义如下:

Defines resource types.

typedef enum D3DRESOURCETYPE
{
D3DRTYPE_SURFACE = 1,
D3DRTYPE_VOLUME = 2,
D3DRTYPE_TEXTURE = 3,
D3DRTYPE_VOLUMETEXTURE = 4,
D3DRTYPE_CubeTexture = 5,
D3DRTYPE_VERTEXBUFFER = 6,
D3DRTYPE_INDEXBUFFER = 7,
D3DRTYPE_FORCE_DWORD = 0x7fffffff,
} D3DRESOURCETYPE, *LPD3DRESOURCETYPE;

Constants

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
Forces this enumeration to compile to 32 bits in size. Without this value, some compilers would allow this enumeration to compile to a size other than 32 bits. This value is not used.

 

2、管理资源

资源的管理工作涉及两方面,即将资源从系统内存存储区提升到设备可用存储区和将资源从设备可用存储中抛弃两个方面。以“最近最少使用”优先原则为基础,Direct3D建立了自己的管理算法。当资源数量多于在设备可用存储区中可以同时存在的资源数量,即多于作用于同一帧时的资源时(也就是说,这些资源处于函数调用IDirect3DDevice9::BeginScene()和IDirect3DDevice9::EndScene()之间),Direct3D转而采用“最近最多使用”优先原则。

不是所有的类型和用法都支持托管资源。例如,用标志D3DUSAGE_RENDERTARGET创建的对象就不支持。另外,对于那些内容频繁改变的对象,推荐不使用托管资源。例如,一个托管类型的顶点缓冲区资源的每一帧的内容都是不同的,这对于一些硬件来说,会大大降低其运行效率。但是,这对于纹理资源却不成问题。


posted on 2008-05-01 17:16 lovedday 阅读(2868) 评论(2)  编辑 收藏 引用 所属分类: ■ DirectX 9 Program

评论

# re: Direct3D中的颜色和资源 2009-03-09 11:18 张成

谢谢你的文章,写的很详细很认真很耐心。  回复  更多评论   

# re: Direct3D中的颜色和资源 2009-04-15 16:31 learner

写得很好 谢谢
  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

导航

统计

常用链接

随笔分类(178)

3D游戏编程相关链接

搜索

最新评论