D3D:Surfaces (2)

Page Flipping and Back Buffering

page flipping在多媒体,动画,游戏中非常关键。它类似于用一个本子做的动画。 D3D通过swap chain实现page flipping。

Copying to Surfaces

当使用IDirect3DDevice9::UpdateSurface,传入一个矩形,或者NULL代表整个surface。同时传入一个目标surface上的点,告诉源surface要拷贝到的位置。该方法不支持flipping。只有在源举行跟相关目标矩形完全在源surface跟目标surface内的时候,该操作才可能成功。该方法也不支持alpha blending,color keys,格式转换。同时,源跟目标surface必须不同!

如下方法同样可以做从图片到surface的拷贝。
D3DXLoadSurfaceFromFile
D3DXLoadSurfaceFromFileInMemory
D3DXLoadSurfaceFromMemory
D3DXLoadSurfaceFromResource
D3DXLoadSurfaceFromSurface

Copying Surfaces

术语blit是bit block transfer的缩写,它是传输blocks of data从内存的一个地方到另一个地方的过程。blitting device driver infterface(DDI)是D3D9中主要的移动大块矩形pixes,per-frame basis,的机制。IDirect3DDevice9::Present就是用的这个机制。blit操作中的“运输”是通过IDirect3DDevice9::UpdateTexture方法进行的。

Accessing Surface Memory Directly

可以通过IDirect3DSurface9::LockRect方法直接访问surface memory。当调用该方法时,pRect参数是一个指向RECT结构体的指针,描述了surface上的矩形区域。如果想锁住整个surface,设置pRect为NULL。如果两个矩形不重叠,两个线程或这进程可以同时锁住一个surface上的多个矩形区域。multisample back buffer是不能锁的。

IDirect3DSurface9::LockRect方法会填充D3DLOCKED_RECT结构体,信息包括pitch跟锁住区域bits的指针。当使用完后,一定要记住IDirect3DSurface9::UnlockRect。

当操纵锁住的矩形区域时,以下是要注意的问题:
永远要检查pitch信息,不要想当然的自己算出一个常数来。

不要忘记unlock。

限制程序的活动,当surface被锁时。

在拷贝时,一定不要导致display memory溢出。

只有在swap chain以D3DPRESENTFLAG_LOCKABLE_BACKBUFFER标志创建时,back buffer surfaces才有可能被lock。

Private Surface Data

我们可以存储任何类型的程序数据在surface中。比如,代表地图的一个surface可能含有terrain,地形,信息。

一个surface可能还有不止一个私有data buffer。每个buffer由GUID识别,当你attach数据到surface上时。

要存储私有surface data,调用setPrivateData,参数为source buffer的指针,数据的大小,数据的GUID。SetPrivateData会在内部分配内存,然后做拷贝。这时,你就可以安全的删除源buffer了。内存会被释放,当FreePrivateData被调用。这是自动发生的,当surface被free的时候。

要为某个surface取得private data,必须分配好大小正确的一块buffer,然后调用GetPrivateData方法,传入GUID参数。这里,需要我们负责我们创建的buffer的内存管理。如果你不知道分配多到size的buffer,先以零大小的size调用一次GetPrivateData,他会返回buffer的大小。

Gamma Controls

Gamma Controls允许我们改变系统如何显示surface的内容,并不会影响surface内容本身。可以把这些controls当作非常简单的过滤器,在surface被渲染到屏幕之前的过程中所加的对surface上数据的操作。

gamma control是swap chain的一个属性。gamma control可以使我们动态控制surface的RGB level如何map到系统显示器的真实level。

IDirect3DDevice9::SetGammaRamp和IDirect3DDevice9::GetGammaRamp方法允许我们控制ramp level,当swap chain是windowed,gamma ramp可以被应用。swap chain一旦被创建,gamma chain就会立即生效。

Gamma Ramp Level

DAC: digital to Analog Converter. GUID:globally unique identifier

术语gamma ramp,灰度系数斜率,描述了pixel中RGB的map关系。D3D从frame buffer中拿出一个pixel,查看它的R,G,B component,每个component都被一个0~65535之间的值代表。D3D拿着这个值在一个有256个元素的数组中索引出一个值,然后用该值替代原来的值。这样就改变了surface最终显示在屏幕上的样子。

Setting and Retriving Gamma Ramp Levels

我们设置的ramp level只有在程序是全屏的时候,才生效。SetGammaRamp接受两个参数,一个是D3DSGR_CALIBRATE/D3DSGR_NO_CALIBRATION,另一个是D3DGAMMARAMP结构体,包含了三个含有256个WORD元素,分别代表RGB.GetGammaRamp的参数是D3DGAMMARAMP结构体。calibrator会设置新的gamma level,它会保证gamma值的一致性,绝对性,无论用户是什么样的display adapter跟显示屏。但是该动作是有overhead的,也并不是所有的显卡都支持,需要看一下D3DCAPS9来确定一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值