Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π“Ρ€Π°Ρ„ΠΈΠΊΠ° DirectX Π² DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 40

Автор ΠœΠΈΡ…Π°ΠΈΠ» ΠšΡ€Π°ΡΠ½ΠΎΠ²

ShowMessage (IntToStr(d3dpp.BackBufferCount));

И ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ Π±Π΅Π· Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ экрана. ПослСдний Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ рассматриваСмого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° - собствСнно Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ вызываСтся ΠΏΡ€ΠΈ создании ΠΎΠΊΠ½Π°, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ошибок являСтся, ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ элСмСнтом Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ:


procedure TfrmDBD.FormCreate(Sender: TObject);

var

hRet : HRESULT;

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произвСдСния. Π’Π°ΠΊΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ собствСнноС ΠΎΠΊΠ½ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ захватываСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ устройства.

Π’ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ свойство Handle, Π²ΠΏΠΎΠ»Π½Π΅ подходят для использования ΠΈΡ… Π² качСствС холста. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…05, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ отличаСтся ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ воспроизвСдСниС Π² Π½Π΅ΠΌ осущСствляСтся Π½Π΅ Π½Π° ΠΊΠ°Π½Π²Ρƒ ΠΎΠΊΠ½Π°, Π° Π½Π° панСль, Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‰ΡƒΡŽ лишь Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠΊΠ½Π° (рис. 7.1).





Π­Ρ‚ΠΎ стоило Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ‚Ρ€ΡƒΠ΄ΠΎΠ²: Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° CreateDevice Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° пСрСдаСтся ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΎΠΊΠ½Π° ΠΏΠ°Π½Π΅Π»ΠΈ:


Result := FD3D. CreateDevice (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,

Pane 11. Handle,

D3DCREATE_SOFTWARE_VERTEXPROCESSING,

d3dpp, FD3DDevice) ;

НавСрноС, ΠΌΡ‹ ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π½Π° экранС.

ΠŸΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹

РисованиС Π² Direct3D осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ². Под этим Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠΌ слСдуСт ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ„ΠΈΠ³ΡƒΡ€Ρƒ. Π‘Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π°ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΡ‡ΠΊΠ°, ΠΎΡ‚Ρ€Π΅Π·ΠΎΠΊ ΠΈ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ² задаСтся Π½Π°Π±ΠΎΡ€ΠΎΠΌ Π²Π΅Ρ€ΡˆΠΈΠ½, характСристиками ΠΎΠΏΠΎΡ€Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π°. Для хранСния Π²Π΅Ρ€ΡˆΠΈΠ½, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ², ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π±ΡƒΡ„Π΅Ρ€ Π²Π΅Ρ€ΡˆΠΈΠ½ (vertex buffer). Π‘ΡƒΡ„Π΅Ρ€Ρ‹ Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой области памяти, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ управляСт Direct3D. Π”Π°Π½Π½Ρ‹Π΅ Π² Π±ΡƒΡ„Π΅Ρ€Π΅ Π²Π΅Ρ€ΡˆΠΈΠ½ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ строго ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΈΠ· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π°. Выяснив Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈΡ‚ΡŒ ΠΎΠ± этом Π³Ρ€Π°Ρ„ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ систСму с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π°Π±ΠΎΡ€Π° Ρ„Π»Π°Π³ΠΎΠ² FVF (Flexible Vertex Format, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π³ΠΈΠ±ΠΊΠΈΡ… Π²Π΅Ρ€ΡˆΠΈΠ½). Π’ FVF-Ρ„Π»Π°Π³Π΅ содСрТится пСрСчислСниС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΈΠ· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π°.

Для манипуляций с Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ особый ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Π½Ρ‹ΠΌ ΡˆΠ΅ΠΉΠ΄Π΅Ρ€ΠΎΠΌ (vertex shader). ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π±ΡƒΡ„Π΅Ρ€Ρ‹ Π²Π΅Ρ€ΡˆΠΈΠ½ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Ρ‹, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ устройства создаСт ΡˆΠ΅ΠΉΠ΄Π΅Ρ€ Π²Π΅Ρ€ΡˆΠΈΠ½, заполняСмый Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π±ΡƒΡ„Π΅Ρ€Π°.