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));