SkeyePlayer依靠D3DRender强大的渲染能力我们可以实现很多视频编辑功能,比如电子放大功能,本文将深入D3DRender渲染引擎库代码,重点讲述其如何采用surface离屏表面技术来实现渲染视频图像呈现,以实现在surface上做电子放大缩略图显示等功能。
1. D3DRender初始化D3D创建设备
首先,我们需要创建一个D3D9设备用于操作系统软硬件资源来为我们的视频渲染服务,这个代码很简单,按照Direct3D教程即可实现,如下代码所示:
pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if (NULL == pD3D)
{
errCode = D3D_NOT_ENABLED;
return false;
}
//获取显卡张数
int adaptnum = pD3D->GetAdapterCount();
//_TRACE("共[%d]张显卡.\n", adaptnum);
//获取显卡支持的显示格式
if (FAILED(pD3D->GetAdapterDisplayMode(nAdapterNo, &d3dDisplayMode )) )
{
__SAFE_RELEASE(pD3D);
return false;
}
//_TRACE("显卡信息: %d X %d\tRefreshRate: %d\tFormat: %d\n", d3dDisplayMode.Width, d3dDisplayMode.Height, d3dDisplayMode.RefreshRate, d3dDisplayMode.Format);
if (FAILED(pD3D->CheckDeviceFormat(nAdapterNo, D3DDEVTYPE_HAL, d3dDisplayMode.Format, 0, D3DRTYPE_SURFACE, d3dFormat)))
{
_TRACE("CheckDeviceFormat 不支持指定的格式..\n");
errCode = D3D_FORMAT_NOT_SUPPORT;
__SAFE_RELEASE(pD3D);
return false;
}
//检查输入格式到显示格式的转换是否支持
if ( FAILED(pD3D->CheckDeviceFormatConversion(nAdapterNo, D3DDEVTYPE_HAL, d3dFormat, d3dDisplayMode.Format) ) )
{
errCode = D3D_FORMAT_NOT_SUPPORT;
__SAFE_RELEASE(pD3D);
return false;
}
//检查是否支持硬件顶点渲染方式
if ( FAILED(pD3D->GetDeviceCaps(nAdapterNo, D3DDEVTYPE_HAL, &d3dCaps) ) )
{
errCode = D3D_VERTEX_HAL_NOT_SUPPORT;
__SAFE_RELEASE(pD3D);
return false;
}
//检测硬件是否支持变换和灯光
INT vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
if ( d3dCaps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
{
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING; //硬件支持
}
else
{
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; //软件支持
}
memset(&d3dParameters, 0, sizeof(D3DPRESENT_PARAMETERS));
D3DFORMAT d3dFormatRender = D3DFMT_UNKNOWN;
d3dParameters.Windowed