Как обычно, начну с оговорок. Первое – для меня большая проблема
перевести некоторые термины. Поэтому я думаю может и не стоит их переводить. :-)
Вот список терминов, которые вызывают у меня трудности с переводом:
blitting - blit сокращение от "bit block transfer" пересылка блоков
данных из одной области видеопамяти в другую.
Перед тем как приступить я хотел бы сделать пару оговорок. Во-первых для
использования DirectX в Delphi необходим файл с заголовками, где объявлены имена
функций DirectX API либо какой-нибудь компонент, позволяющий обращаться к
интерфейсу DirectX через свои методы. В момент написания сего опуса я использую
компонент DelphiX (автор - Hiroyuki Hori), распространяемый бесплатно - http://www.yks.ne.jp/~hori/DelphiX-e.html. (если у вас есть
что-нибудь получше и Вы поделитесь со мной - я буду очень признателен.)
В этот раз мой новый урок будет посвящён азам использования интерфейса Direct3D
- наиболее сложного и объёмного из состава DirectX8 SDK.
Я не собираюсь рассказывать, как построить объёмный кубик или классический
чайник в пространстве, нет. Вместо этого я решал затронуть довольно интересную
тему - как организовать вывод 2D-графики посредством Direct3D. Я решил заняться
этим вопросом, т. к. всё чаще API трёхмерного моделирования используются для
создания плоских изображений. Соответсвенно и я собираюсь перевести свои
программы на новы рельсы.
Прошёл месяц с тех пор как я написал первую часть ( http://www.delphikingdom.com/helloworld/directx.htm ) статьи
по использованию DirectX в среде Delphi. У меня накопилось ещё несколько
примеров, которые, надеюсь, послужат наглядным руководством для начинающих.
Прежде, чем описывать предложенные общему вниманию программы, хочу сообщить о
некоторых изменениях в их коде по сравнению с примерами первой статьи, чтобы не
останавливаться впоследствии на этих мелких деталях.
Как и обещал, я продолжаю искать новый материал по DirectX, переводить его на
язык Object Pascal и представлять всеобщему вниманию. Недавно у меня появилась
идея снятия скриншотов с экрана DirectDraw-программы и записи изображения в
простой bmp-файл - некоторые игры позволяют это делать, и я решил последовать их
примеру. Потом я наткнулся на другой интересный материал - речь шла о загрузке
изображения из bmp-файла без использования функции LoadImage(). Поэтому тема
статьи всецело посвящена работе с bmp-файлами на "низком уровне". Замечу, что
это немного сложные вещи, но мы ведь сложностей не боимся, правда? Иначе
непонятно, зачем тогда заниматься изучением DirectX вообще.
Фанаты игр часто встречаются с аббревиатурой "DirectX". На упаковках игр для
Windows 95 она появилась в конце 1995 года примерно одновременно с выходом самой
операционной системы. С тех пор качество игр резко ушло вверх, достигнув
небывалых высот. Что же такое DirectX? Это набор специальных API, которые
предоставляют работающей программе прямой доступ к аппаратной части компьютера,
обеспечивая наивысшее быстродействие при выводе графики, звука, получения данных
от устройств ввода и т. д. Сразу надо сказать, что библиотека создавалась
исключительно для игр, т. к. именно они требуют от аппаратных средств все 100%
производительности. Позднее, с выходом новых версий, DirectX нашёл применение и
в мультимедиа-области.
Теперь вы готовы создавать поверхности отображения. В DirectDraw поверхность
отображения представляет собой линейную область экранной памяти, к которой можно
получить непосредственный доступ для манипуляций. Поверхность отображения,
которую вы видите на экране, называется основной поверхностью. Она представляет
память видимого кадрового буфера на карте отображения. Вы также можете иметь
невидимые поверхности, которые определяются как внеэкранные, или оверлейные
поверхности. Подобное может существовать либо в регулярной системной памяти,
либо во внеэкранной области памяти на самой графической карте. Для того, чтобы
создать ситуацию с мелькающими страницами, необходима основная поверхность и, по
крайней мере, одна внеэкранная поверхность для осуществления отображения. Для
того, чтобы внеэкранная поверхность могла появляться и исчезать на экране,
онадолжна находится в видеопамяти. Тем не менее, DirectDraw пытается создать
поверхности в видеопамяти по умолчанию, поэтому нет необходимости предпринимать
что-либо специально.
Перед углублением и изнурительные подробности DirectDraw сначала несколько
слов о модели компонентных объектов - кратко СОМ. Delphi использует
объектно-ориентированный язык программирования Object Pascal. Дизайнеры Delphi
решили сделать родные Delphi объекты полностью совместимыми с СОМ и OLE. Это
большая новость для нас, потому что DirectDraw использует интерфейс СОМ и
поэтому из Delphi получить к нему доступ достаточно просто.