Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DirectX: рендеринг в текстуру, как отрендерить сцену в текстуру? 
V
    Опции темы
BEOWOLF
Дата 27.7.2011, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 24.8.2007

Репутация: нет
Всего: 2



Необходимо отрендерить сцену в текстуру, которую в дальнейшем нужно будет натягивать на объекты. Для этого я сначала создаю текстуру 1024x1024, в которую будет рендериться сцена:
Код

IDirect3DTexture9* RenderTexture;
V(D3DXCreateTexture(pd3dDevice, 1024, 1024, 0, D3DUSAGE_RENDERTARGET, D3DFMT_R8G8B8, D3DPOOL_DEFAULT, &RenderTexture));

затем написал следующий код рендеринга:
Код


    IDirect3DSurface9* BackBuffer = 0;
    pd3dDevice->GetRenderTarget(0, &BackBuffer);
    IDirect3DSurface9* RenderSurface = NULL;
    V(RenderTexture->GetSurfaceLevel(0, &RenderSurface));
    V(pd3dDevice->SetRenderTarget(0, RenderSurface));

    // Render the scene
    if( SUCCEEDED( pd3dDevice->BeginScene() ) )
    {
        // тут рендерится сцена

        V( pd3dDevice->EndScene() );
    }

    V(pd3dDevice->SetRenderTarget(0, BackBuffer));

    V(D3DXSaveTextureToFile(L"scene.png", D3DXIFF_PNG, RenderTexture, NULL));

    SAFE_RELEASE(RenderSurface);
    SAFE_RELEASE(BackBuffer);

Чтобы посмотреть что отредерилось, вставил строку для записи текстуры в файл. В результате записывается картинка 1024*1024 со всяким мусором вместо сцены, хотя если рендерить просто в бэкбуфер, то всё нормально отображается на экране. Вопрос: что я делаю не так?

Это сообщение отредактировал(а) BEOWOLF - 27.7.2011, 16:09
PM MAIL   Вверх
BEOWOLF
Дата 27.7.2011, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 24.8.2007

Репутация: нет
Всего: 2



Только что проверил, в текстуру 512x512 и меньше - всё выводится, а в 1024x1024 - не выводится. Размер исходного рендер таргета 800x600, может это где-то как-то увязано?
PM MAIL   Вверх
BEOWOLF
Дата 27.7.2011, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 24.8.2007

Репутация: нет
Всего: 2



Разобрался, в каком варианте правильно работает smile 
Текстуру лучше всего создавать при событии OnD3D9ResetDevice следующим образом:
Код

V(D3DXCreateTexture(pd3dDevice, pBackBufferSurfaceDesc->Width, pBackBufferSurfaceDesc->Height, 1, D3DUSAGE_RENDERTARGET, pBackBufferSurfaceDesc->Format, D3DPOOL_DEFAULT, &g_RenderTexture));

где pBackBufferSurfaceDesc - указатель на D3DSURFACE_DESC бэкбуфера. Таким образом, создаётся текстура 800x600, а не кратная 2, и её дальше можно использовать как обычную текстуру при дальнейшем рендеринге smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0815 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.