公告板类中主要有Create和Render函数。
Create中主要是得到纹理的变量mFace。普通的可由D3DXCreateTextureFromFile加载。但是有复杂的情况时,既有文字又有图片时,我们用类CRenderedTexture来完成加载mFace。
HRESULT CRenderedTexture::Create( LPDIRECT3DDEVICE9 DVC,int iW,int iH )
{
if (!DVC)
{
return S_FALSE;
}
mDVC=DVC;
mDVC->CreateTexture(iW,iH,1,
D3DUSAGE_RENDERTARGET,
D3DFMT_A8R8G8B8,
D3DPOOL_DEFAULT,&mFace,NULL);
if (!mFace)
{
return S_FALSE;
}
}
HRESULT CRenderedTexture::BeginRender()
{
mDVC->GetRenderTarget(0,&mOldSurface);
if (!mOldSurface)
{
return S_FALSE;
}
LPDIRECT3DSURFACE9 Surface;
if (!mFace)
{
return S_FALSE;
}
mFace->GetSurfaceLevel(0,&Surface);
mDVC->SetRenderTarget(0,Surface);
Surface->Release();
mDVC->GetTransform(D3DTS_WORLD,&mOldWorld);
mDVC->GetTransform(D3DTS_VIEW,&mOldView);
mDVC->GetTransform(D3DTS_PROJECTION,&mOldProj);
mDVC->Clear(0,0,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,0x0,1.0f,0.0f);
mDVC->BeginScene();
return S_OK;
}
HRESULT CRenderedTexture::EndRender()
{
mDVC->EndScene();
mDVC->SetRenderTarget(0,mOldSurface);
mDVC->SetTransform(D3DTS_WORLD,&mOldWorld);
mDVC->SetTransform(D3DTS_VIEW,&mOldView);
mDVC->SetTransform(D3DTS_PROJECTION,&mOldProj);
return S_OK;
}
void CRenderedTexture::Render( LPRENDERFUNC pRender,float fPass )
{
if (pRender)
{
BeginRender();
(*pRender)(fPass);
EndRender();
}
}
此类的工作原理是,首先记录原来的IDirect3DSurface9,以及世界,视野,投影矩阵。用手动创建的Texture设置新的IDirect3DSurface9,在此新的上面渲染,完成后还原之前的渲染参数。由于Render中的渲染内容不能确定,所以用了函数指针,在调用时确定具体的渲染。
浙公网安备 33010602011771号