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

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

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

fmtFullscreenArrayliFmt], fmtFullscreenArray[iFmt], FALSE))

then begin

FDSDfmtFullscreen := fmtFullscreenArray[iFmt];

Break; // НайдСн подходящий

end

end;


// Π—Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ стола

ScreenWidth := GetSystemMetrics(SM_CXSCREEN);

ScreenHeight := GetSystemMetrics(SM_CYSCREEN);

// ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ†Π΅Π½Ρ‚Ρ€Π° экрана

HalfScreenWidth := ScreenWidth div 2;

HalfScreenHeight := ScreenHeight div 2;

// ЗаполняСм поля структуры

ZeroMemory(@d3dpp, SizeOf(dSdpp));

with d3dpp do begin

Windowed := False; // ΠŸΠΎΠ»Π½ΠΎΡΠΊΡ€Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ

SwapEffect := D3DSWAPEFFECT_DISCARD;

BackBufferWidth .-= ScreenWidth;

BackBufferHeight := ScreenHeight;

BackBufferFormat := FD3DfmtFullscreen;

end;


Result := FD3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Handle,

D3DCREATE_SOFTWARE_VERTEXPROCESSING,

d3dpp, FD3DDevice);

end;


ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Direct3D ΠΎΠ±Π½ΡƒΠ»ΡΡŽΡ‚ΡΡ Π½Π΅ Π² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π° ΠΏΡ€ΠΈ создании Ρ„ΠΎΡ€ΠΌΡ‹. ΠŸΠ΅Ρ€Π΅Π΄ созданиСм Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° опрСдСляСм, Π½Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ Π»ΠΈ эта пСрСмСнная ΠΊΠ°ΠΊΠΎΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ДСлаСтся это ΠΏΠΎΡΡ‚ΠΎΠ»ΡŒΠΊΡƒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ функция ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ, Π² ситуации, ΠΊΠΎΠ³Π΄Π° Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡƒΠΆΠ΅ сущСствуСт.

ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ дСйствия Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° манипуляции, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΏΡ€ΠΎΠ΄Π΅Π»Ρ‹Π²Π°Π»ΠΈ Π² полноэкранных прилоТСниях, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… DirectDraw: отслСТиваСм ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ активности, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ, воспроизвСдСниС осущСствляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ состоянии.

Π‘ΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½ΠΎΠ²Ρ‹ΠΌ для нас являСтся Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ восстановлСнии ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ прилоТСния Π·Π°Π½ΠΎΠ²ΠΎ выполняСтся инициализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° устройства:


procedure TfrmD3D.ApplicationEventslRestore(Sender: TObject);

begin

if Assigned (FD3DVB) then begin // ОсвобоТдСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

FD3DVB._Release;

FD3DVB := nil;

end;


WindowState := wsMaximized; // РаспахиваниС ΠΎΠΊΠ½Π°

InitD3D; // ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΠ΅ΠΌ ΠΊΠΎΠ΄ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

InitPoints; // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π±ΡƒΡ„Π΅Ρ€Π° Π²Π΅Ρ€ΡˆΠΈΠ½

FActive := True;

end;


Π’ ситуации ΡƒΡ…ΠΎΠ΄Π° ΠΎΠΊΠ½Π° с экрана происходит потСря устройства воспроизвСдСния, подобная ΠΏΠΎΡ‚Π΅Ρ€Π΅ повСрхности Π² DirectDraw. ΠŸΡ€ΠΈ восстановлСнии ΠΎΠΊΠ½Π° воспроизвСдСния самым Π±Π΅Π·Π±ΠΎΠ»Π΅Π·Π½Π΅Π½Π½Ρ‹ΠΌ способом Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊ Π²ΠΎΡΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡŽ являСтся повторная инициализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° устройства. Π§Ρ‚ΠΎΠ±Ρ‹ провСсти эту ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ устройства Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚ΠΎ всСх связанных с Π½ΠΈΠΌ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это СдинствСнный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ - Π±ΡƒΡ„Π΅Ρ€ Π²Π΅Ρ€ΡˆΠΈΠ½. Π”Π°Π»ΡŒΡˆΠ΅ ΠΌΡ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ графичСской систСмы. Π“Π»Π°Π²Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π·Π°Π½ΠΎΠ²ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ, поэтому Π² ΠΊΠΎΠ΄ внСсСны измСнСния, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я Π²Ρ‹ΡˆΠ΅ ΠΎΠ±Ρ€Π°Ρ‰Π°Π» вашС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±ΡƒΡ„Π΅Ρ€ Π²Π΅Ρ€ΡˆΠΈΠ½ Π½Π°ΠΌΠΈ Π±Ρ‹Π» ΡƒΠ΄Π°Π»Π΅Π½, послС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ систСмы вызываСтся функция, Π·Π°Π½ΠΎΠ²ΠΎ ΡΠΎΠ·Π΄Π°ΡŽΡ‰Π°Ρ этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

Π‘ΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ восстановлСния ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ прилоТСния ΠΌΡ‹, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, обслуТили, Π° для снятия ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, связанных со спящим Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ рСкомСндациями, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌΠΈ мною Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π΅ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ настройки Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ стола. ΠŸΡ€ΠΈ построСнии Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠΈ опираСмся Π½Π° считанныС ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ экрана.

Π§Ρ‚ΠΎ Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ Π² этой Π³Π»Π°Π²Π΅

Π’ Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΡˆΠ»ΠΈ ΠΊ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ Π½ΠΎΠ²Ρ‹ΠΌ для нас построСниям, основанным Π½Π° использовании ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² - простых Ρ„ΠΈΠ³ΡƒΡ€, ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ для получСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² любой Ρ„ΠΎΡ€ΠΌΡ‹.

Знакомство с подсистСмой DirectSD свСлось для нас ΠΊ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΡŽ Π½ΠΎΠ²Ρ‹Ρ… интСрфСйсов ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Π“Π»Π°Π²Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ устройства, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ воспроизвСдСниС ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ². Π‘ΡƒΡ„Π΅Ρ€ Π²Π΅Ρ€ΡˆΠΈΠ½ заполняСтся ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ Π²Π΅Ρ€ΡˆΠΈΠ½Π°Ρ…, Π²Π΅Ρ€ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΡˆΠ΅ΠΉΠ΄Π΅Ρ€ управляСт процСссами Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ манипуляциями с Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌΠΈ.

Π“Π»Π°Π²Π° 8 ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Direct3D


Частичная ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ

ΠΠ»ΡŒΡ„Π°-ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ Ρ†Π²Π΅Ρ‚Π°

Π Π°Π·ΠΌΡ‹Ρ‚ΠΈΠ΅ ΠΏΡ€ΠΈ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΈ

Π Π°Π±ΠΎΡ‚Π° с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ числом Π²Π΅Ρ€ΡˆΠΈΠ½

ВСкстура

ВСкстурныС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹

ΠΠ»ΡŒΡ„Π°-ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ тСкстуры

ΠœΡƒΠ»ΡŒΡ‚ΠΈΡ‚Π΅ΠΊΡΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Π¦Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ ΠΊΠ»ΡŽΡ‡ тСкстур

Π‘ΠΏΡ€Π°ΠΉΡ‚Ρ‹ Π² Direct3D

Π§Ρ‚ΠΎ Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ Π² этой Π³Π»Π°Π²Π΅


ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Ρ‹ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ освСщаСт вопросы, связанныС с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Direct3D, ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ описаниС основных ΠΏΡ€ΠΈΠ΅ΠΌΠΎΠ² Π΅Π΅ использования.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊ Π³Π»Π°Π²Π΅ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ \Examples\Chapter08.


Частичная ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ

Π’ этом нСбольшом Ρ€Π°Π·Π΄Π΅Π»Π΅ Π½Π°ΠΌ прСдстоит ΠΏΠΎΠ΄ΠΎΠΉΡ‚ΠΈ ΠΊ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π²Π°ΠΆΠ½Π΅ΠΉΡˆΠΈΡ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² Direct3D.

ВзглянитС Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Ex01: Π½Π° Ρ„ΠΎΠ½Π΅ Π·Π²Π΅Π·Π΄Π½ΠΎΠ³ΠΎ Π½Π΅Π±Π° Π² Ρ€Π°Π·Π½Ρ‹Ρ… направлСниях Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ»ΡƒΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹Π΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ ΠΈ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ (рис. 8.1).






НововвСдСниС Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΏΠΎΠΌΠΈΠΌΠΎ эффСкта полупрозрачности, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² присутствии Ρ€Π°Π·Π½ΠΎΡ€ΠΎΠ΄Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². Π’Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² хранятся Π² Ρ‚Ρ€Π΅Ρ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… массивах:


var

VPoints : Array [0..500] of TCUSTOMVERTEX; // 501 Ρ‚ΠΎΡ‡ΠΊΠ°

VTriangle : Array [0..2] of TCUSTOMVERTEX; // ΠžΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ

VQuad : Array [0..3] of TCUSTOMVERTEX; // Π’Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°

ΠŸΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚ΠΎΡ‡Π΅ΠΊ Ρ†Π²Π΅Ρ‚ Π²Π΅Ρ€ΡˆΠΈΠ½ задаСтся ΠΎΡ‚Ρ‚Π΅Π½ΠΊΠΎΠΌ сСрого для ΠΈΠΌΠΈΡ‚Π°Ρ†ΠΈΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠΉ интСнсивности свСчСния Π·Π²Π΅Π·Π΄. Π‘ΡƒΡ„Π΅Ρ€ Π²Π΅Ρ€ΡˆΠΈΠ½ для всСх ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ΄ΠΈΠ½. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€, опираСмся Π½Π° самый большой ΠΈΠ· Ρ‚Ρ€Π΅Ρ… массивов:


function TfrmD3D.InitPoints : HRESULT;

var

hRet : HRESULT;

i : Integer; wrkDWORD : DWORD;

begin

Randomize;

// Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ массива Ρ‚ΠΎΡ‡Π΅ΠΊ

for i := 0 to High (VPoints) do begin

wrkDWORD := random (200) + 40; // Π˜Π½Ρ‚Π΅Π½ΡΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Ρ‚Ρ€Π΅Ρ… вСсов with

VPoints [i] do begin

X := random (ScreenWidth) ; // ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ - случайно ΠΏΠΎ всСму

Y := random (ScreenHeight) ; // экрану

Z := 0.0;

RHW := 1.0;

Color := D3DCOLOR_XRGB (wrkDWORD, wrkDWORD, wrkDWORD);

end;


end;


// Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ массива Π²Π΅Ρ€ΡˆΠΈΠ½ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

for i := 0 to High (VTriangle) do with VTriangle [i] do begin

Z := 0.0;

RHW := 1.0;

end;


// Π¦Π²Π΅Ρ‚Π° Π²Π΅Ρ€ΡˆΠΈΠ½ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

VTriangle [0]. Color := D3DCOLOR_XRGB (255, 0, 0) ;

VTriangle [1]. Color := D3DCOLOR_XRGB (0, 255, 0) ;

VTriangle [2]. Color := D3DCOLOR_XRGB (0, 0, 255);

// Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ массива Π²Π΅Ρ€ΡˆΠΈΠ½ сСрого ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°

for i := 0 to High (VQuad) do with VQuad [i] do begin Z := 0.0;

RHW := 1.0;

I Color := D3DCOLOR_XRGB (100, 100, 100);

end;


// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π±ΡƒΡ„Π΅Ρ€ Π²Π΅Ρ€ΡˆΠΈΠ½, Ρ€Π°Π·ΠΌΠ΅Ρ€ опираСтся Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ массива Ρ‚ΠΎΡ‡Π΅ΠΊ

hRet := FD3DDevice.CreateVertexBuffer(SizeOf(VPoints),

D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX,

D3DPOOL_DEFAULT, FD3DVB);

if Failed (hRet) then begin

Result := hRet;

Exit;

end;


// БвязываСм ΠΏΠΎΡ‚ΠΎΠΊ

hRet := FDSDDevice.SetStreamSource(0, FD3DVB, SizeOf(TCUSTOMVERTEX));

if Failed (hRet) then begin

Result := hRet;

Exit;

end;


// Π—Π°Π΄Π°Π΅ΠΌ ΡˆΠ΅ΠΉΠ΄Π΅Ρ€ Π²Π΅Ρ€ΡˆΠΈΠ½

Result := FD3DDevice.SetVertexShader(D3DFVF_CUSTOMVERTEX);

end;


Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ собствСнно для рисования ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ²:


function DrawPoints : HRESULT;

function Draw2DTriangle (const inX, inY : Single) : HRESULT;

function TfrmD3D.Draw2DQuad (const inX, inY : Single) : HRESULT;

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚ΠΎΡ‡ΠΊΠΈ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π΅ΠΏΠΎΠ΄Π²ΠΈΠΆΠ½Ρ‹, Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈΠ· ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ производится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ содСрТимого массива vpoints Π² Π±ΡƒΡ„Π΅Ρ€ Π²Π΅Ρ€ΡˆΠΈΠ½. ЗаканчиваСтся ΠΎΠ½Π° Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‚ΠΎΡ‡Π΅ΠΊ:


Result:=FD3DDevice.DrawPrimitive(D3DPT_POINTLIST, 0, High (VPoints) + 1);

Π’ ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ Π΄Π²ΡƒΡ… функциях ΠΏΠ΅Ρ€Π΅Π΄ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π±ΡƒΡ„Π΅Ρ€Π° Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π²Π΅Ρ€ΡˆΠΈΠ½ Ρ„ΠΈΠ³ΡƒΡ€. Π’ΠΎΡ‚ ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‰Π΅ΠΉ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚:


const

HalfPi = Pi / 2; // НСбольшая оптимизация

function TfrmD3D.Draw2DQuad (const inX, inY : Single) : HRESULT;

var

pVertices : PByte;

hRet : HRESULT;

begin

with VQuad [0] do begin // Π›Π΅Π²Ρ‹ΠΉ Π½ΠΈΠΆΠ½ΠΈΠΉ ΡƒΠ³ΠΎΠ» ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°

X := inX + Radius * cos (Angle / 2 - HalfPi);

Y := inY + Radius * sin (Angle / 2 - HalfPi);

end;


with VQuad [1] do begin // Π›Π΅Π²Ρ‹ΠΉ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΡƒΠ³ΠΎΠ» ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°

X := inX + Radius * cos (Angle /2);

Y := inY + Radius * sin (Angle / 2);

end;


with VQuad [2] do begin // ΠŸΡ€Π°Π²Ρ‹ΠΉ Π½ΠΈΠΆΠ½ΠΈΠΉ ΡƒΠ³ΠΎΠ» ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°

X := inX + Radius * cos (Angle / 2 + Pi);

Y := inY + Radius * sin (Angle / 2 + Pi);

end;


with VQuad [3] do begin // ΠŸΡ€Π°Π²Ρ‹ΠΉ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΡƒΠ³ΠΎΠ» ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°

X := inX + Radius * cos (Angle / 2 + HalfPi);

Y := inY + Radius * sin (Angle / 2 + HalfPi);

end;


// ЗаполняСм Π²Π΅Ρ€ΡˆΠΈΠ½Π½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΎ Π²Π΅Ρ€ΡˆΠΈΠ½Π°Ρ… ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°

hRet := FD3DVB.Lock(0, SizeOf(VQuad), pVertices, 0);

if Failed (hRet) then begin

Result := hRet;

Exit;

end;


Move (VQuad, pVertices", SizeOf(VQuad));

hRet := FD3DVB.Unlock;

if Failed (hRet) then begin

Result := hRet;

Exit;

end;


// ΠšΠ²Π°Π΄Ρ€Π°Ρ‚ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ двумя связанными Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°ΠΌΠΈ

Result := FD3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);

end;


ΠŸΡ€ΠΈ пСрСрисовкС ΠΊΠ°Π΄Ρ€Π° ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ€Π΅ΠΆΠΈΠΌ полупрозрачности, Π° послС рисования Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Π΅Π³ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ:


function TfrmD3D.Render : HRESULT;

var

hRet : HRESULT;

begin

if FD3DDevice = nil then begin Result := E_FAIL;

Exit;

end;


// ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° экрана ΠΈ ΠΎΠΊΡ€Π°ΡˆΠΈΠ²Π°Π½ΠΈΠ΅ Π΅Π³ΠΎ Π² Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚

hRet := FD3DDevice.Clear(0, nil, D3DCLEAR_TARGET, 0, 0.0, 0);

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;


hRet := FDSDDevice.BeginScene;

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;


// ΠŸΠ΅Ρ€Π²Ρ‹ΠΌΠΈ Ρ€ΠΈΡΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΡ‡ΠΊΠΈ Ρ„ΠΎΠ½Π°

hRet := DrawPoints;

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;


// Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ€Π΅ΠΆΠΈΠΌ полупрозрачности

with FDSDDevice do begin

SetRenderState(D3DRS_ALPHABLENDENABLE, DWORD(True));

SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);

SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);

end;


// ΠŸΠΎΠ»ΡƒΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚

hRet := Draw2DQuad (HalfScreenWidth, HalfScreenHeight);

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;


// ΠŸΠΎΠ»ΡƒΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ

hRet := Draw2DTriangle (HalfScreenWidth, HalfScreenHeight);

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;


// Π Π΅ΠΆΠΈΠΌ полупрозрачности большС Π½Π΅ Π½ΡƒΠΆΠ΅Π½

FDSDDevice.SetRenderState(D3DRS_ALPHABLENDENABLE, DWORD(False));