(三)D3D9视频显示的渲染操作和保存

3.画面渲染与保存
1) 保存当前表面
GetRenderTarget 检索一个渲染目标的表面。
HRESULT GetRenderTarget( [in]  DWORD             RenderTargetIndex, [out] IDirect3DSurface9 **ppRenderTarget);
RenderTargetIndex : 渲染目标的索引.
ppRenderTarget : 指向IDirect3DSurface9接口的指针的地址,表示该设备的返回的render-target表面。
d3ddev->GetRenderTarget(0, &surface);

2) 开始渲染
开始渲染BeginScene 和 结束渲染EndScene。 Direct3D中规定所有绘制方法都必须在BeginScene()和EndScene()之间完成。这个函数没有参数。

3) 为设备设置一个新的颜色缓冲区
SetRenderTarget 为设备设置一个新的颜色缓冲区。
HRESULT SetRenderTarget( [in] DWORD             RenderTargetIndex, [in] IDirect3DSurface9 *pRenderTarget);
RenderTargetIndex : 渲染目标的索引。
pRenderTarget : 指向一个新的颜色缓冲区的指针。。新的 render-target表 面必须为 D3DUSAGE_RENDERTARGET权限,即:CreateTexture的第三个参数必须是D3DUSAGE_RENDERTARGET以上的权限

一般用法:
LPDIRECT3DDEVICE9 d3ddev = NULL;
LPDIRECT3DSURFACE9 pSurface = NULL;
d3ddev->SetRenderTarget(0, pSurface);

4) 为纹理填充颜色
通过IDirect3DDevice9接口的Clear()函数可以清理Surface,或者ColorFill可以进行颜色的填充。
Clear()函数的原型如下所示:
HRESULT  Clear(  
  DWORD  Count,  
  const  D3DRECT *pRects,  
  DWORD  Flags,  
 D3DCOLOR Color,  
  float  Z,  
  DWORD  Stencil  
);  

其中每个参数的含义如下所列:
Count:说明你要清空的矩形数目。如果要清空的是整个客户区窗口,则设为0; 
 pRects:这是一个D3DRECT结构体的一个数组,如果count中设为5,则这个数组中就得有5个元素。 
 Flags:一些标记组合。只有三种标记:D3DCLEAR_STENCIL , D3DCLEAR_TARGET , D3DCLEAR_ZBUFFER。 
 Color:清除目标区域所使用的颜色。 
 float:设置Z缓冲的Z初始值。Z缓冲还没研究过。 
 Stencil:这个在播放视频的时候也没有用到。

下面给出一个使用Direct3D时候IDirect3DDevice9的Clear()的典型代码。
Direct3DDevice9 * d3ddev ;  
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 0); 
上述代码运行完后,屏幕会变成白色(R,G,B取值为 255, 255, 255 )。

ColorFill:
允许应用程序用指定的颜色填充D3DPOOL_DEFAULT表面的矩形区域。
HRESULT ColorFill( [in]       IDirect3DSurface9 *pSurface, [in] const RECT              *pRect, [in]       D3DCOLOR          color);
pSurface : 指向要填充的表面的指针。
pRect : 指向源矩形的指针。使用NULL意味着整个表面将被填充。
color : 用于填充颜色。
这种方法只能应用于渲染目标、一个目标纹理表面,或者是一个带有  D3DPOOL_DEFAULT 的非屏幕平面平面。
用法:
od3ddev->ColorFill(opSurface, NULL, D3DCOLOR_XRGB(r, g, b));

5) 将画面从纹理转移到表面
StretchRect()可以将一个矩形区域的像素从设备内存的一个Surface转移到另一个Surface上。StretchRect()函数的原型如下。
HRESULT StretchRect( [in]       IDirect3DSurface9    *pSourceSurface, [in] const RECT                 *pSourceRect, [in]       IDirect3DSurface9    *pDestSurface, [in] const RECT                 *pDestRect, [in]       D3DTEXTUREFILTERTYPE Filter);
pSourceSurface:指向源Surface的指针。
pSourceRect:使用一个 RECT结构体指定源Surface需要复制的区域。如果为NULL的话就是整个区域。
pDestSurface:指向目标Surface的指针。
pDestRect:使用一个 RECT结构体指定目标Surface的区域。
Filter:设置图像大小变换的时候的插值方法。例如:
D3DTEXF_POINT:邻域法。质量较差。
D3DTEXF_LINEAR:线性插值,最常用。
下面给出的代码将纹理表面的数据传给了后台缓冲表面。
LPDIRECT3DDEVICE9 d3ddev = NULL;
LPDIRECT3DSURFACE9 surface = NULL;
LPDIRECT3DSURFACE9 pSurface = NULL;
d3ddev->StretchRect(pSurface, NULL, surface, NULL, D3DTEXF_LINEAR);

6) 从设备的交换链中检索一个备份缓冲区
使用IDirect3DDevice9接口的GetBackBuffer() 可以获得后台缓冲表面。
HRESULT GetBackBuffer( [in]          UINT                iSwapChain, [in]          UINT               BackBuffer, [in]          D3DBACKBUFFER_TYPE Type, [out, retval] IDirect3DSurface9  **ppBackBuffer);
iSwapChain:指定正在使用的交换链索引。
BackBuffer:后台缓冲表面索引。
Type:后台缓冲表面的类型。
ppBackBuffer:保存后台缓冲表面的LPDIRECT3DSURFACE9对象。
LPDIRECT3DDEVICE9 d3ddev = NULL;
LPDIRECT3DSURFACE9 surface = NULL;
d3ddev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &surface);

7) 进行屏幕显示
使用IDirect3DDevice9接口的Present ()显示结果。Present ()的原型如下。
HRESULT Present( [in] const RECT    *pSourceRect, [in] const RECT    *pDestRect, [in]       HWND    hDestWindowOverride, [in] const RGNDATA *pDirtyRegion);
pSourceRect:你想要显示的后台缓冲表面区的一个矩形区域。设为NULL则表示要把整个后台缓冲表面区的内容都显示。 
pDestRect:表示一个显示区域。设为NULL表示整个客户显示区。 
hDestWindowOverride:你可以通过它来把显示的内容显示到不同的窗口去。设为NULL则表示显示到主窗口。 
pDirtyRegion:一般设为NULL
LPDIRECT3DDEVICE9 d3ddev = NULL;
d3ddev->Present(NULL, NULL, NULL, NULL);

8) 保存渲染内存的数据
IDirect3DDevice9接口的D3DXSaveSurfaceToFile和D3DXSaveTextureToFile可以将缓存中的数据以文件的形式进行保存。其中:
D3DXSaveSurfaceToFile将一个表面保存到一个文件中。
HRESULT D3DXSaveSurfaceToFile( _In_       LPCTSTR              pDestFile, _In_       D3DXIMAGE_FILEFORMAT DestFormat, _In_       LPDIRECT3DSURFACE9   pSrcSurface, _In_ const PALETTEENTRY         *pSrcPalette, _In_ const RECT                 *pSrcRect);
pDestFile : 指向要保存到的文件路径和文件名。DestFormat :进行保存的格式。pSrcSurface : 指向IDirect3DSurface9接口的指针,主要是一个表面的缓存区包含要保存的图像。pSrcPalette : 指针指向一个包含256种颜色的调色板结构。这个参数可以是NULL。pSrcRect : 指向一个矩形结构的指针。指定源矩形。将该参数设置为NULL,以指定整个图像。
LPDIRECT3DSURFACE9 surface = NULL;
D3DXSaveSurfaceToFile(filename, D3DXIFF_BMP, pSurface, NULL, NULL);

D3DXSaveTextureToFile将纹理保存到文件中。
HRESULT D3DXSaveTextureToFile( _In_       LPCTSTR                pDestFile, _In_       D3DXIMAGE_FILEFORMAT   DestFormat, _In_       LPDIRECT3DBASETEXTURE9 pSrcTexture, _In_ const PALETTEENTRY           *pSrcPalette);
pDestFile : 指向要保存到的文件路径和文件名。DestFormat : 进行保存的格式。pSrcTexture : 指向IDirect3DBaseTexture9接口的指针,包含要保存的纹理。pSrcPalette : 指针指向一个包含256种颜色的调色板结构。这个参数可以是NULL。
LPDIRECT3DTEXTURE9 pTexture = NULL;
D3DXSaveTextureToFile(in_file, D3DXIFF_BMP, pTexture, NULL);
4.第三设备数据交换和保存
进行第三设备的初始化和保存,用到的函数均已列出这里不在细说。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值