/*******************************************************/
/* RenderIntoCubeTexture() - Рендеринг сцены в кубиче- */
/* скую текстуру. Подразумевается что объявлен и ини- */
/* циализирован объект LPDIRECT3DCUBETEXTURE9 pCubeMap */
/*******************************************************/
void RenderIntoCubeTexture()
{
//В этих переменных сохраняются матрицы вида и проекции
D3DXMATRIX OldViewMatrix,OldProjMatrix;
//Сохраняем матрицу вида и перспективы
pDirect3DDevice->GetTransform(D3DTS_VIEW,&OldViewMatrix);
pDirect3DDevice->GetTransform(D3DTS_PROJECTION,&OldProjMatrix);
//Сохраняем задний буффер и буффер глубины
LPDIRECT3DSURFACE9 pBackBuffer,pZBuffer;
pDirect3DDevice->GetRenderTarget(0,&pBackBuffer);
pDirect3DDevice->GetDepthStencilSurface(&pZBuffer);
//Устанавливаем новую матрицу проекции с 90 градусным FOV
D3DXMATRIX NewProjMatrix;
D3DXMatrixPerspectiveFovLH(&NewProjMatrix,D3DX_PI/2, 1.0f, 0.5f, 1000.0f);
pDirect3DDevice->SetTransform(D3DTS_PROJECTION,&NewProjMatrix);
// Для шести граней кубической текстуры :
for(DWORD i = 0; i < 6; i++)
{
D3DXVECTOR3 vEnvEyePt = D3DXVECTOR3(1,1,1);
D3DXVECTOR3 vLookAt,vUpVec;
switch(i)
{
case D3DCUBEMAP_FACE_POSITIVE_X:
vLookAt = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
vUpVec = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
break;
case D3DCUBEMAP_FACE_NEGATIVE_X:
vLookAt = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
vUpVec = D3DXVECTOR3( 0.0f, 1.0f, 0.0f);
break;
case D3DCUBEMAP_FACE_POSITIVE_Y:
vLookAt = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
vUpVec = D3DXVECTOR3(0.0f, 0.0f,-1.0f);
break;
case D3DCUBEMAP_FACE_NEGATIVE_Y:
vLookAt = D3DXVECTOR3(0.0f,-1.0f, 0.0f);
vUpVec = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
break;
case D3DCUBEMAP_FACE_POSITIVE_Z:
vLookAt = D3DXVECTOR3( 0.0f, 0.0f, 1.0f);
vUpVec = D3DXVECTOR3( 0.0f, 1.0f, 0.0f);
break;
case D3DCUBEMAP_FACE_NEGATIVE_Z:
vLookAt = D3DXVECTOR3(0.0f, 0.0f,-1.0f);
vUpVec = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
break;
}
//Обновляем позицию камеры для текущего случая
D3DXMATRIX NewViewMatrix;
D3DXMatrixLookAtLH(&NewViewMatrix,&vEnvEyePt,&vLookAt,&vUpVec);
pDirect3DDevice->SetTransform(D3DTS_VIEW,&NewViewMatrix);
//Получаем указатель на одну из поверхностей куб-мапа
LPDIRECT3DSURFACE9 pFace;
pCubeMap->GetCubeMapSurface((D3DCUBEMAP_FACES)i,0,&pFace);
//Устанавливаем в качестве рендер-таргета текущую поверхность кубмапа
pDirect3DDevice->SetRenderTarget(0,pFace);
pDirect3DDevice->SetDepthStencilSurface(pZBuffer);
pDirect3DDevice->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_ARGB(255,0,0,255),1.0f,0);
pDirect3DDevice->BeginScene();
//Тут отрисовываем те объекты сцены, отражения которых мы хотим видеть
//после применения кубической текстуры
//mesh->DrawSubset(0);
//pDirect3DDevice->SetMaterial(&mtrl);
//for(int i = 0; i < 4; i++)
//{
// // set material and world matrix for ith object, then render
// // the ith object.
// pDirect3DDevice->SetTransform(D3DTS_WORLD, &Worlds);
// Objects->DrawSubset(0);
//}
Box.Display();
pDirect3DDevice->EndScene();
SAFE_RELEASE(pFace);
}
//Восстанавливаем рендер-таргет и Z-буффер
pDirect3DDevice->SetRenderTarget(0,pBackBuffer);
pDirect3DDevice->SetDepthStencilSurface(pZBuffer);
SAFE_RELEASE(pBackBuffer);
SAFE_RELEASE(pZBuffer);
//Восстанавливаем исходные матрицы вида и проекции
pDirect3DDevice->SetTransform(D3DTS_VIEW,&OldViewMatrix);
pDirect3DDevice->SetTransform(D3DTS_PROJECTION,&OldProjMatrix);
}
Проблема с отражениями. CubeMap, Direct3D
Хочу сделать что-то наподобие примера из DX SDK с чайниками( пример в СДК слишком запутанный :( ) , чтобы в объекте было видно отражение окружающей его комнаты и находящихся в ней объектов. Использую CubeMap для этого, рендерю все что хочу увидеть отраженным в КубМап, накладываю эту кубическую текстуру на свой объект, но выглядит оно как-то не красиво :(
И не знаю как сделать динамическим это отражение, чтобы при вращении камеры вокруг объекта, отражение тоже менялось, там похоже надо пересчитывать матрицу вида при прорисовке в КубМап, но как не знаю...
Вообщем подскажите как правильно сделать динимические отражения в объекте.
мой код отрисовки в Кубмап :
Код: