После создания окна приложения, первым объектом, который мы создадим будет объект Direct Draw. Да-да, без DirectDraw нам не обойтись, поэтому если Вы еще не изучали, что это такое, обратитесь лучше сначала к соответствующей статье Уголка DirectX. Объект DirectDraw понадобится для установки уровня приоритета приложения (cooperative level), а также он будет использован для создания буферов: главной поверхности и заднего буфера, на который будет происходить рендеринг. Эти определения поместите в раздел Declarations:
Итак, создадим объект DirectDraw, как показано далее:
Эта строка кода создает объект DirectDraw путем вызова глобальной функции DirectDrawCreate. В качестве параметра эта функция содержит пустую строку, что означает, что создается объект DirectDraw для активного драйвера дисплея. Для оборудования, не поддерживающего GDI, например 3D ускорителей, работающих с отдельной 2D картой, необходимо точно указать глобальный уникальный идентификатор (GUID) желаемого драйвера, то есть указать, какой драйвер устройства вы хотите использовать. Приложение Triangle устанавливает уровень совместного использования ресурсов с помощью метода DirectDraw7.SetCooperativeLevel. Так мы скажем системе о том, в каком режиме мы хотим работать - в полноэкранном или оконном. (Учтите, что некоторое оборудование не может работать в оконном режиме. Вы можете обнаружить такое оборудование через отсутсвие флага DDCAP2_CANRENDERWINDOWED при вызове DirectDraw7.GetCaps). Режим, который уже установлен перед вызовом функции также называется "нормальным". Вы можете указать его через флаг DDSCL_NORMAL, передаваемый в SetCooperativeLevel. Однако этот метод может дать сбой, если уже запущено приложение работающее в полнооконном эксклюзивном режиме.
После того, как вы создали объект DirectDraw и определили совместный режим, надо создать буфера, которые будут содержать главную поверхность и отрендеренную сцену. Наше приложение будет работать в окне. Вообще, оконный режим работает медленнее, чем полноэкранный - это факт. Кроме того, в оконном режиме недоступны различные функции полноэкранного режима. Но пока нам этого и не требуется. Создадим для начала главную поверхность.
Описание главной поверхности не содержит информацию о размерах или глубине цвета. Принимается текущий режим дисплея. После создания главной поверхности, создадим буфер для рендеринга. В случае нашего приложения-примера, буфером будет отдельная внеэкранная поверхность, которая создается следующим образом:
Предыдущий код создает внеэкранную поверхность, эквивалентную по размерам окну приложения. Как показано в этом коде, вы должны включить возможность DDSCAPS_3DDEVICE для любой поверхности, которая будет использована, как целевая для рендеринга. Эта возможность дает указание системе выделить дополнительные внутренние структуры данных для 3D рендеринга. После создания главной поверхности и поверхности для рендеринга, вы можете создать и прикрепить объект DirectDrawClipper к главной поверхности. Использование этого объекта определяет экранные границы, освобождая вас от обработки случаев, когда окно приложения частично закрыто другим окном или окно частично находится за пределами экрана. Таким образом, клипперы не являются необходимыми для полноэкранных приложений. Следующий код создает клиппер и прикрепляет его к главной поверхности:
Создав все объекты DirectDraw вы можете приступать к созданию объектов Direct3D, которые понадобятся для рендеринга сцены. Эти определения, относящиеся к объектам D3D, поместите в раздел Declarations
Создадим объект Direct3D:
После создания объекта Direct3D7 вы должны создать устройство рендеринга, используя метод Direct3D7.CreateDevice. Этот метод подтверждает глобальный уникальный идентификатор (GUID) желаемого устройства и объект DirectDrawSurface7 (в нашем случае g_ddsBackBuffer), на который будет происходить рендеринг. Эта поверхность должна быть создана, как 3D устройство путем включения при его инициализации возможности DDSCAPS_3DDEVICE. Однако перед тем, как создавать устройство рендеринга, надо проверить на совместимость с режимом дисплея. Если дисплей установлен в режиме палитры (т. е. палитра цветов количество 256 и меньше), наше приложение выйдет. Попытка создать устройство для поверхности с палитрой без ассоциирования его с палитрой приведет к краху. Пока мы не будем рассматривать режимы работы с палитрой для удобства. Нормальное приложение должно прикреплять свою палитру к поверхности для рендеринга или требовать, чтобы экран был установлен в режим не менее 16-битного цвета.
Затем, приложение создает устройство рендеринга:
Вызов Direct3D7.CreateDevice может дать сбой по многим причинам. Самая частая из них - это когда главная видеокарта не поддерживает свойств 3D. Другая возможность - когда оборудование, управляющее дисплеем не может совершать рендеринг в текущем режиме экрана. Все эти возможности, по-хорошему, должны быть отловлены при подготовке к созданию объекта. Однако, дял поддержания простоты кода примера, все возможности здесь не учтены. Обратите внимание, что хотя CreateDevice и использует объект DirectDrawSurface7, он создает устройство, которое работает отдельно от объекта поверхности DirectDraw. Устройство рендеринга использует поверхность DirectDraw как цель для совершения своих операций. После того, как устройство рендеринга создано, вы можете создать объект Viewport и назначить его устройству. Коротко, этот объект определяет, как геометрия в 3D сцене обрезается и представляется в 2D пространство экрана. Процесс создания объекта Viewport начинается с установки параметров в тип D3DVIEWPORT7. Наше приложение устанавливает параметры Viewport соответственно размерам поверхности для рендеринга.
Когда тип параметров объекта Viewport готов, надо передать параметры Viewport устройству рендеринга.
Теперь, кэшируем параметры Viewport в структуру RECT; мы будем использовать эту информацию позже.
Наконец мы создали все самые необходимые объекты DirectX, которые понадобятся нам для работы. В следующем шаге мы перейдем к объявлению объектов, которые понадобятся для рендеринга сцены.
|