Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с отражениями. CubeMap, Direct3D

1.9K
03 августа 2007 года
Nigger
71 / / 09.04.2005
Пытаюсь реализовать динамические отражения в объекте, но все никак..
Хочу сделать что-то наподобие примера из DX SDK с чайниками( пример в СДК слишком запутанный :( ) , чтобы в объекте было видно отражение окружающей его комнаты и находящихся в ней объектов. Использую CubeMap для этого, рендерю все что хочу увидеть отраженным в КубМап, накладываю эту кубическую текстуру на свой объект, но выглядит оно как-то не красиво :(
И не знаю как сделать динамическим это отражение, чтобы при вращении камеры вокруг объекта, отражение тоже менялось, там похоже надо пересчитывать матрицу вида при прорисовке в КубМап, но как не знаю...

Вообщем подскажите как правильно сделать динимические отражения в объекте.

мой код отрисовки в Кубмап :
Код:
/*******************************************************/
/* 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);
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог