3D中表现2D

来源:互联网 发布:mac pro如何强制关机 编辑:程序博客网 时间:2024/04/26 07:25
学习笔记,还没有看,临时存放一下

你如果要在3D中表现2D的话,就要用我说的那种办法

如果单纯的2D的话

可以看D7的DDraw方面的资料,在D9中也是支持的

如果非要用D3D的话

D9里有个IDirect3DSurface9,你可以查它的帮助看看用法

给个小例子,很简单的换页,跟DDraw差不多

#include <d3d9.h>
#include <d3dx9.h>

LPDIRECT3D9 pD3D=NULL;              //D3D9对象接口
LPDIRECT3DDEVICE9 pD3DDevice=NULL;  //D3D9设备对象接口
IDirect3DSurface9* srcSurface=NULL; //离屏页面
IDirect3DSurface9* backbuffer = NULL;//后台页面

/*********************************************************************
* InitDirect3D
*********************************************************************/
bool InitDirect3D(HWND hWnd,int w,int h,bool fullScreen)
{
//创建D3D对象
if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
{
return false;
}
//填充D3DPRESENT_PARAMETERS结构
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof( d3dpp ) );

d3dpp.Windowed = !fullScreen;//窗口模式
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;//换页方式
d3dpp.BackBufferCount = 1;//后台页面数
d3dpp.BackBufferHeight = h;//后台页面高
d3dpp.BackBufferWidth = w;//后台页面宽
d3dpp.hDeviceWindow = hWnd;//窗句柄
if (!fullScreen)//根据窗口模式设置后台页面格式
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
else
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
//创建D3D设备对象
if( FAILED( pD3D->CreateDevice( D3DADAPTER_DEFAULT,//县卡类型,默认为主显卡
D3DDEVTYPE_REF,//设备类型  HAL硬件加速 REF微软推荐 SW软加速
hWnd,//窗口句柄
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,//D3DPRESENT_PARAMETERS结构
&pD3DDevice)))//设备指针
{
return false;
}

//创建离屏页面
if (FAILED(pD3DDevice->CreateOffscreenPlainSurface(
w, // 宽
h, // 高
d3dpp.BackBufferFormat,//D3DFMT_X8R8G8B8, // 页面格式
D3DPOOL_DEFAULT, //页面存放位置 SYSTEMMEM内存 DEFAULT显存或内存
&srcSurface, //页面指针
NULL))) //保留
{
return false;
}
  //载入图片到离屏页面
  if ( FAILED(D3DXLoadSurfaceFromFile(srcSurface,//目的页面
  NULL,//目的页面调色板
  NULL,//目的页面区域
  "D:/程序/DX/D3D9/pic/zl.bmp",//源文件路径
  NULL,//源文件区域
  D3DX_DEFAULT,//文件过滤类型
  0,//ColorKey
  NULL )))//图片信息
  {
  return false;
  }
  return true;
}

/*********************************************************************
* Render
*********************************************************************/
void RenderD3D ()
{
if( NULL == pD3DDevice )
return;
//清屏
pD3DDevice->Clear( 0,//矩形数目
NULL, //矩形范围  第一个参数不为0时有效
D3DCLEAR_TARGET,//清除标志
D3DCOLOR_XRGB( 0,0,0),//颜色
1.0f, //Zbuffer
0 );//stencil buffer.
    //得到后台页面
pD3DDevice->GetBackBuffer( 0,//换页描绘
0,//Buffer链索引
D3DBACKBUFFER_TYPE_MONO,//唯一有效的值
&backbuffer);//后台页面指针
//页面拷贝
pD3DDevice->StretchRect(srcSurface,//源页面
NULL,//源页面区域
backbuffer,//目的页面
NULL,//目的页面区域
D3DTEXF_NONE );//过滤类型
//翻页
pD3DDevice->Present( NULL, //源区域 Null为整个后台页面
NULL, //目的区域
NULL,
NULL );//Buffer Null为全部Buffer
}
/*********************************************************************
* CleanUpD3D
*********************************************************************/
void CleanUpD3D ()
{
//释放对象
if (srcSurface!=NULL)
srcSurface->Release;
    if (backbuffer!=NULL)
backbuffer->Release;
if( pD3DDevice != NULL )
pD3DDevice->Release();
if( pD3D != NULL )
pD3D->Release();
}
原创粉丝点击