|
|
发表于 2007-8-13 10:23:00
|
显示全部楼层
Re:请问:D3DXCreateVolumeTextureFromFile()第二个参数怎么设置?
hwbnet 4:00多还在奋战?牛人
这是我用的BuildCubeEnvMap,参考了微软的例子,很好用,只是效率方面.... -_-!
//创建动态的环境贴图,把场景渲染到3d的cubemap六面体的表面
void XEnvMapModel::BuildCubeEnvMap()
{
D3DXMATRIX mProj;
//求环境贴图成像所需要的投影矩阵,注意:是45度角的
D3DXMatrixPerspectiveFovLH(&mProj, D3DX_PI * 0.5f, 1.0f, 0.01f, 100.0f);
//加入了产生环境贴图的对象,需要自己来计算cubemap了
if(mEnvXModels.size()>0)
{
LPDIRECT3DSURFACE9 pRTOld = NULL;
//保存当前目标渲染表面
HR( gd3dDevice->GetRenderTarget(0, &pRTOld ));
LPDIRECT3DSURFACE9 pDSOld = NULL;
//保存当前模板表面
if( SUCCEEDED( gd3dDevice->GetDepthStencilSurface( &pDSOld ) ) )
{
//更换模板表面为自己创建的模板表面
HR( gd3dDevice->SetDepthStencilSurface( mpDepthCubeSurface ) );
}
D3DXMATRIX mViewPosInv;
D3DXMatrixIdentity(&mViewPosInv);
//Cube视点位于Cube的中心,Cube视点观察的对象都要变换到相对于Cube视点的位置,
//所以需要得到一个位移的逆变换的矩阵
mViewPosInv._41 = -mSceneWorld._41;
mViewPosInv._42 = -mSceneWorld._42;
mViewPosInv._43 = -mSceneWorld._43;
for( int nFace = 0; nFace < 6; ++nFace )
{
LPDIRECT3DSURFACE9 pSurf;
//得到当前需要渲染的表面
HR(mSelfCreateCubeEnvMap->GetCubeMapSurface( (D3DCUBEMAP_FACES)nFace, 0, &pSurf ));
//指定当前需要渲染的表面
HR(gd3dDevice->SetRenderTarget( 0, pSurf ));
RELEASE( pSurf );
//分别得到CubeEnvmap六个面的观察矩阵
D3DXMATRIX mCubeView = GetCubeMapViewMatrix((D3DCUBEMAP_FACES) nFace);
//被观测对象的做逆变换,变换到相对Cube视点的视图坐标系
D3DXMatrixMultiply(&mCubeView, &mViewPosInv, &mCubeView);
//绘制场景到cubemap的六个面上去,形成三维的Cube环境贴图
HR(gd3dDevice->Clear( 0L, NULL, D3DCLEAR_ZBUFFER, 0x000000ff, 1.0f, 0L ));
if(SUCCEEDED(gd3dDevice->BeginScene()))
{
//绘制所有被加入的光线追踪也就是需要反射,绘制到环境贴图的对象
for(UINT i = 0; i < mEnvXModels.size(); i ++)
{
mEnvXModels->Update(0, &mCubeView, &mProj);
mEnvXModels->Draw();
}
HR(gd3dDevice->EndScene());
}
}
if( pDSOld )
{
//恢复旧的模板表面
HR( gd3dDevice->SetDepthStencilSurface( pDSOld ) );
RELEASE( pDSOld );
}
//恢复之前保留的目标渲染表面
HR( gd3dDevice->SetRenderTarget( 0, pRTOld ) );
RELEASE( pRTOld );
}
//改变环境贴图的指向
mEnvMap = mSelfCreateCubeEnvMap;
}
|
|