Программирование графики с использованием Direct3D




Глава 10


    Глава 10. Полноэкранные приложения
    DirectDraw Изменение класса RMWin Приложение FullScreen Все программы, которые мы рассматривали до настоящего момента, были оконными приложениями. Такие приложения размещаются среди других окон на...
    DirectDraw
    DirectDraw это общецелевой API управления видеокартами, позволяющий определять и использовать любые поддерживаемые видеокартами возможности двумерной графики. Кроме того, DirectDraw может программ...
    Интерфейс DirectDraw
    DirectDraw, подобно Direct3D, предоставляет большую часть своих функциональных возможностей через главный интерфейс. Для абстрактного режима Direct3D, главным является интерфейс Direct3DRM. Главны...
    Уровни кооперации
    Степень контроля DirectDraw над видеокартой может быть настроена с помощью функции SetCooperativeLevel(). Уровень кооперации ( cooperative level ) определяет, в какой мере DirectDraw будет сотрудн...
    Видеорежимы
    Интерфейс DirectDraw позволяет нам определять и активировать видеорежимы. Для определения поддерживаемых видеорежимов предназначена функция EnumDisplayModes(). Найденный видеорежим может быть вклю...
    Переключение страниц
    Одной из важнейших возможностей DirectDraw является переключение страниц. Переключением страниц называется способ анимации при котором изображение подготавливается во внеэкранном буфере, а затем о...
    Поверхности
    В DirectDraw поверхностью ( surface ) называется область памяти, предназначенная для хранения изображений. Используемая поверхностью память может быть расположена как на видеокарте, так и в систем...
    Z-буфферизация
    Одно из преимуществ использования Direct3D в оконной среде автоматическое создание Z-буферов. В полноэкранных приложениях мы должны создать Z-буфер сами. Z-буфер это поверхность DirectDraw, облада...
    Палитры
    Для 8-разрядных видеорежимов необходима палитра. Для оконных приложений Direct3D автоматически создает и устанавливает палитру. В полноэкранных приложениях предоставить палитру должна наша програм...
    Модификация класса RMWin
    В главе4 мы обсуждали стратегию построения структуры классов, используемой для написания рассматриваемых в этой книге приложений. Наша стратегия состояла в создании двух унаследованных от MFC клас...
    Класс RMWin
    Степень модификации станет ясной, если вы сравните определение класса RMWin из главы4 с полноэкранной версией класса RMWin, приведенной в листинге10.1. Листинг 10.1. Класс RMWin class RMWin : publ...
    Удаление ненужных функций
    Первое отличие заключается в том, что четыре функции, присутствующие в оконной версии, отсутствуют в новом определении класса. Это обусловлено тем, что перечисленные ниже функции не требуются при...
    Добавление поддержки видеорежимов
    Полноэкранная версия класса RMWin предоставляет несколько функций, которые облегчают обнаружение и переключение видеорежимов. Вот эти функции: GetNumDisplayModes() ActivateDisplayMode() GetCurDisp...
    Функции работы с поверхностями
    Класс RMWin создает и обслуживает поверхности DirectDraw, необходимые для полноэкранных операций Direct3D. Как вы увидите позже в этой главе, иногда полезно создавать и отображать дополнительные п...
    Поддержка палитры
    Работающие в 8-разрядных видеорежимах полноэкранные приложения требуют, чтобы к каждой поверхности была присоединена созданная программой палитра. Класс RMWin получает палитры из файлов BMP. Для э...
    Функция OnCreate()
    Функция OnCreate() вызывается MFC для выполнения инициализации окна. В оконной версии RMWin, мы использовали OnCreate() только для инициализации интерфейса Direct3DRM. В полноэкранной версии функц...
    Функция InitDisplayMode()
    Функция InitDisplayMode() использует DirectDraw чтобы определить, какие видеорежимы поддерживаются установленной видеокартой. Эти данные используются для создания списка видеорежимов. Затем этот с...
    Функция InitMainSurfaces()
    Пришло время взглянуть на функцию InitMainSurfaces(). Хочу напомнить, что функция InitMainSurfaces() вызывается из функции OnCreate() сразу после обращения к функции InitDisplayMode(). Функция Ini...
    Функции работы с палитрой
    Класс RMWin предоставляет две функции, которые содействуют использованию палитр. Функция UsePalette() является защищенной функцией, позволяющей классу RMWin использовать палитру, хранящуюся в файл...
    Функция CreateDevice()
    Функция CreateDevice() вызывается из функции OnCreate(). Ее задачей является создание устройства Direct3D: BOOL RMWin::CreateDevice() { d3drm-CreateDeviceFromSurface(0, ddraw, backsurf, device); d...
    Функция ActivateDisplayMode()
    Класс RMWin предоставляет две версии функции ActivateDisplayMode(). Первая версия объявлена как защищенная и используется производными классами, чтобы сообщить классу RMWin о необходимости включен...
    Функция GetNumDisplayModes()
    Функция GetNumDisplayModes() это защищенная функция, возвращающая количество видеорежимов, обнаруженных функцией InitDisplayMode(). Функция объявлена и определена в определении класса RMWin: int G...
    Функция GetCurDisplayMode()
    Функция GetCurDisplayMode() возвращает индекс включенного в данный момент видеорежима: int GetCurDisplayMode() { return curdisplaymode; } Как и в случае с функцией GetNumDisplayModes(), простота ф...
    Функция GetDisplayModeDims()
    Функция GetDisplayModeDims() возвращает параметры указанного видеорежима: BOOL RMWin::GetDisplayModeDims(int index, DWORD w, DWORD h, DWORD d) { if (index 0 || index = totaldisplaymodes) return FA...
    Функция GetCurDisplayModeDims()
    Определение функции GetCurDisplayModeDims() выглядит следующим образом: BOOL RMWin::GetCurDisplayModeDims(DWORD w, DWORD h, DWORD d) { if (curdisplaymode 0 || curdisplaymode = totaldisplaymodes) r...
    Функция CreateSurface()
    Продолжим разговор о вспомогательных функциях и рассмотрим функцию CreateSurface(). Она создает внеэкранную поверхность DirectDraw, получая в качестве параметров требуемые ширину и высоту поверхно...
    Функция ClearSurface()
    Подобно функции CreateSurface(), функция ClearSurface() включена для того, чтобы сделать более простым написание классов, производных от RMWin. Функция ClearSurface() присваивает заданное значение...
    Функция Render()
    Функция Render() это последняя (и простейшая) функция класса RMWin, которую мы рассмотрим. Функция Render() объявлена, но не определена: virtual void Render() = 0; Render() это чисто виртуальная ф...
    Приложение FullScreen
    В оставшейся части главы мы изучим код приложения FullScreen. FullScreen это приложение Direct3D, работающее в полноэкранном режиме. Приложение использует полноэкранную версию класса RMWin, чтобы...
    Класс FullScreenWin
    Функциональность приложения FullScreen сосредоточена в классе FullScreenWin. В качестве базового класса для FullScreenWin используется класс RMWin, что можно увидеть в листинге10.8. Листинг 10.8....
    Функция FullScreenWin()
    Код конструктора класса FullScreenWin приведен в листинге10.9. Листинг 10.9. Функция FullScreenWin() FullScreenWin::FullScreenWin() { meshbuilder = 0; animation = 0; menusurf = 0; fpssurf = 0; sel...
    Функция CreateScene()
    Функция CreateScene() представлена в листинге10.10. Листинг 10.10. Функция CreateScene() BOOL FullScreenWin::CreateScene() { //-------- ПОВЕРХНОСТИ МЕНЮ И FPS -------- selectmode = GetCurDisplayMo...
    Функция CreateMenuSurface()
    Функция CreateMenuSurface() выглядит следующим образом: BOOL FullScreenWin::CreateMenuSurface() { menusurf = CreateSurface(menuwidth, menuheight); menurect.left = 0; menurect.top = 0; menurect.rig...
    Функция UpdateMenuSurface()
    Задача функции UpdateMenuSurface() (код которой приведен в листинге10.11) инициализировать содержимое поверхности меню видеорежимов. Листинг 10.11. Функция UpdateMenuSurface() BOOL FullScreenWin::...
    Функция CreateFPSSurface()
    Функция CreateFPSSurface() подходит к созданию поверхности немного по другому, чем функция CreateMenuSurface(). Функция CreateFPSSurface() сначала определяет размер поверхности, и только потом соз...
    Функция UpdateFPSSurface()
    Функция UpdateFPSSurface() вызывается при каждом обновлении экрана. Ее код показан в листинге10.13. Листинг 10.13. Функция UpdateFPSSurface() BOOL FullScreenWin::UpdateFPSSurface() { static const...
    Функция Render()
    Теперь пришло время посмотреть, как в нашем приложении осуществляется вывод на экран. Функция Render() вызывается из функции RMApp::OnIdle() и отвечает за обновление поверхности вторичного буфера...
    Функция KeyDown()
    Перед тем, как мы закончим изучение приложения FullScreen нам надо обсудить еще одну функцию. Функция KeyDown() является обработчиком сообщений, вызываемым каждый раз при нажатии клавиши. Код функ...
    Заключение
    Вот и все это последняя глава книги. Я надеюсь, что вы узнали все, что хотели, а может быть и немного больше. Удачи!...









Начало