Чтение онлайн

на главную - закладки

Жанры

Графика DirectX в Delphi

Краснов Михаил

Шрифт:

begin

if FD3DDevice = nil then begin

Result := E_FAIL;

Exit;

end;

// Очищаем только Z-буфер

hRet := FD3DDevice.Clear(0, nil, D3DCLEAR_ZBUFFER, 0, 1.0, 0);

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;

hRet := FD3DDevice.BeginScene;

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;

with FD3DDevice do begin

SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);

SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);

//

Работа с освещением запрещена

SetRenderState(D3DRS_LIGHTING, Dword (False));

end;

DrawScene; // Рисуем комнату

Result := FD3DDevice.EndScene;

end;

При отключенном освещении стены комнаты будут выглядеть черными. Поэтому нам незачем тратить время для очистки цветового буфера. Здесь I также можно оптимизировать код, воспроизводить только те объекты, между (которыми будет осуществляться выбор, и не тратить время на воспроизведение объектов фона. В таком случае потребуется, конечно, очищать цветовой буфер.

Чтобы увидеть, каким остается содержимое заднего буфера после работы этой функции, можете дополнить ее строкой переключения буферов. После щелчка кнопки мыши вы увидите такую же картинку, как на рис. 10.5.

При щелчке кнопки мыши получаем доступ к заднему буферу, запираем полученную поверхность и анализируем содержимое нужного пиксела:

procedure TfrmD3D.FormClick(Sender: TObject);

var

Back : IDirect3DSurface8; // Поверхность заднего буфера

d3dlr : TD3DLOCKED_RECT;

dwDstPitch : DWORD;

hRet : HRESULT;

DWColor : DWORD;

R, G, В : Byte;

begin

R := 0; // Инициализация для предотвращения предупреждений компилятора

G := 0;

В := 0;

FActive := False; // Перерисовку кадра временно отменяем

Back := nil;

hRet := Draw; // Рисуем упрощенный вариант сцены, в задний буфер

if Failed (hret) then ErrorOut ('Draw', hRet); // Получаем доступ к заднему буферу

hRet := FDSDDevice.GetBackBuf fer (0, D3DBACKBUFFER_TYPE_MONO, Back) ;

if Failed (hret) then ErrorOut ( 'GetBackBuf fer ' , hRet); // Обнуляем поля вспомогательной структуры

ZeroMemory (@d3dlr, SizeOf (d3dlr) ) ; // Поверхность заднего буфера запирается

hRet := Back.LockRect (d3dlr, nil, D3DLOCK__READONLY) ;

if Failed (hret) then ErrorOut {'LockRect', hRet); // Значение смещения при выравнивании поверхности

dwDstPitch := dSdlr. Pitch;

case d3ddm. Format of // Текущий формат рабочего стола

D3DFMT_X8R8G8B8 : begin // 32-битный RGB

//

Пиксел, соответствующий позиции курсора

DWColor := PDWORD (DWORD (d3dlr .pBits) + OY *

dwDstPitch + OX * 4)A; // Цветовые веса пиксела

R := (DWColor shr 23) and $lf;

G := (DWColor shr 7) and $lf;

В := DWColor and $lf;

end;

D3DFMT_R5G6B5 : begin // 16-битный 5-6-5

DWColor := PDWORD (DWORD (d3dlr .pBits) + OY *

dwDstPitch + OX * 2)^;

R := (DWColor shr 11) and $lf;

G := (DWColor shr 5) and $3f;

В := DWColor and $lf;

end;

end;

Back.UnLockRect; // Возможное исключение не обрабатывается

if Assigned (Back) then begin // Удаляем поверхность

Back._Release;

Back := nil;

end;

// Интерпретация результата

if В о 0 then ShowMessage ('Выбран конус') else

if R <> 0 then ShowMessage ('Выбрана сфера') else

if G <> 0 then ShowMessage ('Выбран объект зеленого цвета')

else

ShowMessage ('Ничего не выбрано');

Factive := True;

end;

Первый аргумент метода GetBackBuffer указывает номер присоединенного буфера, основан на нуле. Вторым аргументом является константа. В момент написания книги здесь можно использовать единственно возможное значение, D3DBACKBUFFER_TYPE_MONO. Последний аргумент метода - переменная типа Direct3DSurface8, в которую помещается результат. Поверхности в Direct3D очень похожи на знакомые нам по DirectDraw, на время доступа к их содержимому они должны запираться.

При анализе содержимого пиксела я предусмотрел поддержку только двух, наиболее распространенных, форматов пиксела, и этот код, возможно, вам придется дополнить.

Зеленую составляющую пиксела мы в этом примере никак не используем, но я оставил рассмотрение ее значения для предотвращения замечаний компилятора. Удалять этот код я не стал, вам он может понадобиться для выбора из трех объектов.

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

Туман

Простейшим средством передачи глубины пространства является включение дымки. Объекты сцены в таком режиме при удалении от наблюдателя становятся менее различимыми, погружаются в туман.

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

Параметры тумана таковы:

Поделиться:
Популярные книги

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Черный Маг Императора 8

Герда Александр
8. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 8

Измена. Отбор для предателя

Лаврова Алиса
1. Отбор для предателя
Фантастика:
фэнтези
5.00
рейтинг книги
Измена. Отбор для предателя

Кодекс Крови. Книга II

Борзых М.
2. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга II

Шаг в бездну

Муравьёв Константин Николаевич
3. Перешагнуть пропасть
Фантастика:
фэнтези
космическая фантастика
7.89
рейтинг книги
Шаг в бездну

Часовая битва

Щерба Наталья Васильевна
6. Часодеи
Детские:
детская фантастика
9.38
рейтинг книги
Часовая битва

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Хроники странного королевства. Вторжение. (Дилогия)

Панкеева Оксана Петровна
110. В одном томе
Фантастика:
фэнтези
9.38
рейтинг книги
Хроники странного королевства. Вторжение. (Дилогия)

Часовой ключ

Щерба Наталья Васильевна
1. Часодеи
Фантастика:
фэнтези
9.36
рейтинг книги
Часовой ключ

Инвестиго, из медика в маги

Рэд Илья
1. Инвестиго
Фантастика:
фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Инвестиго, из медика в маги

Кротовский, может, хватит?

Парсиев Дмитрий
3. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
аниме
7.50
рейтинг книги
Кротовский, может, хватит?

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

Очешуеть! Я - жена дракона?!

Амеличева Елена
Фантастика:
юмористическая фантастика
5.43
рейтинг книги
Очешуеть! Я - жена дракона?!

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9