表面我们可以将其看作是Direct3D主要用于储存2D图像数据的一个像素矩阵。虽然我们将表面看作矩阵,但是其实际的存储是在一个线性数组里面。

表面的宽度(Width)和高度(Height)都是用像素来表示,跨度(Pitch)则用字节来度量,更具体的说:跨度(Pitch)可能比宽度(Width)更宽,这要依赖于底层的硬件实现,所以不能简单的假设pitch = Width×Height。
在代码中我们使用接口:IDirect3DSurface9 来描述表面,该接口提供了几种从表面读取和写入数据的方法,以及一种获取表面相关信息的方法,接口IDirect3DSurface9里面最重要的方法如下:
LockRect:该方法用于获取指向表面储存区的指针,通过指针运算,可以对表面上的每一个像素进行读写操作。
UnlockRect:如果调用了LockRect方法,并且执行完成了访问表面的操作,必须调用该方法对操作的表面储存区进行解除锁定的操作。
GetDesc:该方法可以使用填充结构D3DSURFACE_DESC来获取表面的相关信息。
如果考虑表面跨度,锁定表面储存区然后对每一个像素进行操作,看起来有些复杂,但是这里有一个简单的程序,作用就是锁定表面的储存区以及将每一个像素设为红色,通过这段代码帮助理解:
//假设surface是指向IDirect3DSurface接口的点
//假设每一个像素都采用32位的像素模式
//得到一些表面的描述
D3DSURFACE_DES surfaceDesc;
_surface->GetDesc(&surfaceDesc);
//获取一个指向表面像素的指针
D3DLOCKED_RECT lockedRect;
_surface->LockRect(
&a

本文介绍了Direct3D中的基本概念——表面,它是一个2D图像数据的像素矩阵,存储在线性数组中。表面的宽度、高度以像素表示,跨度以字节度量,可能大于宽度。IDirect3DSurface9接口用于描述表面,包含LockRect、UnlockRect和GetDesc等关键方法。LockRect提供读写像素的访问,UnlockRect解锁表面,GetDesc获取表面信息。示例代码展示了如何锁定表面并设置所有像素为红色,强调了32位像素格式的重要性。

5160

被折叠的 条评论
为什么被折叠?



