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

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

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

hRet := FD3DDevice.BeginScene; // Π˜Π½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ устройство ΠΎ готовности

if FAILED(hRet) then begin // ΠΊ Π²ΠΎΡΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡŽ

Result := hRet;

Exit; end;

// ПослСдний Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ - количСство ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ

hRet := FD3DDevice.DrawPrimitive(D3DPT_POINTLIST, 0, MAXPOINTS);

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;


// Π­Ρ‚ΠΎ дСйствиС Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ всСгда Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ воспроизвСдСния

hRet := FD3DDevice.EndScene;

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;



ΠŸΡ€ΠΈΠΌΠ΅Ρ€ совсСм нСслоТный, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΡƒΡΡΠ½ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ Π½Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π²Π΅Ρ‰ΠΈ. Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚Π΅ строку собствСнно воспроизвСдСния Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π»Π°Π΄:


hRet := FD3DDevice.DrawPrimitive(D3DPT_POINTLIST, 0, random(MAXPOINTS));

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

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΌΠ΅Ρ€Ρ†Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΌ, Π½Π°Π΄ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΡƒΡŽ ΠΎΠ΄Π½Ρƒ Ρ‚ΠΎΡ‡ΠΊΡƒ для воспроизвСдСния. НапримСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² ΠΊΠ°Π΄Ρ€Π΅ сияло ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 200 Ρ‚ΠΎΡ‡Π΅ΠΊ, ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


for i := 0 to 200 do begin

hRet := FD3DDevice.DrawPrimitive(D3DPT_POINTLIST,

random (MAXPOINTS), 1);

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;


end;


Но всС Ρ‚ΠΎΡ‡ΠΊΠΈ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠΊΠ° Π½Π΅ΠΏΠΎΠ΄Π²ΠΈΠΆΠ½ΠΎ, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹.

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…08 ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ‚ΠΎΡ‡Π΅ΠΊ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΠΊΠ°Π΄Ρ€Π°. ΠŸΠ΅Ρ€Π΅Π΄ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½Ρ‹ΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° DrawPrimitive происходит ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π·Π°ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΉ Π±ΡƒΡ„Π΅Ρ€ Π²Π΅Ρ€ΡˆΠΈΠ½ Π½ΠΎΠ²Ρ‹ΠΌΠΈ значСниями. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ Π½Π΅ загромоТдаСтся дСйствиями, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ массива Ρ‚ΠΎΡ‡Π΅ΠΊ:


function TfrmDSD.GenPoints : HRESULT;

var

pVertices : PByte;

hRet : HRESULT; i : Integer;

begin

for i := 0 to MAXPOINTS - 1 do with VPoints [i] do begin

X := random (300);

Y := random (300); // ЗначСния ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ Π½Π΅ мСняСм

end;


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

if Failed (hRet) then begin

Result := hRet;

Exit;

end;


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

Result := FD3DVB.Unlock;

end;


НСт нСобходимости снова Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ дСйствия ΠΏΠΎ созданию Π±ΡƒΡ„Π΅Ρ€Π° Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡˆΠ΅ΠΉΠ΄Π΅Ρ€Π°, лишь заполняСм Π±ΡƒΡ„Π΅Ρ€ Π²Π΅Ρ€ΡˆΠΈΠ½ Π½ΠΎΠ²Ρ‹ΠΌΠΈ значСниями.

Π­Ρ‚ΠΎ Π±Ρ‹Π» ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° хаотичСскоС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΡ‡Π΅ΠΊ, Π° Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…09 ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠΉ схСмС рисуСтся Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π°ΡΡΡ ΡΠΏΠΈΡ€Π°Π»ΡŒ (рис. 7.3).





ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Ρ‚ΠΎΡ‡Π΅ΠΊ я взял сущСствСнно большС ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ. ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ‚ΠΎΡ‡Π΅ΠΊ спирали Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ пСрСрисовкС экрана:


var

Angle : Single = 0.0;

function TfrmD3D.GenPoints : HRESULT;

var

pVertices : PByte;

hRet : HRESULT; i : Integer;

const

Step = 2 * Pi / MAXPOINTS;

begin

for i := 0 to MAXPOINTS - 1 do with VPoints [i] do begin

X := 150 + cos (Angle + Step * 5 * i) * i / 20;

Y := 150 + sin (Angle + Step * 5 * i) * i / 20;

end;


Angle := Angle + 0.1;

if Angle > 2 * Pi then Angle := Angle - 2 * Pi;

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

if Failed (hRet) then begin

Result := hRet;

Exit;

end;


Move (VPoints, pVertices^, SizeOf(VPoints));

Result := FD3DVB.Unlock;

end;



Π Π΅ΠΆΠΈΠΌΡ‹ воспроизвСдСния

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ Π½Π°ΠΌ прСдстоит ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈ ΠΌΠ΅Π½ΡΡ‚ΡŒ характСристики воспроизвСдСния ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ².

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ GetRenderState И SetRenderState ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° воспроизвСдСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для получСния ΠΈ задания Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² воспроизвСдСния, установок, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΡ…, Π² частности, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ характСристики рисования ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ².

Познакомимся с этими ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅. Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…10 рисуСтся знакомая Π½Π°ΠΌ ΠΏΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π°ΡΡΡ ΡΠΏΠΈΡ€Π°Π»ΡŒ, Π½ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ (рис. 7.4).





Π’ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ startPointsize Ρ‚ΠΈΠΏΠ° DWORD ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ Ρ‚ΠΎΡ‡Π΅ΠΊ, принятому ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:


FD3DDevice.GetRenderState(D3DRS_POINTSIZE, StartPointsize);

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ коррСктности ΠΎΠΏΡƒΡΠΊΠ°ΡŽ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° - символичСская константа, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π°Ρ, ΠΊΠ°ΠΊΠΎΠΉ Ρ€Π΅ΠΆΠΈΠΌ ΠΎΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ. Π’Ρ‚ΠΎΡ€ΠΎΠΉ - пСрСмСнная, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ помСщаСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² ΠΈΠ· Ρ„Π°ΠΉΠ»Π° справки ΠΏΠΎ DirectX, Π»ΠΈΠ±ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ содСрТимому модуля DirectXGraphics.pas. ИмСна этих констант Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с прСфикса "D3DRS_"; ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ константы ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ становится понятно, ΠΎ ΠΊΠ°ΠΊΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΈΠ΄Π΅Ρ‚ Ρ€Π΅Ρ‡ΡŒ.

Для измСнСния Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² Ρ‚ΠΎΡ‡Π΅ΠΊ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° нСбольшоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ достигнут Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅Π΄Π΅Π», задаСтся ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚ΠΎΡ‡Π΅ΠΊ:


FD3DDevice.GetRenderState(D3DRS_POINTSIZE, PointSize);

FD3DDevice.SetRenderState(D3DRS_POINTSIZE, trunc (1.001 * PointSize));

if PointSize > 1.02 * StartPointSize

then FD3DDevice.SetRenderState(D3DRS_POINTSIZE, StartPointSize);

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° setRenderState являСтся Ρ‚ΠΎΡ‡Π½ΠΎ такая ΠΆΠ΅ константа, Ρ‡Ρ‚ΠΎ ΠΈ для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° GetRenderState; Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ содСрТит устанавливаСмоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Π’ΠΈΠΏ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΎΠ±ΠΎΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ DWORD, хотя само Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π±ΡƒΠ»Π΅Π²ΠΎ ΠΈΠ»ΠΈ вСщСствСнноС. НапримСр, для Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ‚ΠΎΡ‡ΠΊΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ устанавливаСтся ΠΊΠ°ΠΊ 1.0, Ρ‚. Π΅. вСщСствСнноС число. ЗаписываСмоС число Ρ‚ΠΎΠΆΠ΅ интСрпрСтируСтся ΠΊΠ°ΠΊ вСщСствСнноС, Π½ΠΎ для осмыслСнной манипуляции с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Π½Π°Π΄ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅. Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚ΠΎΡ‡ΠΊΠΈ Π² Π΄Π²Π° Ρ€Π°Π·Π° ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, принятым ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, слСдуСт ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° single ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Ρ‚ΠΈΠΏ DWORD:


wrk := 2.0;

FD3DDevice.SetRenderState(D3DRS POINTSIZE, PDWORD (@wrk)^);


Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠ΅ настройки воспроизвСдСния, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ SetRenderState, Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ установлСнном состоянии воспроизвСдСния, Ρ‚. Π΅. послС Π²Ρ‹Π·ΠΎΠ²Π°

ΠΌΠ΅Ρ‚ΠΎΠ΄Π° BeginScene ΠΈ Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° End-Scene.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Ex11: Ρ€Π°Π±ΠΎΡ‚Π° Π΅Π³ΠΎ Π½Π΅ отличаСтся ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Π½ΠΎ ΠΊΠΎΠ΄ манипуляции с Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚ΠΎΡ‡ΠΊΠΈ Π³ΠΎΡ€Π°Π·Π΄ΠΎ понятнСС:


var

PointSize : Single = 1.0;

...

PointSize := 1.3 * PointSize;

if PointSize > 10.0 then PointSize := 1.0;

FD3DDevice.SetRenderState(D3DRS_POINTSIZE, PDWORD (@PointSize)^);

Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² слуТит Π±ΡƒΠ»Π΅Π²Ρ‹ΠΌ Ρ„Π»Π°Π³ΠΎΠΌ, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΌ ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΌ Ρ€Π΅ΠΆΠΈΠΌ. Π’ этом случаС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ: DWORD (True).

Π’Ρ‹ навСрняка ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ»ΠΈ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΠΊΠΈ. Π­Ρ‚ΠΈΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹, Π½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ лишь Π΄ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€Π΅Π΄Π΅Π»Π°, поэтому Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ получится ΠΈΠ·ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСбольшиС ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Ρ‹.

Π‘Π»ΠΎΠΊΠΈ установок

Direct3D позволяСт Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€Ρ‹ установок воспроизвСдСния, ΠΏΡ€ΠΈ этом Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ назначаСтся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…12 экран усСиваСтся хаотичСски Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‰ΠΈΠΌΠΈΡΡ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ. НововвСдСниС здСсь Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ: ΠΎΠ΄Π½Π° ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° ΠΈΠ· Π½ΠΈΡ… ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€, Π² Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π° ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰ΠΈΠΉ принятый ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π° другая - Ρ€Π°Π·ΠΌΠ΅Ρ€, Π² Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ€Π°Π·Π° большС ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ (рис. 7.5).





ΠŸΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ создаСм Π΄Π²Π° Π±Π»ΠΎΠΊΠ° установок для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² Ρ‚ΠΎΡ‡Π΅ΠΊ. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠ° DWORD, значСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π°Π΄Π°ΡŽΡ‚ΡΡ систСмой:


PointSize := 4.0; // УстанавливаСмый Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚ΠΎΡ‡Π΅ΠΊ

with FD3DDevice do begin

BeginStateBlock; // Начало описания Π±Π»ΠΎΠΊΠ° установок

SetRenderState(D3DRS_POINTSIZE, PDWORD (@PointSize)^);

EndStateBlock (PointSize4); // ΠšΠΎΠ½Π΅Ρ† описания Π±Π»ΠΎΠΊΠ° установок

end;


PointSize := 3.0; // Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π±Π»ΠΎΠΊ установок, Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚ΠΎΡ‡Π΅ΠΊ

with FDSDDevice do begin

BeginStateBlock;

SetRenderState(D3DRS_POINTSIZE, PDWORD (@PointSize)^);

EndStateBlock (PointSizeS);

end;


ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ само созданиС Π±Π»ΠΎΠΊΠΎΠ² установок Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ влияСт Π½Π° Ρ€Π΅ΠΆΠΈΠΌΡ‹ воспроизвСдСния, Ρ‚. Π΅. Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΏΠΎΠΊΠ° ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ.

Массив Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² заполняСтся бСспрСрывно случайными ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ, Π° ΠΏΠ΅Ρ€Π΅Π΄ воспроизвСдСниСм ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ Ρ‚ΠΎΡ‡Π΅ΠΊ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ ApplyStateBiock ΠΈ устанавливаСм Ρ€Π΅ΠΆΠΈΠΌΡ‹ воспроизвСдСния Π² Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ состояний. ЕдинствСнным Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° являСтся имя Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°:


// Π—Π°Π΄Π°Π΅ΠΌ Ρ€Π΅ΠΆΠΈΠΌ 3-ΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ‚ΠΎΡ‡Π΅ΠΊ

hRet := FD3DDevice.ApplyStateBiock (PointSize3);

// РисуСм ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρƒ Ρ‚ΠΎΡ‡Π΅ΠΊ

hRet := FDSDDevice.DrawPrimitive(D3DPT_POINTLIST, 0, MAXPOINTS div 2);

// УстанавливаСм Ρ€Π΅ΠΆΠΈΠΌ 4-ΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ‚ΠΎΡ‡Π΅ΠΊ

hRet := FDSDDevice.ApplyStateBiock (PointSize4);

// РисуСм Π²Ρ‚ΠΎΡ€ΡƒΡŽ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρƒ Ρ‚ΠΎΡ‡Π΅ΠΊ

hRet := FDSDDevice.DrawPrimitive(D3DPT_POINTLIST,

(MAXPOINTS div 2) - 1, MAXPOINTS div 2);

НадСюсь, Ρ‡Ρ‚ΠΎ всС понятно, лишь ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΡƒΡΡŒ нСбольшим Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ΠΌ. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ ApplyStateBiock, ΠΊΠ°ΠΊ ΠΈ всС Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π²Π»ΠΈΡΡŽΡ‰ΠΈΠ΅ Π½Π° Ρ€Π΅ΠΆΠΈΠΌ воспроизвСдСния, ΠΏΡ€ΠΈ установлСнном состоянии воспроизвСдСния.

ΠžΠΊΡ€Π°ΡˆΠ΅Π½Π½Ρ‹Π΅ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Ρ€ΠΈΡΠΎΠ²Π°Π»ΠΈΡΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ Π±Π΅Π»ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π°, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ научимся ΠΎΠΊΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ наши ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹. Для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π° ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ FVF-Ρ„Π»Π°Π³.

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…13 экран заполняСтся хаотичСски располоТСнными Ρ€Π°Π·Π½ΠΎΡ†Π²Π΅Ρ‚Π½Ρ‹ΠΌΠΈ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ (рис. 7.6).





Π—Π°ΠΏΠΈΡΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π²Π΅Ρ€ΡˆΠΈΠ½ дополнилась ΠΏΠΎΠ»Π΅ΠΌ, хранящим Ρ†Π²Π΅Ρ‚ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹, Ρ‚ΠΈΠΏ Π΅Π΅ DWORD:


type

TCUSTOMVERTEX = packed record

X, Y, Z, RHW : Single;

Color : DWORD; // Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅