Михаил Краснов - Графика DirectX в Delphi

Тут можно читать онлайн Михаил Краснов - Графика DirectX в Delphi - бесплатно ознакомительный отрывок. Жанр: comp-programming. Здесь Вы можете читать ознакомительный отрывок из книги онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Графика DirectX в Delphi
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    3.56/5. Голосов: 91
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Михаил Краснов - Графика DirectX в Delphi краткое содержание

Графика DirectX в Delphi - описание и краткое содержание, автор Михаил Краснов, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Графика DirectX в Delphi - читать онлайн бесплатно ознакомительный отрывок

Графика DirectX в Delphi - читать книгу онлайн бесплатно (ознакомительный отрывок), автор Михаил Краснов
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

begin

hRet := InitD3D;

if Failed (hRet} then ErrorOut ('InitD3D', hRet);

end;

Основная нагрузка в примере ложится на функцию Render, в которой выполняется единственное действие - экран окрашивается синим цветом:

function TfrmDSD.Render : HRESULT;

var

hRet : HRESULT;

begin

// Инициализация не выполнена, либо произошла серьезная авария

if FDSDDevice = nil then begin

Result := E__FAIL;

Exit;

end;

hRet := FD3DDevice.Clear(0, nil, D3DCLEARJTARGET,

D3DCOLOR_XRGB(0, 0, 255), 0.0, 0); // Очистка заднего буфера

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;

// Переключение буферов устройства

Result := FD3DDevice.Present(nil, nil, 0, nil);

end;

Начинается код функции с проверки присутствия объекта устройства. Этот объект может отсутствовать, если инициализация не выполнилась успешно, либо объект потерян. Последняя ситуация может возникнуть, когда, например, по ходу работы приложения меняются установки рабочего стола. Обратите внимание, что при отсутствии объекта устройства наша функция Render возвращает значение E_FAIL, но функция обработки ошибки DXGErrorString в ответ на такую ошибку возвращает строку 'Unrecognized Error' (Неопознанная ошибка). Вы можете избавиться от неопределенности сообщения, введя собственную константу на случай потери объекта устройства.

Далее в функции Render вызывается метод clear объекта устройства. Первый и второй аргументы метода позволяют задавать очищаемую область: первый аргумент задает количество используемых прямоугольников, вторым аргументом передается указатель на массив, содержащий набор величин типа TRect.

Третьим аргументом метода clear уточняются параметры очистки. Здесь указывается флаг или комбинация флагов. Константа DSDCLEARJTARGET используется в ситуации, когда очищается цветовая поверхность устройства. Сам цвет, в который "перекрашивается" устройство, передается следующим параметром. В примере цвет, которым будет окрашено окно, идентифицируем, используя готовую функцию D3DCOLOR_XRGB. Ее аргументом является тройка весов чистых цветов, образующих нужный нам оттенок. Последние два аргумента метода пока оставим без рассмотрения, связаны они со специальными буферами.

Окрасив задний буфер чистым синим цветом, нам остается только переставить буферы - вызываем метод Present объекта устройства. Если третий аргумент метода нулевой, то идентификатором окна, в котором происходит работа, берется значение, установленное ранее, во время инициализации работы системы. Все остальные параметры метода или не используются, или при указанных нулевых значениях задают работу со всей клиентской областью окна, что, как правило, и необходимо.

В состоянии ожидания сообщений беспрерывно вызывается функция Render, если окно приложения не минимизировано:

procedure TfrmDBD.ApplicationEventslMinimize(Sender: TObject);

begin

FActive := False; // При минимизации окна приложения флаг опускаем

end;

procedure TfrmDSD.ApplicationEventslRestore(Sender: TObject);

begin

FActive := True; // Окно восстановлено, флаг поднимаем

end;

Помимо непрерывной перерисовки окна периодически подсчитывается и выводится в его заголовке значение FPS:

procedure TfrmDSD.ApplicationEventslIdle(Sender: TObject;

var Done: Boolean);

var

hRet : HRESULT;

begin

if FActive then begin // Только при активном окне Inc (Frames);

hRet := Render; // Перерисовка окна

if FAILED(hRet) then begin

FActive := False; ErrorOut ('Render', hRet);

Exit;

end;

ThisTickCount := GetTickCount;

if ThisTickCount - LastTickCount > 50 then begin

// Подсчет и вывод FPS

Caption := 'FPS = ' + Format('%6.2f',

[frames * 1000 / (ThisTickCount - LastTickCount)]);

Frames := 0;

LastTickCount := GetTickCount;

end;

end;

Done := False;

end;

Минимальное по сложности приложение, использующее DirectSD, мы разобрали, теперь попробуем проверить один момент. В проекте каталога Ех02 левая и правая половины окна окрашиваются в синий и красный цвета соответственно. Клиентская область окна имеет размер 300x300 пикселов. В функции Render для задания областей окрашивания используется переменная wrkRect типа TRect:

SetRect (wrkRect, 0, 0, 150, 300); // Левая область окна

hRet := FDSDDevice.Clear(1, @wrkRect, D3DCLEAR_TARGET,

D3DCOLOR__XRGB(0, 0, 255), 0.0, 0); // Первую область

// окрашиваем синим

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;

SetRect (wrkRect, 150, 0, 300, 300); // Правая область

hRet := FDSDDevice.Clear(1, @wrkRect, D3DCLEAR_TARGET,

D3DCOLOR_XRGB(255, 0, 0), 0.0, 0); // Вторую область

// окрашиваем красным

if FAILED(hRet) then begin

Result :=0 hRet;

Exit;

end;

Проект каталога Ех03 вы сможете разобрать и без моей помощи, это несложная модификация предыдущего примера, отличающаяся только тем, что значения цветовых весов со временем меняются. Я же обращу ваше внимание на одну немаловажную особенность последних двух примеров: при изменении размеров окна его половинки окрашиваются так, будто в коде отслеживаются его текущие размеры. Делаем важный вывод: размеры клиентской области окна на момент инициализации Direct3D определяют область вывода на весь сеанс работы с графической системой.

Тип TColor и цвет в DirectSD

Цвет в Direct3D задается 32-битным числом, так называемый формат ARGB. Последний байт этого числа задает вес синего цвета (В), предпоследний - JS зеленого (G), второй - красного (R). Смысл первого байта раскроем попозже, пока же его значение никак не влияет на результат работы программ.

К В первом примере для окрашивания окна в чистый синий строку очистки заднего буфера можно записать так:

hRet := FD3DDevi.ee.Clear(0, nil, D3DCLEARJTARGET, $000000FF, 0.0, 0);

В типе TColor, с которым вам приходилось часто работать в Delphi, также задействованы четыре байта, но последний байт отвечает за красный, а второй - за синий цвета. Потренируемся в переводе цвета из одного формата в другой и обратимся за помощью к проекту каталога Ех04.

На форме появилось два дополнительных объекта: кнопка Color и компонент, связанный с диалогом задания цвета. Переменная DXColor типа DWORD хранит текущее значение цвета, в который окрашивается задний буфер. При в нажатии кнопки появляется диалог указания цвета. Выбранный цвет устанавливается значением DXColor:

procedure Tf rmD3D.Buttonldick (Sender: TObject) ;

begin

if ColorDialogl.Execute then DXColor := ColorToDX (ColorDialogl.Color);

end;

В пользовательской функции ColorToDX из аргумента "вырезаются" байты цветовых компонентов, затем заново склеиваются в нужном порядке, первый байт остается нулевым:

function ColorToDX (С : TColor) : DWORD;

var

R, G, В : Byte;

begin

R := С and $FF; // Последний байт, красный цвет

G := (С and $FFOO) shr 8; // Предпоследний байт, зеленый цвет

В := (С and $FFOOOO) shr 16; // Синий цвет

Result := (R shl 16) or (G shl 8) or B;

end ;

Протестируйте работу приложения, все должно работать хорошо. Попутно этот несложный пример иллюстрирует, что мы можем без особых ухищрений использовать визуальные компоненты Delphi в проектах на основе DirectSD. Эту хорошую новость я немного подпорчу замечанием, что не все визуальные компоненты хорошо кооперируются с такими проектами. Только те, которые имеют свойство Handle, не будут загорожены экраном воcпроизведения. Такие компоненты создают собственное окно, которое не захватывается объектом устройства.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Михаил Краснов читать все книги автора по порядку

Михаил Краснов - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Графика DirectX в Delphi отзывы


Отзывы читателей о книге Графика DirectX в Delphi, автор: Михаил Краснов. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x