До сих пор мы производили отображение (вывод) всей сцены непосредственно на форму. Вообще многие графические библиотеки, в том числе и Direct3D, позволяет перенаправить весь вывод не на экран, а в текстуру. С одной стороны этот механизм является довольно простым и понятным, а с другой – очень мощным, позволяющим создавать различные эффекты, среди которых построение зеркальных поверхностей и теней. Вывод в текстуру представляет собой некое расширение вывода на поверхность. Вначале мы должны объявить в программе два объекта – саму текстура и связанную с ней поверхность вывода. Это реализуется следующим образом:
| C++ |
LPDIRECT3DTEXTURE9 RenderTexture = NULL; LPDIRECT3DSURFACE9 RenderSurface = NULL; |
| Pascal |
var RenderTexture: IDirect3DTexture9; RenderSurface: IDirect3DSurface9; |
Следующий шаг заключается в создании текстуры. Это можно проделать, воспользовавшись, к примеру, функцией D3DXCreateTexture(). Первый аргумент функции это ссылка на устройство вывода; второй и третий параметры задают ширину и высоту создаваемой текстуры соответственно; четвертый аргумент определяет количество мип- уровней (в нашем случае мип-уровни не используются, поэтому передаем ноль); пятый параметр – флаги использования (в нашем случае необходимо передать константу D3DUSAGE_RENDERTARGET, указывающую на то, что текстура будет использоваться как поверхность вывода); шестой аргумент задает пиксельный формат текстуры (здесь, как правило, наиболее часто используются константы D3DFMT_R8G8B8, D3DFMT_A8R8G8B8, D3DFMT_R5G6B5 и др.); седьмой параметр – это флаг месторасположения (хранения) текстуры (здесь передаем значение по умолчанию); и последний восьмой аргумент функции – это имя переменной, в которую будет возвращен результат. Ниже приводи тся пример создания текстуры размером 512х512 пикселей.
| C++ |
D3DXCreateTexture(device, 512, 512, 0, D3DUSAGE_RENDERTARGET, D3DFMT_R8G8B8, D3DPOOL_DEFAULT, &RenderTexture); |
| Pascal |
D3DXCreateTexture(device, 512, 512, 0, D3DUSAGE_RENDERTARGET, D3DFMT_R8G8B8, D3DPOOL_DEFAULT, RenderTexture); |
| C++ | RenderTexture->GetSurfaceLevel(0, &RenderSurface); |
| Pascal | RenderTexture.GetSurfaceLevel(0, RenderSurface); |
| C++ | device->SetRenderTarget(0, RenderSurface); |
| Pascal | device.SetRenderTarget(0, RenderSurface); |
| C++ | LPDIRECT3DSURFACE9 BackBuffer = NULL; … device->GetRenderTarget(0, &BackBuffer); |
| Pascal | var BackBuffer: IDirect3DSurface9; … device.GetRenderTarget(0, BackBuffer); |
| C++ | device->SetRenderTarget(0, BackBuffer); |
| Pascal | device.SetRenderTarget(0, BackBuffer); |
| C++ | D3DXSaveTextureToFile("scene.bmp", D3DXIFF_BMP, RenderTexture, NULL); |
| Pascal | D3DXSaveTextureToFile('scene.bmp', D3DXIFF_BMP, RenderTexture, nil); |
