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

Здесь есть возможность читать онлайн «Михаил Краснов - Графика DirectX в Delphi» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Графика DirectX в Delphi: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Графика DirectX в Delphi»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

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

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Графика DirectX в Delphi», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

with FDSDDevice do begin

SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);

SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);

SetRenderState(D3DRS_AMBIENT, $00202020);

SetRenderState(D3DRS_LIGHTING, Dword (True));

SetRenderState(D3DRS_NORMALIZENORMALS, DWORD (True));

// Явно указываем использование материала

SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);

SetRenderState(D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL);

SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL);

end;

При движении курсора мыши по поверхности окна отслеживаются его координаты:

var

OX, OY : DWORD;

procedure TfrmD3D.FormMouseMove(Sender: TObject; Shift: TShiftState;

X, Y: Integer);

begin

OX := X;

OY := Y; end;

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

Помимо функции Render, я ввел функцию укороченного воспроизведения, которая отображает сцену с измененными установками и не заканчивается переключением буферов:

function TfrmD3D.Draw : HRESULT;

var

hRet : HRESULT;

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.

При щелчке кнопки мыши получаем доступ к заднему буферу запираем полученную - фото 89

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

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, на время доступа к их содержимому они должны запираться.

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

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

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

Интервал:

Закладка:

Сделать

Похожие книги на «Графика DirectX в Delphi»

Представляем Вашему вниманию похожие книги на «Графика DirectX в Delphi» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Графика DirectX в Delphi»

Обсуждение, отзывы о книге «Графика DirectX в Delphi» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x