Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
• •
PAJPAIOTKA rPAeHilECKHX
H MYllltTHMEAHHHltlX nPHIIO)l(EHHH
KOMnOHEHTbl Directx:
Directx Graphics, DirectSound, DirectMusic, Directlnput, DirectShow
WE~,QEPbl liI fl3blK HLSL
,QBYMEPHMllii TPEXMEPHMI rPACI>liIKA
3AXBAT liI BOCnPOliI3BE,QEHliIE liI306PA>KEHliIfI liI 3BYKA
PA60TA C YCTPO~CTBAMlii BBO,QA
+CDO
Cepre£; EceHMH
j
H
PAJPAIOTICA rPA.MIJECKItX
M MYII .. 'ItMEAMMHYX nPMIIOJKEHItM
Caaxr-Flerepoypr «6XB-neTep6ypr,. 2006
YJlK 681.3.06
fiEK 32.973.26-018.2 E82
EceHUH C. A.
E82 DirectX 11 Delphi: paspatiorxa rpacj)l1'leCKI1X 11 MYJlbTl1Me.lll1i1Hblx
npl1nO)l{eHI1i1. - Cn6.: EXB-neTep6ypr, 2006. - 512 c.: WI.
ISBN 5-94157-867-9
PaCCMOTpeHa paapafiorxa npWlo)l(emdi C ncnomooeaaaeu TeXHOJlOrHl1 DirectX B cpene nporpasempoeanua Borland Delphi. nO)lpOOHO onacanu Bee ocHOBHble KOMnOHeHThl, BXO,IDlUUte B COCTaB DirectX: DirectX Graphics, DirectShow, Directlnput, DirectSound H DirectMusic. nOKa3aHO C03,naHHe co6CTBeHHblX aa- 60POB KJlaCCOB, 06nef'-laJomHx pafiory C pa3JIH'llibIMH KOMnOHeHTaMH DirectX. Ha npaxruvecxnx npHMepax paCCMOTpeHa pa60Ta c ,nBYMepHow H TpexMepHow rpa<l>I1Kow, lUeilnepbl H J13b1K HLSL, pa3JII1'lHble UBeTOBbie 3<l><l>eKTbI, pa60Ta c TeKCTYPOW, ocBememt,el>J H T. n, Yneneuo BHHMaHHe BbIBO.ay H306p3)1(eHHJI ,B OBepneWHOM pe)l(HMe, MexaHH3MaM saxaara H306pIDKeHIDI (aa npnaepe pa60Tbi C web-xauepok) H aaxsara 3BYKa. Ilpencraesenu MeXaHH3MI'1 BocnpOH3Be)leHHJI MynbTHMe~HanaHHbIX B pa3JIH'lHbIX <l>0PMaTax: 1\VI, M~EG, MP3 H IIp. IlpanaraeMblW KOMnaKT-,nHcK conepxar acxonaue KO,Ubl npHMepoB; paCCMOTpeHHblX B KHHre, a raxxe Ha60p xnaccoa,
"
Y)lK 681.3.06 ssx 32.973.26-018.2
I'pynna nOJ(l'OTOBKH H3.1laHHJI:
rnaBHblW penaxrop
JaM. rnaenoro penaxropa 3aB.pe.llBI<IUleW Peaaxrop KOMnblOTepHaH sepcrxa Koppexrop
)lH3aHH cepMH O¢oPMJleHHeo6no~ 3UB. npOH3BOllCTBOM
Examepuua KOHdYK08a HlOPb IDUUIUi!UH rpUlopUU ,a06UH
AHHa KJI3bMUHa Hamansu C,WUPH060U Hamanuu Ilepiaasoea HHHbI Tal/UHoU
EAeHbI EeJlJU!60U HU/cOAau T8epCKUX
nll4eH31U1 L-1A f'.Ig 02429 OT 24.07.00. noAflMcaHO B n8'la11o 31.05.06. cnopMaT70l<100'/II' n8'la11o oIjlceTHBJI. Yen. n8'l. n, 41.28.
TllpaJI( 2500 31<3. 3aKU f'.Ig 339
"6Xe-neTepliypr", 194354, CaHKT..fleTepliypr, yn. EceHIIHB, 55.
CaHIITapHo-anllAeMllonorll'lecKoe 3aKnIOIleHile Ha npoA}'K4111O f'.Ig n.99.02.953,A.006421.".04 OT 11.11.2004 r. 8IoI,IIIlHO «n8AepanbHoI! cnyJk60li no H8,Q3OPY
B c¢epe 3at.1411To1 npaa nOlpellllTeneli II Ilnaronony'lllllllen08eKa.
Om8'laTaHo e rOTOBIolX AIIanoallTllBOl B rYn "Tllnorpa4!lIJI "HaYKB" 199034, CattKT.fleTepliypr, 9 nllHIIA, 12
ISBN 5-94157-867-9
C £COHIIH C. A., 2006
C Oc!>opwrOHMC, lI3,IlaTCJlhCTBO "IiXs- ntrep6ypr", 2006
Ornaaneaue
Bnaronapuocra .............••.....•............•.......•..................................................•..... 1
Baeneuae ........•.•.•.•.•••.•••.•....•....•..•.........••.•..••....••....••.•..•..•....•..•..•..•.•.•.•.........•.• 2
Ha xoro paCC'lI1TaHa KHl1ra 2
KaK nOCTpoeHa KHl1ra , 3
Tpetiosamta K xounuorepy Ii nporpaseaaovy ofecne-reamo 5
~CTL I. OSIIJ,HE CBE,UEHHJl 7
T JlaBa 1. DirectX .••.•...•.•.•••••...•.•••....••.••..•••.•.•..............•..••....•....•....•............•••.•.• 9
COCTaB OirectX 9
OirectX HJTI1 OpenGL? : 10
Fnaaa 2. Cpena pupa60TKH Borland Delphi 11
CTPYKTYpa cpemr pa3pa60TKI1 I]
Ilepsoe npl1JlO>KeHlie ; 12
Tnasa 3. JiH6J1HoTeKa COM ...•..............•..............................•.....•.•.................... 14
COM HJIli OLL? 14
060eKThI li HHTep<peHchI 15
HHTep<peHc Illnknown 15
YHI1KaJIhHbIe H.ll,eHTH<PliKaTOpbI 16
Pe3YJlhTaT HResult 17
HHHUliaJIli3aU;J1j1 611MI10TeKli COM 11 sanepuremre pa60TbI C HeH 19
Tnaaa 4. Ilamea COM-cepBep ..........•...........•...............•................•.................. 20
C03.n,aHl1e COM-cepsepa 20
Perncrpauaa COM-cepBepa 28
Knl1eHTCKaSl -racrs 29
HTOfH ...............•...............................•.......................................................... 33
VrnaBJIBHVI'"
~CTb II. DlRECTX GRAPHICS ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• 35
Tnaaa S. Direct3D ............•..•.•...............•.•.•.............................•..................•.•... 37 I1HMU11aJ1M3aI.lMH .................................................................................•..................... 37
O'lHCTKa yCTPOHCTBa 41
n POpMcoBKa cuenu ................................................................•................................. 42 nepBblH npMMep ....................•.................................................................................. 43
nOJlH03KpaHHblH pe)l(.11M 49
nOTep51 YCTPoHCTBa .........................................................•.......................................•. 52 npMM11TMBhI .......................................................................•.............................•........ 54
Ey<pep sepuran 54
TOlJKa 56
Ilaer 61
Ilpauep aHMMaUM11 ...........•...........................................•.............................•............. 62
JI11H1111 11 nOCJle,nOBaTeJlhHOCTh Jl11HMH 65
Tpeyronsnnx 11 nOCJleD.OBaTeJlbHOCTH TpeyrOJlbH11KOB .. , ....................................•..... 68 OT rpeyrcnuraxa K npHMoyroJlbH11KY ............•............•................................•........... 74 nOCTpoeHHSl B npOCTpaHCTBe ...................••.............................................................. 74
Marpuuu 75
CJlO)l(eH11e MaTpHU H YMHO)l(eHMe ua 'lMCJlO ............•.......................................•... 75
Ilepewuoxeinre MaTpHU ........................•..............................................................• 76
E.IJ:HHH'lHaH MaTpHua 76
MaTp11UhI nepenoca (cD.B11ra) ...•........................................................................... 76
MaTpHUbI apaurenua ...........................................................•..............................•.. 77
Marpnua MaClllTa611pOBaHI1H ................•............................•.................................. 78
MaTP11UbI OTpa)l{eHMH ....................................................•..•................................... 78
Tnnu MaTPI1U Direct3D 79
<DYHKUMI1 Direct3D JIJIH pa60ThI C MaTpMUaMI1 81
HOPMaJll1 ...........................•...•...................•............................................................... 84 OT TeOp1111 K npaxrnxe .......•............................•........................................................ 85
Ky6 89
Ey<Pep rJIy6I1Hbl .........................................•...................•........................................•.. 96
Ilpaeuna nOCTpOeHI1H ofnexroa ...............•............................................................... 97
I1cTO'lHI1KI1 CBeTa 103
Marepnan 107
Pa60Ta C Marepl1aJ10M H I1CTO'lHI1KaMI1 csera 107
TyMaH 113
Pa60Ta C rexcrypoii 118
<DI1JIbTpaUI1H TeKCTYP 122
Mesh-ofrsexrs, 126
Hecxon bKO 06beKTOB OD.HOBpeMeHHO 127
Pa60Ta C TeKCTOM Ha nJIOCKOCTI1 11 B npocrpancrse l35
OrnaBfl6HU6
Iloncser '1MCJIa Ka.nPOB B cexyany 142
Hecxonsxo TeKcryp na O.nHOM o6neKTe 145
C¢epM'IeCKMe TeKcrypHble Koop.nMHaThI 147
C03.naeM ryanens 150
Ilpoapasuocrs 151
Mynsnrrexcrypupoeaaue 155
Motion Blur 157
Illeiinepsr 162
OCHoBHble CBe.neHJ.1Sl 162
BBe)leHMe B HLSL 164
Bepunnnrsre rneli.nepbl 170
Ilnxcensnsre rneituepbl 179
Pa60Ta C TeKcTypoM 181
f JIaBa 6. DirectDraw ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• 184
0630P 6M6nMoTeKM 184
I1HMUMaJI11JaUJ.1S1 ] 85
Ilepsuti rrpmaep 185
YpOBHM B3aJ.1Mo.neJ;\cTBMSl 189
nOJlH03KpaHHbiM pe)f(J.1M pa60ThI 191
Iloaepxaocrn 192
Pacyev na nOBepXHOCTJ.1 194
DJIMTfHHr ; 196
Ilepexmonemse crpannu ] 97
Ilorepa nocryna K noaepxnocrn 198
UBeTOBble KJIIO'IH 203
Ilamrrpa 205
npSlMOM nocryn K nOBepxHOCTH 205
Oroas ~ 206
OKOHHbIH pe)f(HM pa6oTbl 213
Oaepnen DirectX 218
lITom 235
'lACTh III. DIRECTSOUND •..•••.••.•••.••••••••••••.••..•.••••••••.••.•••...•..•.••••.•.•...•..••..• 237
Fnasa 7. 061l(1fe CBe.u.eHIUI ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••.••••••••••••••••••• 239
06nacTb npMMeHeH115I : 239
,UOCTOMHC1'Ba 239
He.noCTaTKM 239
npJ.1HUMn pa60Tbl 240
YpOBHJ.1 BJaMMo.nei1cTBJ.1Sl 240
VI
OrnasneHMe
Fnaaa 8. BIdBOJl, 3B)'II:a ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• 242 HHTepli>eticbI .......................................•.....•...............................................•.............. 242 C03.l{aHl1e 6y¢epoB ..•......••........................•...............................•..•.........•................. 253 Iloreps 6yli>epoB ............................................................................•......................... 253 3BYKoBbie 31i>Ii>eKThl ....•..............................................•.•........••.•...............•.....•......... 254
Krraccbl TdxSound 11 TdxSoundManager 256
Ilpauep I1CnOJIb30BaHI1Sl KJIaCCOB TdxSound 11 TdxSoundManager 282
fJIasa 9. 3axsaT 3B)'II:a 310
HHTepli>eticbl ......................................................................................•.........•.........•. 310 Eyli>ep 3aXBaTa ...............................................................................•...........•...........•.. 311 3axBaT ay J],110 ...............................•..............................•..............•............•................. 313
Knacc TdxSoundCapture 315
Ilpauep J1CnOJIh30BaHI1H xnacca TdxSoundCapture 321
JlTOfH •...•.......•........•...••.....••....••...•.•....•••.......•.•....••.•......••••...•••.•...•...••..•...• 326
~CTb IV. DlRECTMuSIC ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• 327
Tnasa 10. Pafiora c MIDI H WAV-4utiiJIaMH •••••••••••••••••••••••••••••••••••••••••••••••••••••• 329
HHTepli>etichl ...............................•....•..................................................... : 329
TIoPSlJ],OK pa6oTbI. 334
Knaccsr TdxMusicSegment 11 TdxMusicManager 336
Ilpnvep I1CnOJIb30BaHHH KJIaCCOB .....................•....•......•..•...............................•...•.. 346
IITOfll ..•..•.•...•.•...•.•..............•......•...••....••....•...•.•.•.......•....•...•...••.•...•.........•. 351
~CTL V. DIRECTlNPm .....................................•............................•........... 353
Fnaaa 11. OfiUJ,He CBe)J.eHHJI 355
Pe)l(J1Mhl pa60ThI ......................................................................................•............... 355 YpoBHI1 B3aJilMoJ],eticTBJ1H .......................•......................•.......•.................................. 356
fJIaBa 12. Pafiera c ycrpoMCTBaMH BBOJl,a ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• 357
HHTeplf>eticbI .. 357
06mJilH anroparv patiorsr 36]
Knaanarypa 362
Muun, 364
,lJ.)I(otiCTl1K .........................................................................•..................................••... 366
Knacc TdxlnputManager 368
Ilpavep JilCnOJIb30BaHHH KJIaCCa Tdxlnputtdanager. 377
lITO fll .•...•........•..........•..............•..........................•.•.......•........................... 385
OmaBJ7eHUe
VII
IJACTb VI. DIRECTS HOW •••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• 387
fnaBa 13. OCHoBHLle CBe.D.eHIUI ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• 389
06J1aCTb npI1MeHeHI1$I 389
Ilonaepxaaaevue ¢opMaTbI 389
¢HJIbTPhl 11 rpadi tPl1J1hTPOB 390
Turru ¢l1JIhTPOB , 392
Menenxep rpaoa ¢HJIbTpOB 393
I'naaa 14. Pa60Ta C MP3, AVI, MPEG H .IJ.PyTHMH MYJlLTHMe)JJIacllopMaTaMH ••••••••• 394
HHTeptPet!cbl 394
HHTep¢ettc ynpaBJ1eHI1Sl ¢J1JlhTPOM 395
HHTep¢ettc ynpaBJ1eHI1Sl KOHTaKTOM 395
HHTep¢ettc rrocrpoeans rparpa ¢I1JIbTpOB 396
HHTep¢ettc ynpaBJIeHI1Sl rpadiov tPl1JIbTPOB 397
HHTep¢ettc ynpaBJ1eHI1Sl n03I1UI10Hl1pOBaHI-leM B nOTOKe 397
HHTep¢ettc ynpaBJIeHl1Sl BbIBO.nOM 3BYKa .400
HHTep¢eMC ynpasneaaa MexaHI13MOM C06blTl1M ..40 I
HHTeptPeMc ynpaaneaaa BblBO.nOM BH.lI:eOJJ,aHHhIx 403
HHTeptPeMc rrepexaara xaapa 113 nOTOKa BH.lI:eo .405
AnroPI1TM pa60TbI 408
Knacc TdxMediaPlayer 410
Ilpaaep pa60ThI c KJIaCCOM TdxMediaPlayer .428
I' nasa 15. 3axsaT ay.ll.110 H BH.lI.eO •••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• 437
3aXBaT BHJJ,eo 437
3aXBaT 3ByKa 437
HHTeptPettcbI ., '" 438
nepelII1CJIeHHe YCTP0t!CTB ortpenenernroro xnacca .443
Pe)f(J1MbI 3aXBaTa 11 npensaparensaoro npOCMOTPa 445
3anliCh BI1.neo co 3BYKOM 447
Cxarne nOTOKOB aynao 11 BH.lI:eO 449
CTpaHI1UhI CBOi1CTB 451
AnroPI1TM pa60TbI 455
Knacc TdxCapfureManager 457
Ilpnvep I1CnOJ1b30BaHHSl xnacca TdxCaptureManager 477
morn 486
3aKJIlO'leHHe •••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• 487
VIII
Orneenenue
nPMJIOJKEHMJI ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• 489
ITpUJlOlKeHHe 1. Hurepaer-pecypcsr 491
ITpHJIOlKeHUe 2. ODHcaHHe CO}lep>KHMoro KOMJ1aKT-}lHCKa •••••••••••••••••••••••••••••••••••• 493
CDHCOK nareparypst •....•.•...•.•..•.•.•.•...•...•.•......•.•.•...•..••••.••...•.. : •...•..•.•.•.....•....... 494
ITpe}lMeTHblH YKa3aTeJlb ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• 495
r
,l1.aHHa51 xanra BhIIllJIa B CBeT finaronapa MOPMhHOH rtonnepxxe 11 nOMoUU1 CO CTOPOHhl Modi }l(eHhI OJIhrl1 11 po.n,I1TeJIeH, K KOTOPblM 51 11 npuexan OT cyeru roPO.n,CKOH B nepesmo, .n,a6bI B cnoKoiimoH oticraaosxe 3aKOH'll1Th TO, 1.J.TO Ha'IM.
Taxxe 6JIaronaplO aa nOMoIUh csoero TOBapl1IUa no pafiore, XBOP0Ba Bacl1JIl151. Ero COBeThI 11 3aMeqaHI151 OKa3Ml1Cb O'leHb ueHHhIMl1.
KOHe'lHO xe, CTOHT OTMeTl1Th 11 pOJIb COTpynHl1Ka 113nareJIbCTBa "EXa-neTep- 6ypr" 1i1l1IlJl1f11Ha 11 rops , BCeMl1 npannava 11 aenpaanaua 3aCTaBI1BIlJero MeH5I nponenars 3Ty patiory. 3a 'ITO eMY OTneJIhHOe crtacnfio!
Pa6OTa51 aa KOMnbtOTepOM C ycraHOBJreHHOM OnepaUHOHHOH CHCTeMOM Microsoft Windows, Mbl, He 3anyMb1BaSlCb, MO)l(eM 3anYCTHTb KaKYtO-Jm60 rpexueprryro nrpy, B KOTOPOH 6y,ueM ynpasnars, K npnsrepy, CaMOJIeTOM npa nOMOmH L()I(OMCTHxa HJIH MbllUH H xnasuarypu. I1JIH peunrxt nocnyurars MY3bIKY, HJIH npocvorpers KaKOM-TO HHTepeCHblH ¢HJIbM. MO)l(eM noofuuarsca no cern B pe)l(HMe peansnoro BpeMeHH, na eute npn 3TOM nOJIY'1aSI H306pa)l(emrn cooecemnnca C Web-xaxtepsr HJlH HHOro YCTpoMcTBa 3aXBaTa. 11 see 3TO H naxe 60JIblUe HaM noxroraer nponenars CHCTeMa DirectX.
CBOtO KHHry 51 pelUHJI nOCBSITHTb onacamno npHeMOB pa3pa60TKH rpa¢H'1eCKHX H MYJIbTHMenHanpHJIO)l(eHl1H C HCnOJIb30BaHHeM CHCTeMbI DirectX npHMeHHTeJlbHO K cpene paapaoorxe Borland Delphi. Ilo-rexry HMeHHO Delphi, a He Borland c++ Builder HJIH, cxaxev, Microsoft Visual Studio? ,Ua XOTSI 6bI norosry, 'lT0 K,HHr no nporpaxoaupoeanmo C HCnOJlb30BaHHeM DirectX B Delphi He TaK MHOro. A ornensnsre KOMnOHeHTbI DirectX, TaKHe KaK DirectShow, sooeine MaJIO ocaeutenu.
B KHHre 51 nOCTapMCSI pacxpsrrs TaKHe acnexrsi pa3pa60TKH nporpasrstaoro 06eCnel.J'eHHSI C HCnOJIb30BaHHeM DirectX, KaK pafiora C nBYMepHoM H rpexuepHOM rpa¢HKOH, patiora co 3ByKOM, YCTpoHCTBaMH BBOna H MYJIbTHMe.uHanoTOKa-_ MH. Onucamre pa60TbI C rpa¢HKOH (nOnCHCTeMa DirectX Graphics) COCTOHT H3 ,nBYX sacren - onacanae no,uCHCTeMbI Direct3D H no,nCHCTeMbI DirectDraw. HecMoTpSI na TO, qTO noncacreva DirectDraw C'1HTaeTCSI HecKOJlbKO ycrapeaurea, OHa ace paBHO He yrparnna CBoeM aKryMbHoCTH, 11 ee HHTep¢eHCbI 6y,nyr nonnepxaaarscn B DirectX H B nansnetime«. Pa60Ta co 3BYKOM 6y,neT H3yqeHa B rnasax, onHCbIBatOmHX pafory C DirectSound H DirectMusic; pafiora C YCTPOMCTBaMH BBO.f.(a, TaKHMH KaK xnaauarypa, MbllUb H L()I(OHCTHK, 6y,neT paCCMOTpeHa B rnase, nOCBSImeHHOM DirectInput. A B nocnenuen qaCTH KHHfH MbI npOaHaJIH3Hpyev pafiory C MYJIbTHMe,nHanOToKaMH: HaY'1HMCSI aocrtpotrasonjrrs TaKHe MyJIbTHMe.f.(Ha¢OpMaTbI, KaK AVI, MPEG, MP3 H T. n, HaY'1HMCSI nonysars H306pa)l(eHHe H 3ByK C YCTpOMCTB aaxsara H coxpanars na ,nHCKe.
Ha KOrO paCCLtMTaHa KHMra
KHHra B nepsyio o-repens paCC'1HTaHa ua JItO,neM, 3HaKOMblX co cpenoa paspa- 60TKH Delphi H HMetOmHX npencraanenue 0 TeXHOJIOfHH COM, xoropsre XOTSIT H3y'1HTb CHCTeMY DirectX H TaKHe ee B03MO)l(HOCTH, KaK paoora C rpa¢HKoM, YCTpoMcTBaMH BBOna, panora C MYJIbTHMe,LlHa.naHHbIMJ:i H T . n,
BS8,q8HU8
3
Ilpennonaraerca, llTO -nrraremo He Hy>KHO OrrMICHnTb scex TOHKOCTeM patiorsr B cpene Delphi H ncex TOHKOCTeM TeXH0J10fHH COM. TeM He MeHee, B nepson 'laCTH KHHfH cpezta pa3pa60TKH H B03MO)[(HOCTH COM 6Y)lYT KpaTKO ormcansr, H naxe 6Y)leT rtpasenea rtpmrep paaparorxn COM-cepBepa H KJ1HeHTCKOM 'laCTH.
KaK nOCTpOeHa KHL1ra
KHHra COCTOHT H3 naanoro BBe)leHHH, weCTH xacrea, 3aKJ1tOlJeHHH, nsyx npHJ10- )[(eHHH, cnncxa J1HTepaTYPbl H npenaenroro YKa3aTeJ1H. B CBOtO oxepens meers xacreri conepxar rnmraauars rnan.
Hacms J KHHfH HBJ1HeTCH BBO)lHOM. B Hei1 npencraanensr OCHOBHble CBe)leHHH 0 CHCTeMe DirectX, pacrnrcansr KOMnOHeHTbl, BXOMmHe B ee COCTaB. ,LlaeTcH cpasneuae DirectX C OpenGL. KpaTKO onacsmaerca cpena pa3pa60TKH Borland Delphi. PaccMaTpHBatOTCH B03MO)l(HOCTH 6H6J1HOTeKH COM. ,LlaeTcH onacamre HHTep<}leMcoB H COM-06beKTOB, YHHKaJ1bHblX HJleHTH<}lHKaTOpoB H pesynsrara BbI30Ba MeTO)lOB. B 3aKJJtO'leHHe npHBO)lHTCH npuuep: nHweM COM-cepBep H KJ1HeHTCKYtO xaers,
'Iacms II conepxur ormcamre rpa¢H'leCKOM nO)lCHCTeMbl DirectX Graphics. TIepBM n0J10BHHa npennaraer onncanae pa60TbI nO)lCHCTeMbI Direct3D. MbI 06cy)lHM pa60TY B OKOHHOM H n0J1H03KpaHHOM pe)[(HMax. Ha~U1McH' pHCOBaTb pa3J1H'lHbIe npHMHTHBbI, CTPOHTb Pa3J1HlJHbIe <}lHrypbl "3 npHMHTHBOB na nJ10C-
l
KOCTH H B npOCTpaHCTBe. TIO)lP06HO H3Y'lHM patiory C MaTpHuaMH H pasfepeu;
xaxue rtrnsr MaTpHU HCn0J1b3YtOTCH B Direct3D, H JlJ]H xero Ka)[(JlM H3 HHX npennaaaaseaa, Ha npaxrnxe Hayql1McH CTPOI1Tb rpexvepnsre ci6neKTbl H3 npnMHTHBOB aa npnaepe KY6a, 113Y'lHM cBOMCTBa OCBemeHHHH MaTepHaJ10B, naY'lHMCH 'HCn0J1b30BaTb TYMaH 11 paoorars C rexcrypon. 113Y'lHM pa3JIH'lHbIe THnbI <}lHJ1bTpaQHH TeKCTYP, TaKHe KaK J1HHeMHasr <}lHJ1bTpaUHH, aHI130TponHM 11 MHOroyposnesaa <}lHJ1bTpaUI1H. BbInCHHM B03MO)I(HOCTH 6H6J1HOTeKH YTHJ1HT D3DX H paccsrorpmr mesh-otrsexrsr. Hayql1Mcsr pafiorars C TeKCTOM na nJ10CKOC'"fH H B npocrpancrne, HaKJ1a)lbIBaTb na OOoeKT HeCKOJ1bKO TeKCTYP, a raxxe H3Y'lHM MyJIbTHTeKCTYpHpoBaHHe na npastepe. 06CY)lHM B03MO)[(l-:OCTb C03J].aHI1S1 npoapasnsrx 06'beKTOB pa3J1H'lHbIMH cnocoeaxm H HayqHMcs; HCnOJlb30BaTb 3<}l<}leKT pa3MblTHR npn )lBH)[(eHHH (Motion Blur). Paseepev, 'ITO TaKOe urerinepsr, 11 naY'lHMCH nncars HX na assrxe HLSL.
Bropas n0J10BHHa nOM 'laCTH nxparue onncsraaer B03MO)[(HOCTH H npHeMbl pa- 60TbI C nO)lCHcTeMoM DirectDraw. Byner nposezten 0630P 6HMHOTeKH, ee B03- MO)[(HOCTeM, )lOCTOHHCTB H HenOCTaTKOB. MbI H3yqHM nOpR)lOK pa60Tbl C )laHHOM noncacreuoa, HayqHMcH pafiorars e HeM B nOJIH03KpaHHOM H OKOHHOM pe)l(HMax, paCCMOTpHM Pa3J1H'lHbIe Tl1n!>I nOBepXHOCTeM DirectDraw. Y3HaeM, '-ITO Taxoe UBeToBOM KJ1tOlJ H 3a'leM OH Hy>KeH, 06Cy)lHM pa60TY C naJ1HTpOM, HaY'IHMcR
pa60TIlTb C nOBepXHOCTbIO Hanp5lMYIO H pa36epeMC5I, KaK pa60TIlTb C oaepnetrHblMI1 nOBepXHOCT5IMH.
OCHOBHbIM OTnWlHeM ::}TOH 'laCTH OT nocneayiounrx SIsnHeTC5I TO, '-ITO J.13Y'-leHl1e nOnCHCTeM Direct3D U DirectDraw nOCTpoeHO no npmrunrry npauepos, T. K. 3TO HaH60nee npOCTOH H yn06Hbli1 cnocof H3Y'-leHH5I pa60TbI C rpa¢HKoti:. B nanbHeti:llleM, B Ka)f([{OH '-IaCTU KHHru M5I onacsrsaenon nOnCUCTeMbI 6ynYT C03!(aHbl C06CTBeHHbie KJIaCCbI H npnxrepsr HX HCnOnb30BaHU5I.
'Iacms III ortncsmaer pa60TY C nOnCUCTeMOH DirectSound. Msr paCCMOTpHM ofinacrs npHMeHeHH5I naHHoti: nOnCHCTeMbl, ee nOCTOUHCTBa U HenOCTaTKH, U3}"tHM npUHUHn pa60TbI. Paafiepera, '-ITO raxoe ypOBHH B3aHMonei1CTBH5I H nOTep51 6y¢epOB. HaY'-lHMCH socnponaaoznm, WAY -¢atJ:nb[ H HaKJI8!(blBaTb na 3ByK paanu-ntste 3¢¢eKTbl. Byner rtpencraanen KJIaCC, ynpouiaiouiaa pa60TY C DirectSound, non Ha3BaHHeM TdxSoundManager, H paccvorpen npasrep ero Hcnonb30BaHH5I. 3aTeM MbI H3}"tUM cnOC06b[ 3aXBaTa 3ByKa H 3anUCH B WAV¢atin. ,lln51 3TOro HaMH 6yneT paccxrorpea xnacc TdxSoundCapture BMeCTe C npmrepox«
'Iacms IV paccxaxer HaM 0 noncacreue DirectMusic H ee OTnH'lHHX OT DirectSound. C nOMOlUbIO nee Mbl HaY'-lHMc5I aocnpoaaaoznrrs MIDI- H WAV¢ati:nbl. EynYT npeztcraanetrst KJIaCCbl TdxMusicSegment H TdxMusicManager, onacsraaroutne 3ByKOBOti cervenr H MeHen>Kep aocnpoaasenenns COOTBeTCTBeHHO.
'1acmb V onacusaer pafiory C YCTpOifcTBaMI1 BBOna. MbI H3}"tHM pe>KUMb[ pafioTbl 11 YPOBHU B3aHMoneti:CTBH5I H pa36epeM 06lUHH' anropHTM patiorsr, PaccaorPHM KJIaCC TdxlnputManager, ynpouraiouma pafory C xnaaaarypoti, MbllllblO H Jl)((oti:cTHKOM, H npmrep ero HCnOnb30BaHH5I.
'{acms VI COnep>KHT HH¢opMaUHIO 0 nOnCHCTeMe DirectShow. 3TO apXHTeKTypa, n03BOn5lIOmM ynpannars nOTOKaMH MYnbTHMeJll18!(aHHb[x. Cuasana MbI paccvorpmr ofinacrs npHMeHeHU5I naHHoti: apxnrexrypu H rtoaaepxneaevsre ¢opMaTbl nOTOKOB naHHhIX. IbY'-IHM TaKHe nOHHTH5I, KaK ¢HnbTp, rpadr ¢HnbTPOB H MeHen>Kep rpadia ¢HnbTpOB. Paccuorpnsr cnocofist aocrtpoaaseneHH5I TaKHX MynbTHMenHa¢opMaToB, KaK AVI, MPEG, MP3 H np, Pastiepesr pa60TY UHTep¢eHCOB ynpaanenaa ¢HnbTpoM, KOHTaKTOM, pa60TY uHTep¢eti:ca rparpa ¢HnbTPOB U uHTep¢eti:ca ynpaanenna rpa.poM .pHnbTpoB. PaCcMOTpUM UHTep.peHcbl ynpaBJIeHH5I n03HUHoHHpoBaHHeM B nOTOKe; yrtpaBJIeHH5I BbIBOnOM 3BYKa, ynpaBJIeHH5I MexaHH3MOM C06blTHti, ynpaBJIeHH5I BbIBOllOM suneonaHHbIX H HHTep.petic nepexaara xanpa H3 nOTOKa saneo . .lln51 pafiorsr C noncUCTeMoti: DirectShow 6yneT rrpeacraanen KJIaCC TdxMediaPlayer, KOTOPblH .paKTH'-IeCKH HHKanCYJIHpyeT Ha60p CBOti:CTB H MeTOllOB, xapaxrepnstx llJ151 MynbTHMenHanpOHrpblBaTeJIH, a npnxep HCnOJIb30BaHH5I xnacca H 6YneT TeM caMbIM nponrpsmareneu.
3aTeM nepenneu K H3Y'lemnO apXHTeKTYPbI aaxsara H306pa)f(eHiHI 11 3BYKa 11 pa3- 6epeM pa60TY BCeX Hy)f(HbIX HaM HHTep<PeMCOB. HaY'lI1MCH nepe-nrcnsrn, YCTpOMCTBa onpenerremrsrx KJlaCCOB. PaCCMOTpHM pe}f(I1Mbl npenaaprrrensnoro npocMOTpa 11 saxsara nOTOKOB LlaHHbIX. 113yqHM B03MO}f(HOCTb 3aXBaTa H306p3}f(eHI1H 11 3ByKa OLlHOBpeMeHHO, a raxxe HaY'lHMCH C}f(I1MaTb rtonyvemrste namrsre. 06- cyLlI1M B03MO}f(HOCTb HaCTpOMKH YCTPOMCTB C nOMOlUblO CTpaHHU CBOMCTB H pacCMOTpI1M o6myIO nOCJleLlOBaTeJlbHOCTb uraron, Heo6xOLll1MbiX ,llJIJI nOJlY'leHHJI JlaHHbIX C pa3JlH'lHbIX YCTpOMCTB 33XBaTa. Kxacc TdxCaptureManager, KOTOPbIH 6Y.lleT paCCMOTpeH HaMH B KOHue qaCTH, ofecnexasaer B03MO}f(HOCTb 3aXBaTa H npensaparensnoro npOCMOTpa BI1LleOnOTOKa H nOTOKa aYLll10 OLlHOBpeMeHHO.
B 3Q1CJI1O'leHUU 6YLleT nonsenen KpaTKHH nror KHHfH, a raxxe rtpezrcraaneua HHcPoPMaUHH, KaK MO)((HO CB1l3aTbCH C aBTOpoM KHHfH.
OpHJlO)((eHHJI, xoropsre npencraanensr B KOHue KHHfI1. conepxar HH<popMaUI1IO o H3H6OJlee HHTepeCHblX mrrepner-pecypcax, KOTOPbIMI1, TaK I1JlH HHa'le, nons- 30BMCJI B ceoe BpeMJI aBTOp KHHfH H nonssyerca cekxac, 11 onacanne npnnaraevoro K KHHre KOMnaKT-.llHCKa.
B KHHre raxxe npncyrcrsyer cnHCOK mrreparypu, KOTOPblH nOMO)((eT 'lHTaTeJlIO HaHTH LlOnOJlHHTeJlbHYIO HH<popMaUHIO.
Hy H rrocneznree - 3TO npeLlMeTHbIM yxasarens. OH rtpeztcraanaer C060H HaH6onee Y.l106HbIH HHCTpYMeHT LlJ1JI nOHCKa B KHHre no KJlIOl.J.eBbIM cnosav.
Tpe60saHLUI K KOMnblOTepy
L1 nporpaMMHoMy o6ecne ... eHL11O
LlAA otiecneteaaa KoppeKTHOH pafiorsr scex npHMepOB, npnaenennsrx B KHHre, peKOMeHJlYeTCH CJleLlYIOlUM KOH<pHrypaUHH KOMnblOTepa:
CJ npoueccop Intel Pentium III 1000 Mfu H suure;
CJ snaeoxapra 32 M6aHT (l024x768) H 60Jlee npoH3BOLlHTeJlbHaH, nonaepxn-
BalOlUaJI paoory C DirectX 8.0 H ssnne;
CJ oneparanaaa naserrs 128 M6aHT 11 ssnne; CJ )((eCTKHi1 LlHCK 06'heMOM 10 f6ai1T H fionee; CJ CD/DVD-npJ.1BOLl;
CJ onepaUHOHHaJI CI1CTeMa Microsoft Windows 2000jXP/Server 2003; CJ DirectX 9.0;
CJ YCTaHOBJleHHaH cpena paJpa60TKH Borland Delphi 7 H crapure.
He cnenyer C'lHTaTb npHBeLleHHYIO KOH<pHrypaUHIO KOMnblOTepa OKOH'laTeJ1bHoH. ITpHMepbI 6YLlYT patiorars H na KOMnblOTepe C MeHbllleH npOH3BO.llHTeJlbHOCTblO.
6
BBe~eHUe
OLlHaKO Tpe60BamU! K DirectX na KOMnblOTepe He MemllOTCH - LlOJDKHa 6bITb YCTaHOBJIeHa BepCHH He HH>Ke BepCHH DirectX 9.0.
Ha npanaraevou K KHHre KOMnaKT-LlHCKe (CM. npWIOJlCeHUe 2) pacnonararorcn Heo6xoJll1Mble lUIR C60PKH npnaepoa 3arOJIOBO'lHble <PaMJIbl DirectX, a TaK>Ke 6H6JIl1OTeKH, Heo6xOLll1MbIe lUIR patiorsr C rpa¢wlecKoH nOLlCHCTeMOH Direct3D.
Bee npavepu 6blJI11 npOTeCTl1pOBaHbI, KaK MHHHMYM, na rpex xovnsiorepax cnenyrouieti KOH¢mypaUl1H:
D Intel Pentium IV 2,4 ffu\512 Mfiatir DDR\128 NVidia FX 5200\120 f6aHT HDD Maxtor\DVD-RW Nec\Windows XP SP2\DirectX 9.0c;
D Intel Pentium IV 3,0 ffu\1024 M6aHT DDR\128 ATl Radeon 9250\80 f6atiT HDD Seagate\DVD-Rom ToshibaxWindows XP SP2\DirectX 9.0c;
D HOyr6YK BLISS 507S: Intel Pentium M 1,73 rrixsu M6aHT DDR\128 ATI
Radeon X700\60 f6aMT HDD\DVD-RW\Windows XP SP2\DirectX 9.0c.
,llrrR KOppeKTHOH pa60TbI rrpavepon BbI LlOJI>KHbl YKa3aTb B nacrpoaxax cpensr Borland Delphi nyrs K nanxe C 3aroJIOBKaMH DirectX, xoropsre HaXOLlRTCR B xaranore DirectX npanaraeuoro K xanre KOMnaKT-LlHCKa. A B nanxe Lib xpaHRTCR 6H6JIHOTeKH, Heo6xoLlHMbIe JlJ1R pa60TbI npHMepoB C nOLlCI-lCTeMOM Direct3D. BaM Heo6xOLll1MO nepenacars 6H6JIl10TeKH B TaKOM xaranor y Ce6R na KOMnblOrepe, K KOropOMY nporurcan nyrs B nactpotixax Windows, nanpuvep, Windowsv System32.
4ACTbi
05LUIAE CBE.QEHIA~
Fnasa 1
DirectX
CI1CTeMa DirectX rrpencraanaer C060M 60JIblllOH Ha60p API-<PYHKUI1M HI13KOro ypOSHfI, n03S0JIflI01lII1X paapafarstaars paamonrsre SblCOKOnp0I13S011I1TeJIbHble rpa¢WlfCKI1e 11 MYJIbTI1Me,lll1anpI1JIO)l(eHI1f1. I1MelOTCfI cpencrsa ,llJIfi pa60ThI co 3SYKOM, YCTPOMCTSaMl1 asona 11 ynpouieira paapafiorxa ceresux npI1JIO)l(eHI1M. I1cnOJIb3yeTcfI CI1CTeMa saxacryro B TaKI1X otinacrax, KaK paspadorxa KOMnblOTepHhIX HIp 11 CI1CTeM 6e30naCHOCTI1.
npaKTl1'-1eCKI1 sees Ha60p API-¢YHKUI1M, TaK I1JII1 I1Ha'Ie, 6a3l1pyeTcfI na TeXHO- 110rMl1 COM.
COCTaB DirectX
Csoe 3HaKOMCTBO C MOIllHoi1 CI1CTeMOM, I1MeHyeMoM DirectX, MbI Ha'-lHeM C 113y'-IeHI1f1 ee COCTIlsa. I1TaK, SOT OCHOSHble KOMnOHeHTbl (nO,llCI1CTeMbI), SXO,WHUl1e S COCTIlS DirectX:
D DirectX Graphics - KOMnOHeHT, 06'be,llI1HHSllIHM S ce6e nae MOllIHbIX rpa¢l1- 'IeCKI1X nO,llCHCTeMbI nna pa60TbI C ,llsYMepHoti 11 rpexvepnon rpa¢I1KOM - DirectDraw H Direct3D;
D DirectShow - apxnrexrypa, n03S0lliIIOllIaSi ynpaanars 3aXBaTOM H SOCnp0I13- se,lleHl1eM MY11bTI1Me,llHanOTOKOS;
D Directlnput - nO,llCI1CTeMa, I1CnOJIb3yeMM nna pa60TbI C pa3JII1'IHbIMH YCTpOMCTSaMI1 snona, TaKI1MI1 KaK xnaanarypa, MbIllIb, ,ll)I(oiicTI1K, 11 ,llpyfl1MH I1rpOShIMI1 YCTpoikTsaMI1 (nanpaxrep, YCTpoHCTsaMI1 C o6paTHoM caaasio);
D DirectSound - KOMnOHeHT DirectX, o6eCne'IHSalOllIHM pafory C oumpposaHHbIM 3SYKOSbIM nOTOKOM;
10
liaCTb I.
o DirectMusic - KOMnOHeHT DirectX, TaK )f(e KaK H BalOlUl1H paoory co 3BYKOBhIM nOTOKOM, TOJIhKO nO,lUlep)l(I1BaIOlUI1M pafiory
C ¢opMaToM MIDI;
o DirectPlay - nOnCHCTeMa, n03BOllillOIUa51 paapaoarsmars TeJIbCKl1e npanoxeana, SlpKI1M npHMepoM KOTOPhIX CJI~aT TeJIhCKl1e nrpsr;
o DirectSetup - npocron Ha60p API-¢YHl<UI1H, n03BOllillOlUI1M KOMnOHeHThI DirectX OnHI1M BbI30BOM;
o DirectX Media Objects (DMO) - 6a311pYlOlllHecSl na TeXHOJIOrHl1 COM KOMnOHeHTbI nonaepxx« nOTOKOBhIX 06'beKTOB.
DirectX MnM OpenGL?
KaK H3BeCTHO, nOMI1MO TeXHOJIOrHl1 Direct3D, MSl ssraona rpexuepnoji rpadiaKI1 CYlUecTByeT euie UeJIbIM PM TeXHOJIOfl1H, onHOM 113 KOTOPhIX SlBJISleTCSI OpenGL. naHHaSI TeXHOJIOfHSl unrepecaa CBoeM nO,lUlep)l(KOM OTJIl1'lHhlX OT CI1CTeMbI Microsoft Windows onepaUI10HHbIX CI1CTeM, B TO BpeMSl KaK DirectX coBMeCTHMa TOJIhKO C OC Windows. Co6cTBeHHo 6bIJIa naxe csoeofipaarraa BOMHa Me>Kll.Y CTOpOHHI1KaMH 3TI1X CHCTeM.
Ho ua 3TOM I1X KOHKYpeHTOcnoco6HOCTh 11 3aKaH'lI1BaeTCSl: B CI1CTeMe OpenGL OTCYTcTByeT nonaepxxa pa60ThI co 3BYKOM, cersio, yCTpOHCTBaMI1 ssona 11 T. n, 3aTo OTneJIhHbIe KOMnOHeHThI DirectX rrpexpacao ~I1BaIOTCSI C OpenGL, 'ITO 11 BOCnOJIHSleT see np06eJIhI.
[
rllaBa 2
CpeAa pa3pa6oTKM Borland Delphi
113ytffiTb CI1CTeMY DirectX MbI 6yneM np"MeHITelIbHO K Sl3bIKy rrporpaxoaapoaaHHSI Pascal, 11 paoorars 6yneM B nOSOlIbHO nonynapnott cpene pa3pa6OTKI1 Borland Delphi 7. C06cTseHHo BepCI1S1 ocotioro 3Ha'IeHI1S1 He I1MeeT, 6ynb TO 601Iee pamulSl I1lII1 n03nHSI$I sepcna - nOCTaTO'IHO YCTaHOSI1Tb COOTBeTCTSYIOlUl1e sepCHI1 3arOlIOBO'IHbIX <paHnOB DirectX 11 3anYCTHTb HaWI1 npnxrepsr. ITPI1 HeS03- MO>KHOCTI1 OTKpbITI1S1 rrpoexra (HecoOTBCTCTSl1e <popMaTa <pOPMbI 11 T. n.) nOCTaTO'IHO coanars HOBbrH npoexr 11 nepeHCCTI1 xon B Hero .
. 1
CTPYKTypa cpeAbl pa3pa6oTKM
I
. .
Cpena pa3pa60TKI1 Borland Delphi 7 COCTOI1T 113 HeCKOlIbKI1X OTnelIbHO pacno- 1I0>KeHHbIX <PYHKUI1OHaJIbHbIX OKOH. K OCHOBHbIM MO>KHO OTHeCTI1 cnenyrounre OKHa:
o namrrpa KOMnOHeHTOB (Component Palette);
o nl13aHHep <pOPM (Form Designer);
D nepeso 06'beKTOB (Object TreeView);
o I1HCneKTOp 06oeKTOB (Object Inspector);
o OKHO penaxropa xozta (Editor Window).
JilMeIOTCSI TaK>Ke 11 paannsnrsre OKHa OTlIa.rlKI1, naerpoex 11 T. n, 06111I1H BHJl cpensr pa3pa6OTKH Delphi nocne 3anYCKa npeneraanen na P"C. 2.1.
Cnepxy pacnonoxena namrrpa KOMnOHeHTOB, non HeM crresa pa3MemaIOTC5I npyr non npyrosr nepeso 06'bCKTOB 11 I1HCneKTop 06'bCKTOB. Cnpasa OT HI1X HaXO,llSlTCSI OKHO peztaxropa xona H LlU3aHHep <pOpM.
12
PMc. 2.1. Cpena paapatiorxa Borland Delphi
nepBoe npMJ10)l(eHMe
C0311aBaTh npunoxenns B Delphi oxem, Yllo6HO 11 naxe npocro. Bufiepen nYHI<T MeHIO File I New I Application, 11 Y Hac nOSIBmleTCSl xapxac npl1J10)KeHI1Sl C roroBhlM <paMJlOM npoexra 11 OllHOM <pOPMOM (pnc. 2.2). COXPaHl1B npoexr na 11I1CK H naxas KJIaBl1wy <F9>, Mhl oTKoMnHJIl1pyeM 11 aanycrna naure npl1J10)KeHl1e, cocroauiee 113 OlIHOM nYCTOM <pOPMbJ. KaK 6bl TaM HI1 6bIJlO, 3TO 3aKOH'leHHOe npnnoxenae, nycn, 11 a6COJIIOTHO 6eCnOJle3HOe C TO'lKI1 3peHI1Sl <PYHKUI10HaJIbHOCTI1, 3aTO B naJIhHeMmeM raxoe npocroe C03naHl1e OKOH CI1J1hHO OMerlJl1T nawy }l(113Hh.
(/18Ba 2. CpeAa pa3pa6oTKu Borland De/phi
13
PMc. 2.2. nepBoe npli1110>KeHli1e
OlIHaKO He CTOHT .uyMaTb, 'lTO pafora C non:CHCTeMOH DirectX HaCTOJ1bKO )Ke npocra, HaCKOJlbKO H C03naHHe npocretiurero npH110)l(emrn B Delphi.
6M611MOTeKa COM
Fnaea 3
TaK xro }l(e TaKOe COM? lITO 3TO sa 6H6mlOTeKa H 3alleM OHa H}l)KHa? Iloseay DirectX 6a3HPYeTCSI aa COM?
PacllIH¢POBblBaeTCSI a66peBHa'fYpa COM KaK Component Object Model - MOJIeJIb KOMnOHeHTHbIX o6'beKTOB. MOJIeJIb He 3aBHCI-1T OT rurartpopasr, SIBJlSIeTCSI pacnpeJIeJIeHHOH 06oeKTHo-opHeHTHpOBaHHOH CHCTeMOH JlJlSI C03JlaHHSI 6HHapHbIX HHTepaKTHBHblX KOMnOHeHTOB. H B CBSI3H C TeM, 'ITO, KaK yxe 6bl1I0 CKaJaHO, DirectX 6a3HPYeTCSI aa COM, MbI JlOJl}l(Hbl HMeTb xora 6bI MHHHMMbHoe npencraaneaae 0 JIaHHOH 6HMHOTeKe H yMeTb nOJIb30BaTbCSI ee B03MO}l(HOCrnMH. HecMOTpH ua TO, 'lTO 6H6JIHOTeKa COM nOKruKeTCH KOMY-TO CJlO}l(HOH H JanYTaHHoH, B 60JIbWHHCTBe cnysaen ee HCnOJIb30BaHHe B paapafiorxe npanoxeHHH C novoiuuo DirectX OKa3blBaeTCH JIOCTaTO'lHO npOCTbIM.
COM MJ11i1 DLL?
EH6JIHOTeKH JIHHaMH'leCKOH KOMnOHOBKH (DLL, Dynamic Link Library) npenoCTaBJlSIlOT CXo~ ¢YHKUHOHMbHOCTb. TIpHlIO}l(eHHe nonrpyxaer 6HMHOTeKY H MO}l(eT HCnOJIb30BaTb ee ¢YHKUHOHMbHOCTb B CBOHX ueJISIX. TIOn.06HO DLL, o6'beKTbI COM npeJIoCTaBJlHlOT MeTOJIbI, xoropsre npHJIO}l(eHHe MO}l(eT HCnOJIb- 30BaTb no CBoeMY YCMOTpeHHlO. B3aHMon.eHCTBHe C 060eKTaMH COM npOHCXOJIHT npaKTH'leCKH TaK }l(e, KaK H pafiora C 060eKTaMH Delphi. Ho HMeeTCH H ueJIbIH PHD. OTJIH'lHH:
o 060eKTbI COM HMelOT fionee crporyto HHKanCYJlSIUHlO. MbI He MO}l(eM npocro TaK C03JlaTb COM-06'beKT H HCnOJIb30BaTb Bee ern MerOJlbl, T. K. see MeTOJlbI, TaK HlIH HHalle, crpynnaposanu no HHTep<PeHcaM. ,llJIH BbI30Ba onpenenennoro MerOJla HaM MO}l(eT nOH<1.ll06HTbCH C03JlaTb COM-06oeKT H 3anpOCHTb H}l)KHbIH HHTep¢eHC;
(nasa 3. 5u6nuoTeKa COM
15
o o6'beKTbl COM - 3TO He o6'beKTbI Delphi, 11 npouecc I1X C03.llaHI1~ 6Y.lleT I1HbfM. Cyurecrayer HecKOJlbKO cnocofioa c03.llaHI1~ COM-06'beKTOB, HO BCe OHH I1CnOJlb3YIOT MeTO)lbl 6116J1I1OTeKI1 COM. API CI1CTeMbl DirectX conepxar PM MeTO)lOB, xoropue ynpoutator c0311aHHe HeKOTopbIX 06beKTOB DirectX;
o JlJI~ ynpaBJIeHI1~ }I(I13HeHHbIM Ul1KJ10M 06'beKTa Mbl .llOJI}I(Hbl TaK }I(e nOJIb30- BaTbC~ MeTO)laMH 6H6JII10TeKI1 COM;
o COM-06'beKTbI He Tpe6YlOT ~BHOH 3arpY3KI1. 06bl'-lHO 3nI 06'heKTbl COM TaK }I(e pacnonaraiorca B DLL, HO HaM He Tpe6yeTc~ aarpyxars 3Ty 6u6J1110TeKY I1JlI1 nO)lKJIIO'laTb ee CTaTI1'-leCKI1 .llJIfi I1cnOJ1b30BaHI1~ COM-06'beKToB. Kax)lblH COM-06'heKT I1MeeT CBOH YHI1KaJIbHblH l1)leHTI1<imKaTOp, KOTOPblM 11 I1CnOJIb3yeTCfI JlJIfi ero C03.llaHl1f1. COM aBTOMaTI1'-leCKI1 sarpyxaer H~HYIO 6116- JII10TeKY DLL;
o nOCKOJIbKY MO)leJIb COM npencraanser C060H crannapr 611HapHoH paapafiorKH .llJI~ nporpaMMHblX KOMnOHeHTOB, TO 3TO oanasaer He3aBHCHMOCTb OT assixa pa3pa60TKI1. Coanaaaeauc o6'beKTbl MOlyT surtonanrsca B OllHOM npouecce, B pa3HbIX npoueccax 11 naxe aa llpyroM xosmsrorepe.
06beKTbilil MHTepcpei1cbI
Bsnue yxe 6hlJ1o ynovsayro raxoe nouarae, KaK uumepdeiic. non lIHTep<peHcoM nOHHMaeTCfI Ha60p crpyrmnposamrsrx no onpeaenenasta npl13HaKaM MeTO)lOB. CO M -06'beKT - 3TO peanaaauns I1HTep<peHca. (O.llHOrO HJlI1 HeCKOJIbKHX 0)lH0- apeueano). To ecrs <paKTH'-leCKM npa Bbl30Be KaKOrO-JII160 MeTana I1HTep<peHca MbI BbI3bIBaeM MeTO)l o6'beKTa. OT)leJlbHO cnenyer ynosotnyrs, 'ITO KaK OMH COM-06'beKT MO}l(eT peaJIH30BblBaTb npOH3BOJlbHOe KOJll1'leCTBO HHTep<peMCOB, TaK H O)lI1H MHTep¢eHC MO)f(eT pea.rIH30BbIBaTbC~ Pa3JIH'lHblMH 06'beKTaMH COM.
B Delphi ecrt, TaKOe nOH~Tl1e, KaK atcmpaxmnuii uemoi). 1-13 TaKI1X MeTOllOB CTpOflTC~ aticmpaxmuue xnaccu. I1HTep<peMcbI 11 afcrpaxraae KJlaCCbI osem, CXO)f(11 no caoeii cyrn, HO I1MelOT 11 PM cymeCTBeHHbIX OTJII1'-lI1H. Hanpavep, xnacc, HBJI~lOml1tlcfl npoaasomrsrv, MO}l(eT peanaaoasman, HeCKOJIbKO I1HTeP¢eHCOB, B TO BpeM~ KaK y Hero MO}l(eT 6blTb TOJIbKO O.llHH 6a30BbIH xnacc.
IAHTepcpei1c IUnknown
TaK }I(e KaK H xnacc Delphi HMeeT 6a30BblH xnacc TObject, TaK 11 .llJI~ HHTep<peHcoB onpenenen 6a30BbIH I1HTeP<l>eHc - !Unknown. no npaane rosopa, B Delphi, Ha'lHHM C 6 BepCI1I1, 3TOT I1HTep¢eHc I1MeHYeTC~ !Interface, 'lT0 B rtpmruane He MeHReT ero cyrn. .llJI~ j,IHTep<peHCOB, B OTJlI1'll1e OT 06'beKTOB, HaCJlenOBaHHe He MO}l(eT osaavars nosropnoro I1CnOJIb30BaHl1f1 xona, T. K. I1HTep¢eHC 11 ero peannaauna - nse a6COJllOTHO pasuue seunt. Taxxe H~HO CKa-
16
4aCTb I.
sars, 'ITO uacnenosaaae I1HTep¢eHCOB He MO)l(eT 6bITb BbI60pO'-lHbIM, T. e. 113BonHbIH I1HTep¢ewc nacnenyer see MeTOnbI 6aJOBOro MHrep¢ewca.
MHTep¢ewc IUnknown conepxar scero TpM BI1PTYarIbHbiX MeTOna. Ilepauii - 3T0 nonyseime YKa3areJISI na HHTep¢ewc COM-06beKTa: function QueryInterface(
const 110: TGUID; out Obj) :
HResult; stdcall;
3neCb:
o IID - YHHKaJIbHbIW H.neHTH¢I1KaTOp aanpauiasaeuoro mrreppenca;
o Obj - nepeuenaas, B KOTOPYIO 6y.neT aanecen aanpaurasaeaun mrrejxpeac. fum 06beKT He nonnepxasaer 3anpaWI1BaeMbIH HHTep¢eWC, TO B nepevenHYIO 6yneT sanacano HYJIeBOe (NIL) auasemre.
OCTaBWHecSI naa MeTOna ynpaBJISIIOT nOnC'leTOM CCblJIOK. YBeJIH'leHl1e CCblJIOK na enl1HI1lZY:
function _AddRef: Integer; stdcall;
III YMeHbWeHHe '-II1CJIa CCblJIOK na o6beKT na enHHHUY: function _Release: Integer; stdcall;
Meronu ynpaBJIeHHSI nO.nC'-IeTOM CCbIJIOK He rpefiyerca BbI3bIBaTb B SIBHOM BHne - Delphi cnenaer 3TO aBTOMaTI1'leCKI1. 3TO oanasaer, 'lTO npa C03JIaHHH COM-06beKTa 6yneT aBTOMaTH'leCKH BbI3BaH MeTOn _AddRef, a npu npHCBaHBaHHH YKa3aTeJIIO na HHTep¢eWc 3Ha'-leHI1SI NIL (MJII1 xorna 06'beKT Bblw.neT sa 06JIaCTb Bl1nI1MOCTI1) aBTOMaTI1'leCKI1 6yneT BbI3BaH MeTOn _Release.
KaK BhI yxe HaBepHO ycnemr 3aMeTI1Tb, B MeTOne QueryInterface nepBbiM napasterpov Mbi nepenaesr HeKI1H YHI1KaJIbHbIH l111eHTH¢I1KaTOp sanpauraeaevoro I1HTep¢eHca, I1MelOlUl1H ran naanux TGUID.
fJIo6aJIbHbie I1neHTucpl1KaTOpbI SIBJISIIOTCSI KJIIO'leBOH COCTaBJISIlOlUeH 6116JII10TeKI1 COM. ECJ111 npOCTO nOCMOTpeTb na 3TOT l1.D:eHTI1¢HKaTOp, TO 3TO 06bI'lHaH crpyxrypa (3anI1Cb), COCTOSIlUaH 113 128 6I1TOB. Ilpa C03.naHI1I1 l1.neHTl1cpl1KaTOpa raparrrapyercn ero YHI1KaJIbHOCTb. COM WI1POKO I1CnOJIb3yeT 3TH l1.D:eHTI1¢I1KaTOphI ,lI)ISI CJIenYlOlUl1X uenea:
o .n.rrSI YHI1KaJIbHOi1 HneHTI1¢I1KaUHH COM-06beKTa. TaKHe I1neHTI1¢I1KaTOpbI Ha3hIBalOTCSI uoenmutpuxamopauu /C.IlOCCO (Class Identifier, CLSID). OHH 6ynYT I1CnOJIh30BaTbCSI HaMH WISI C03naHI1SI KOHKpeTHOro COM-06beKTa;
rnaBa 3. 5u6nuoreKa COM
17
o DJUI HlIeHTI1<pI1Kamm onpeneneanoro HHrep<PeHca. 3I-Ia'leHHe G UID, xoropoe onpenenser nexoropun HHrep<peHc, 6YlIeT Ha3bIBaTbCSI uoeumuduxamopou uumeptpeiica (Interface Identifier, 110).
HecMoTpSI aa TO, 'lTO YHHKaJIbHbIH l1.neHTH<pHKaTOp npe.nCTaBJISIeT c060tf CTpYKTYpy, ero nepeaxo 3anHCblBaIOT B anne CTpOKH. Ee <POp MaT - 3TO nsrs urecmaauaTepH'lHblX uenux 'lHCeJI B <popMare 8-4-4-4-12 HlIH II (xxxxxxxx -xxxx-xxxxxxxx-xxxxxxxxxxxx}". Hanpauep, 111IeHTH<pHKaTOP HHTeP<PeHca IDirect3D9: {81BDCBCA-64D4-426d-AE8D-AD0147F4275C}
H.neHTH<pHKaTOp 3anOMHHTb .nOCTaTO'lHO npo6JIeMaTH'lHO, H npn ero Hanl1CaHHH JIerKO J],onYCTHTb oWI16KY. Topaano rtpoute HCnOJIb30BaTb ero 3KBHBaJIeHTHOe HMSI. K npmrepy, 3TO HMSI MbI MO)J(eM HCnOJIb30BaTb lIJISI C03.naHHSI COM- 06"beKTa. no npHHSITblM comaWCHHSIM MbI .nOJI)l(Hbl 1I06aBJISITb npedinxcu IID_ HlIH CLSID_ K I1MeHH I1HTep<petlca HJIH 06"beKTa. Hanpuuep, lIJISI HHTep<PeHca IDirect3D9 l1.[{eHTI1<pHKaTopoM 6yJ],CT aucrynars IID_IDirect3D9.
Pe3Y1lbTaT HResult
MCTO.nbl COM-06"beKTOB B03BpamalOT 32-6HTHoe UCJIO'lI1CJIeHHOe aaaueane TI1- na HResult. B 60JIbWHHCTBe cnysaea THn HResult npelICTaBJISICT C060H CTPYKTYPY, conepxauiyro nae OCHOBHblC I1H<popMaTHBHble 'laCTI1:
o KoppeKTHO JII1 oTpa60TaJI MeTO.n HlIH np0I13011li1a OWI16Ka;
o 60JIee J],eTaJIbHaSI I1H<p0pMauHSI 0 peayrrsrare onepauan.
MO)J(HO HCnOJIb30BaTb B xaxecrse 3Ha'leHI1SI KOHCTaHTbl, onacannsre B Mo.nYJIe Windows.pas, raxne KaK S_OK, E_FAIL, E_UNEXPECTED, E_NOTIMPL 11 T. 11. Ho MO)J(HO I1CnOJIb30BaTb H coficrneuasre 3Ha'leHHSI. Pe3YJIbTaTbl Bbl30BOB MCTOJ],OB COM-06"beKTa 06bl'lHO onHCblBalOTCSI B .nOKYMeHTallHH K HHM.
CYlllecTBYCT cornaurenne, no KOTOPOMY KOJ],bl ycneunroro 3aBepweHHSI MCTO.na Ha'lHHaIOTCSI C npedntxca S _' a KO.nbl 3aBepweHHSI C oWH6KOH - C npedntxca E _' HanpHMep, S _ OK 11 E _ FAIL.
To, 'lTO MeTo.nbl MOryr aoaapatuars pa3JIH'lHbIe BapHaHTbI ycnexa HJIH aeynax«, oanaxaer, 'lTO HaM H)')KHO 6blTb BHHMaTeJIbHbIMH npn aHaJIH3e pe3YJIbTaTa. K npHMepy, MCTOJ], B03BpalUaeT S_OK npn ycrteunrosr sasepurenna paforsr H E_FAIL npa oWH6Ke. Torna KO.n 06pa60TKH pe3YJIbTaTa MO)J(eT asrrnaners CJIelIYlOlUHM 06pa30M:
if Result = E FAIL then begin
II npO~30illITa OlliM6Ka, o6pa6aTOffiaeM end
18
else begin
end;
A reneps nonYCHIM, 'ITO KOn 01lm6KH MO)l(eT 6blTb pasen E_FAIL, E_UNEXPECTED, E_NOTIMPL H T. n. A Y Hac aHaJIH3HPYeTCSI TOJIbKO E_FAIL, H see OCTaJIbHbie OW1160'lHble peaynsraru 6yJIYT 06pa60TaHbi TaK )l(e, KaK H ycneurnue. 3TO oanaxaer, 'ITO HaM nOHa.[{06HTCSI 60JIee neTaJIbHbli1 aHMH3 scex B03- MO)l(HblX pe3YJIbTaTOB.
,ll.rrSI OMer'leHHSI uauiea ne'laJIbHOH Y'laCTH B MOnYJle Windows. pas onpezteneasr 2 Merona, xoropue recTHpYIOT pesynsrar HResul t na npenxer ycnexa HJIH oWH6- KH. nepBbli1 Meron - Succeeded. OH nposepaer; SIBJISIeTCSI JIH pe3YJIbTaT ycneunner HJlH HeT:
function Succeeded( Status: HRESULT): 800L;
3neCb Status - TecTHpyeMoe 3Ha'leHHe. Pe3YJIbTaTOM BbJ30Ba aroro MeTOna 6yneT TRUE, eCJlH 'recrupyevoe 3Ha'leHHe SIBJlSIeTCSI ycneunrsnr pe3YJIbTaTOM BbInOJIHeHHSI Merona, H FALSE - B npOTHBHOM CJIY'lae.
BTOpoi1 MeTOn - Failed, KOTOPbli1 nOJIHOCTbIO npOTHBOnOJlO)l(eH nepBOMY - OH nposepaer, SIBJISIeTCSI JIM pe3YJIbTaT OWI160'lHbiM I1JlI1 HeT:
function Failed{
Status: HRESULT):
BOOL;
Pe3YJlbTaTOM BbI30Ba 3TOro Merona 6y.n:eT TRUE, eCJIH recrnpyeaoe 3Ha'leHHe SIBJlSIeTCSI OWH60'lHbIM, H FALSE - B npOTI1BHOM cnyxae,
B csoea pafore MbI nOCTaTO'lHO '-IaCTO 6yneM npHMeHSITb 3TH naa MeTOna. CKa)l(eM, TOT npaxep, KOTOPbli1 Mbl npHBOnl1JlH panee, nOJDKeH 6bITb ucnpaanen cnenyrouruv 06PaJOM:
if FAlLED(Result) then
begin
II npo~30mna olliH6Ka, o6pa6aTWBaeM end
else begin
I I 0lliH6oK HeT
end;
(nasa 3. 6u6nuoreKa COM
19
Ho He CJ1e.nYeT .nYMaTb, 'ITO ace MeTO.nbl COM-06oeKTOB B03BpmualOT run HResult. TaK, HanpHMep, MeTO.nbI IUnknown._AddRef H IUnknown. Release B03BpaIUaIOT TeKYIUee KOJ1H'leCTBO CCbUTOK na 06"beKT.
VlHM4MaJ1M3a4MR 61i1611lJ10TeKlii COM lJI 3aBepweHlile pa60TblC HeM
Hasanars pa60TY C 6H6J1HOTeKoti COM He06xo.nHMO C HHHUHMH3aUHH . .lJ,JUI sroro HMeeTCSI MeTO.n CoInitializeEx, onacaaaun B Mo.nYJ1e ActiveX.pas: function CoInitializeEx(
pvReserved: Pointer; coInit: Longint):
HResult; stdcall;
3.neCb:
o pvReserved - 3ape3epBHpOBaHO. JJ:OJDKHO HCn0J1b30BaTbCSI HYJ1eBOe anaxeHHe;
o coIni t - q>J1ar, onpenensnouma nOTOKOBYIO MO.neJIb:
• COINIT_MULTITHREADED - MHoronOTO'lHM MOneJ1b - 06"beKTbl MOryr BbI- 3blBaTbCSl H3 paaaux nOTOKOB;
• COINIT_APARTMENTTHREADED - paanensaoe anpecaoe npOCTpaHCTBO Y noTOKOB;
• COINIT_DISABLE_OLEIDDE - OTKJ1l0'leHHe nonnepxxa DDE,llJUI OLEl;
• COINIT SPEED OVER MEMORY - HCnOJ1b30BaH11e 60JIblllerO 060eMa naWiTH
_ _ _
AJ1H YBeJIH'leHHH 6bICTpO.netiCTBHSI.
3TOT MeTO.n np~H3BO.nHT HHHUHaJIH3aUHIO CTaTH'leCKHX H aarpyxaevsrx 6HMHOTeK COM H YCTaHaBJ1HBaeT TeKYIUYIO nOTOKOBYIO Mo.nenb. OH .nOJDKeH 6bITb BbI- 3BaH nepen Ha'laJIOM HCnOJIb30BaHHSl cPYHKUHti COM API (xpoae cPYHKUHH CoGetMalloc H cPYHKUHtf pacnpenenemot naWITH).
nml aasepurenaa pa60TbI C COM He06xo.nHMo BbI3BaTb MeTO.n CoUninitialize, KOTophIti oCB060)l(JlaeT pecypcsr aarpyxemrstx 6H6J1HOTeK:
procedure CoUninitialize; stdcalli
Bbl30B MeTO.na 6y.neT HMeTb ycnex TOJ1bKO rorna, xorna nepen HHM 6bm npOH3Benea BbI30B MeTO.na HHHUHMH3aumt 6H6JIHOTeKH COM. CoInitializeEx. H nao60pOT, eCJ1H fisrn nponaaenea BbI30B CoIni tializeEx, TO BhI30B CoUnini tialize 06Sl3aTeJ1eH.
PMC. 4.1. AL-lanor C03AaHL-lR uoaoro 06beKTa
COM Object
rnaBa 4
nlllweM COM-cepBep C03AaHMe COM-cepBepa
B 3TOH rnase Mbi C BaMH C03,[{a.l{HM nepasrti COM-cepBep, HaY'"lHMcSI ero perncrPWPOBaTb H HCnOJIb30BaTb see ero B03MO}l(HOCTH B CBoeM npHJIO}I(eHl1H. B COM-cepBepa 6yn:er astcrynarr, TaK Ha3~IBaeMbIH In-Process COM Server, peaJIH30BaHHbIH B BH,[{e DLL.
)lJm C03.l{aHHSI TaKOH 6H6JIHOTeKH B Delphi Heo6xo'[{HMO C<pOPMHPOBaTb 6 TeKY ActiveX. BbI6epeM nYHKT MeHIO File I New I Other ... , H Y Hac aa 3KI)aHe, nOHBHTCSI ,[{HaJIOr BbI60pa coanasaeaoro 06beKTa. nepeH'[{eM na BKJIaLIKY ~Ln'o;;.n., H BbI6epeM nYHKT ActiveX Library (pHC. 4.1).
~ ~ ~~ ~ -
s: .~ red!;
COM+ Event COM+ Property Page Transactional Type Library
Object Subscrip~ ... Object rnaea 4. nl1WeM COM-cepBep
21
Coxpannv npoexr non HMeHeM COM_Server. Beer, TeKCT aaurero MOnYJUI cocroar scero 113 HeCKOJIbKHX CTPOK (JIHCTI1Hf 4.1).
library COM_Server;
uses
ComServ;
exports DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer;
{$R *.RES}
begin end.
KaK Mbl Bl1nl1M, B MOnYJIe npHCYTCTBYJOT 'leTblpe sxcnoprapyexrsre <PYHKUHH:
o DllGetClassObject - nOJIY'leHl1e xnacca 06beKTa;
o DllCanUnloadNow - nponepxa B03MO}l(HOCTI1 BblrpY3KI1 COM-cepBepa H3 naM$lTI1;
o DllRegisterServer - perncrpauna COM-cepBepa B CHCTeMHOM peecrpe;
o DllUnregisterServer - ynaneane 113 peecrpa HH<p0pMaUI-1l1 0 COM-
cepsepe.
llJlH HaC HeT Heo6xonHMOCTl1 B peaJ1H3aUHI1 namnrx <PYHKUHH, T. K. OHI1 ~e 11 TaK peaJ1H30BaHbl B Mon.yne ComServ.pas.
Teneps Heo6xonHMO co6CTBeHHO C03naTb KOn COM-cepBepa. llJI$I npauepa $I XOTen 6bl peaJ11130BaTb crrenyrotuyro 11JlelO: Mbl C03na.uHM ofrsexr TSimpleObject, KOTOPbIH 6yneT peaJ1H30BblBaTb naa HHTeP<PeHca - HHTep<peHC KOH<PHIYPHpOBaHI1$1 ISimpleConfigurator 11 HHTep<peHC pHCOBaHI1H ISimpleDrawing. TaK }l(e KaK 11 Jlll$l C03naHI1S1 ActiveX-6116nl1oTeKH, HaM H~i-lO BbI6paTb nyHKT MeHIO File I New I Other ... H nepetrra na sxnanxy ActiveX . .LlaJ1ee crrenyer Bbl6paTb 06beKT COM Object H naxars KHonKY OK. YHac na axpane nOHBI1TCSI MaCTep C03JlaHI1$1 COM-06beKTOB (COM Object Wizard). 3a.ua.nHM napaaerpu COM-06beKTa,
22
'-IacTb I. 06~ue
KaK 3T0 nOKa3aHO aa pMC. 4.2. 3aMeTbTe, '-ITO, HeCMOTpSl na MMSl SimpleObject, B xaxecrse MMeHM peanaayeuoro MHTep<petica MbI YKa3bI ISimpleConfigurator. <D11IDKoK Include Type Library OCTaBbTe OTMe'-leHHbIM, rorna llJISl naurero 06"beKTa 6YlleT aBTOMaTM'-IeCKM creuepapoaana 6M611 TMnOB, KOTOPaSI HaM npnrorurrca npn C03,QaHMM KJ1MeHTcKoro npM110)((eHMSl.
PMC. 4.2. AI-1aIlor C03p,aHI.1S1 COM-06beKTa
Coxpanmr c03llaHHbIti MOllY11h non MMeHeM UnitMain.pas. 06paTMTe BHMMaHMe na TO, 'ITO rerreps B MOllY11e COM_Server.dpr B cnMCOK MCnOJIh3yeMbIx MOllyneti 1l06aBM11Mcb eure 2 - 6M611MOTeKa TMnOB M MOllY11b C HaWMM KJ1aCCOM:
CornServ,
uses
crn Server TLB in 'COM_Server _ TLB. pas ' ,
UnitMain in 'UnitMain.pas' {SimpleObject: CoClass};
BhI6epMTe nYHKT MeHiO View I Type library. Ha sxpane nOSlBMTCSl OKHO penaxTMpOBaHMSl 6M611MOTeKM TMnOB. 3llecb MbI MO)((eM BbIl10JIHSlTb TaKMe .n.eticTBMSl, KaK 1l06aBJIeHMe M ynanenae MHTep<peHcoB, 1l06aBJ1eHMe M ynaneuae MeTOllOB MHTep<J>eHcoB M TMnOB nanuux M T . n, Haw MHTep<peHc ISimpleConfigurator He conepxnr noxa HM onnoro MeTOlla . Ilasanre 1l06aBMM B Hero C11ellYIOIllMe Meronu: MeTOll YCTaHOBKM OKHa pMCOBaHMSl, MelOll YCTaHOBKM UBeTa rpamnru M UBeTa 3an011HeHMSl, MeTO.n. YCTaHOBKM paauepa 06"beKTa.
(nasa 4. nUweM COM~cepsep
23
MeTOL( YCTaHOBKM OKHa pMcoBaHMSI: function SetWindow(
Handle: Integer):
HResulti stdcalli
3.LleCb Handle - L(eCKpMTTTOP OKHa PMCOBaHMSI. YCTaHOBKa UBeTOB:
function SetColors(
BorderColor, FillColor: Integer):
HResulti stdcalli
3L(eCb:
CJ BorderColor - UBeT rpaaausr; CJ FillColor - UBeT 3aJIMBKM. YCTaHOBKa pasuepa o60eKTa: function SetCbjectSize(
ObjectSize: Integer):
HResulti stdcall;
311eCb ObjectSize - HOBhIM passrep o60eKTa.
nOCJIe 3TOrO llo6aBMM B CTTMCOK BTOPOM MHTep<i>eMc - ISimpleDrawing M YCTaHOBl1M B xaxecrse ero pOllMTeJIbCKOrO MHTep<i>eMca mrrepdieac IUnknown. IlepetilleM na BKJIallKY FJags namtoro l1HTep<i>eMca l1 CHMMeM dmaxox C napasrerpa Dual. ,llOJI)I(eH OCTaTbCSI TOJIbKO O.LlMH <i>JIa>KOK - Ole Automation. BbI6epeM B nepese 06"beKT.oB 6l16JlMOTeKM Tl1TTOB 060eKT simpleObj ect, nepetinev na ero BKJIallKY Implements M L(06aBMM B CTTl1COK C03L(aHHbIM l1HTep<i>eMc ISimpleDrawing.
B l1HTep<i>eMce ISimpleDrawing MhI o60SlBl1M scero OL(MH MeTOL( - pMCOBaHMe uexoroporo o6"beKTa:
fUnction DrawSimpleObject(
x,
Y: Integer):
HResulti stdcalli
311eCb X, Y - KOOpL(MHaTbI 06"beKTa.
PMCOBaTb B xauecrse o60eKTa MO)l(HO BCe '-ITO yronno - MhI )l(e 6YL(eM pMCOBaTb aaxpauremrsrt; xeanpar.
24
'lsct» I. 061.1..1111e
BHeCH see 3TH H3MeHeHHH, He06xonHMO HIDI<aTb KHonKY 06HOBJIeHHH Ha n 6H6JTHOreKH THnOB, nOCJTe xerc see H3MeHeHHH, cnenamrue B 3TOM penaxrope, nOHBHTCH H B penaxrope Delphi.
EcJlH Sbl cnenana see npasansno, TO Y eac llOJI)KHO nOJT}"-IHTbCH TO )f(e cauoe, 'ITO npeacrasneuo Ha pHC. 4.3 .
... SetColors
.. SelObjectSize I ,. SirnpieObjecl
6 ~ ISirnpleDrawing
L. ... DrawSimpleObject
PMC. 4.3. PeAaKTop 6Lo16m1oTeKLo1 TLo1nOB
Teneps OCTaeTCH TOllbKO namrcars peaJIH3aUHlO nepesacneanux nuure 4-x TOllOS. HaH6011bwHH HHTepeC nnH Hac npencrasnaer co6CTseHHO ellHHCTBeH MeTOn pHCOBaHHH ISimpleDrawing.DrawSimpleObject. nJIH pHCOBaHHH B )f(OM OKHe Mbl 6YlleM HCnOJlb30SaTb SHYTPH COM-cepBe·pa 06"heKT runa TCanvas EblJTO 6b[ xpaane nexenarensao C0311asaTb H YllaJIHTb 3TOT 06"beKT Ka)[(Ub[H paa npouenype pHCOBaHHH, H n03TOMY MbI nepeonpenenav MeTOnhl H H YllaJIemfH COM-06"beKTa: Initialize H Finalize. B MeTOn HHHUHaJI
MbI no6aBHM C0311aHHe 06"beKTa rnna TCanvas H npOHHHUHaJIH3HpyeM nsre 3Ha'leHHH pasaepa 06"beKTa H useros rpannuu H 3aJIHBKH. Meron Y COM-06"heKTa 6yneT conepxars KOn YllaJIeHHH o6"beKTa TCanvas. TeKCT NIV.UVJU> npaseneu B llHCTHHre 4.2.
fnasa 4. nUW6M COM-cepsep
25
unit UnitMain;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
Windows, Messages, SysUtils, Graphics, ActiveX, Classes, CornObj, COM_Server_TLB, StdVcl;
type
TSimpleObject = class(TTypedCornObject, ISirnpleConfigurator, ISirnpleDrawing)
private
FCanvas: TCanvas;
FHandle: THandle; FObjectSize: integer; FBorderColor, FFillColor: integer;
protected
function SetObjectSize(ObjectSize: Integer): HResult; stdcall; function SetColors(BorderColor, FillColor: Integer): HResult; stdcal1;
function SetWindow(Handle: Integer): HResult; stdcall;
function DrawSirnpleobject(X, Y: Integer): HResult; stdcall; public
procedure Initialize; override; destructor Destroy; override; end;
implementation
2 3aK. 339
26
l{acTb I. 06114ue CSe,QeHUR
uses CornServ;
function TSimpleObject.SetObjectSize(ObjectSize: Integer): HResult; begin
FObjectSize := ObjectSize;
Result := S_OK; end;
function TSimpleObject.SetColors(BorderColor, FillColor: Integer):
HResult;
begin
FBorderColor := BorderColor; FFillColor := FillColor;
Result := S_OK; end;
function TSimpleObject.SetWindow(Handle: Integer): HResult; begin
FHandle := Handle;
Result : = S _OK; end;
function TSimpleObject.DrawSimpleObject(X, y:' Integer): HResult;
var
DC: HOC; begin
Result := E_FAIL;
if FHandle = 0 then EXIT;
DC := GetDC(FHandle); try
FCanvas.Handle .- DC; FCanvas.Pen.Color .- FBorderColor;
(nasa 4: nUWeM COM-cepBep
27
FCanvas.Brush.Color := FFillColor;
FCanvas.Rectangle(X, Y, X + FObjectSize, Y + FObjectSize); finally
FCanvas . Handle : = 0; ReleaseDC(FHandle, DC); end;
Result := S_OK; end;
destructor TSimpleObject.Destroy; begin
if Assigned(FCanvas) then begin FreeAndNil(FCanvas); end;
inherited; end;
procedure TSimpleObject.lnitialize; begin
inherited;
Fcanvas := TCanvas.Create;
FObjectSize := 5; FBordercolor := clBlack;
FFillColor end;
:= clWhitei
initialization
TTypedComObjectFactory.Create(CornServer, TSimpleObject, Class_SimpleObject, ciMultilnstance, tmApartment);
end.
28
'-IacTb I. 06U4ue CSe,qeHUR
PerMCTpa4MR COM-CepBepa
nOCJIe KOMnMJISlUlH1 Mbl nOJIY'lMM 6H6JIHOTeKY COM_Selver.dll. 3TO H ecrs Haw COM-cepBep. llrrSl ern HCnOJIb30BaHHSI HaM ocraercs TOJIhKO ern saperucrpaposars. 3TO MO)((HO nponenars OJlHHM M3 cnenyrourax cnocoooe:
o BbInOJIHHB KOMaHJlY MeHIO Run I Register ActiveX Server;
o 3anYCTHB H3 KOMaHJlHOM CTpOKH CneUMaJIbHYIO nporpaavy regsvr32.exe H nepenas eM B xaxecrse nepsoro napasrerpa nyrs K CO M -cepsepy;
D B KOMnneKTe C Delphi HJleT CneUHaJIbHaSl YTHJIHTa nna peracrpauan COMcepsepos non Ha3BaHHeM TRegSvr.exe - MO)((HO BOCnOJTb30BaTbCSI ee B03- MO)f(HOCTSlMM JlJlSl perucrpauan naurero cepsepa,
Ecrecrseaao, 31'0 HenOJIHbIM cnHCOK B03MO)f(HbIX nYTeM peracrpauan cepnepa. MO)((Ho, K npnsrepy, iranacars CBOM HHCTaJIJTSlTOP, KOroPblM 6YJleT aBTOMaTM'-IeCKH ern peracrpnpoears, HO HaM 3TO He H~HO.
B KaTaJIOre Examples\COM\SeLVer\ na npnnaraevow K KHMre KOMnaKT-JlMCKe HaXOJlHTCSI onHcaHHblM suure npnsrep COM-cepBepa. Taxxe B 3TOM KaTaJIOre pacnonaraerca H «paMJT REG.CMD - 3TOT KOMalUI,HbIM «paMJT npOH3BOJlHT perucrpaumo COM-cepBepa. BcSI pemCTpaUHSI OCYllleCTBJUleTCSI OJlHOM CTpOKOM: regsvr32 COM_Server.dll
Ilocne perucrpauan COM-cepBepa HH«popMaUHSI 0 HeM 3aHOCHTCSI B peecrp Windows. MbI MO)((eM npocvorpers 3TY MH«p0pMauHIO M3 penaxropa peecrpa Windows (pHC. 4.4).
Hy, H COOTBeTCTBeHHO nOCJTe peracrpauna cepeepa Mbl MO)((eM co CnOI\OMHOM COBeCTbIO npHCTYOaTb K HanHcaHHIO KJIHeHTCKOM '-IacTH.
Pille. 4.4. 3aperl.1CTpl.1pOBaHHbiCi B peecrpe COM-cepBep
(nasa 4. nUWeM COM-cepeep
29
f{nMeHTcKafi "IaCTb
C0311aIUIM 06bI'lHoe npnnoxeaae 11 nOllKJIIOqMM K HeMY Monynb 6M6nMOTeKM Tl1nOB COM_Server_TLB.pas 113 npoexra COM-cepBepa. Teneps MbI MO)l(eM l1Cnomooaars B03MO)l(HOCH1 COM-cepBepa B CBoeM npl1nO)l(eHMM.
,llJISl 60nblllet1' narnnnnocra Sl peumn npnsecra nsa npmrepa c0311aHMSl COMofibeKTOB. B nepsoxr cnysae Mbl 6YlleM BbI3bIBaTb MeTOll CreateComObject M3 MonynSl ComObj.pas, aBO BTOPOM - ¢YHKUMIO API CoCreateInstance. KaK 6bl TO HM 6bInO, nepBhIH MeTOll ropaano npouie - y Hero scero OllMH napaverp, HO see paBHO OH HeSlBHO MCnOnb3YeT BbI30B API:
function CreateComObject(const ClassID: TGUID): IUnknown; begin
OleCheck(CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or CLSCTX_ LOCAL_SERVER, IUnknown, Result»;
end;
Meron CoCreateInsta.nce coaaaer sxseunnap 06'beKTa aanamroro xnacca: function CoCreateInstance(
const clsid: TCLSID;
unkOuter: IUnknawn;
dwClsContext: Longint;
const iid: TIID;
out pv):
HResult; stdcall;
311ecb:
o clsid - l1,lleHTM¢MKaTOp xnacca c0311aBaeMorO 06'heKTa (CLSID);
o unkOuter - YKa3bIBaeT, MCnOnb3yeTCSl nl1 06'beKT B arperauna. Hynesoe (NIL) 3Haqei-me rOBOpl1T 0 TOM, qTO 06'beKT He SlBnSleTCSl qaCTbIO arperara;
o dwClsContext - KOHTeKCT, B KOTOPOM 06'beKT nonxeu 6blTb C03,llaH. Mu 6YlleM MCnOnb30BaTb snaxenae CLSCTX _ INPROC, KOTOpOe, B CBOIO oxepeas, SlBnSleTCSl KOM6MHaUMeH llBYX cnenyiourax 3HaqeHMH:
• CLSCTX _ INPROC _SERVER - BHYTPeHHMH CepBep;
• CLSCTX _ INPROC _ HANDLER - KOll cepsepa 6Y,lleT 3arp~eH B anpeCHOe npo-
CTpaHCTBO npanoxeana (cypporarnsni cepsep);
o iid - l'I,lleHTM¢l'IKaTOp H}')KHOro MHTep¢eHca;
o pv - nepevennas, B KOTOpylO 6YlleT sanncaa yxaaarens Ha ~brn MHTep¢eHc. Jlpn C03.uaHMM OCHOBHOH ¢OPMhI npl1nO)l(eHMSl MbI coaaaev naa 3K3eMnnSlpa naurero COM-06'beKTa Pa3HbIMM CnOC06aMl1 M HaCTpaMBaeM paanaxnsre napa-
30
l{acTb I. 061.1.1£.18 cS8,qeHlAR
MeTpbl.ll;rn rtepsoro sxaeunxspa COM-060eKTa MbI ronsxo Ha3Ha'lHM OKHO llJlSI pHCOBaHH$l, a OCTMbHbIe napauerpsr OCTaBHM 6e3 H3MeHeHH$l, a nns npyroro axaexmnapa YCTIlHaBnImaeM see napaverpsr. 3aTeM aanpaumeaeu y 3K3eMnn$lpa KaJK.[(OrO COM-06oeKTa sropon HHTep<petic - HHTep¢etic pHCOBaHH$l. PMCOBaTb MbI 6YJIeM B o6pa6oT'lMKe C06bITH$l OnMouseMove y Q>0PMbI: npn HIDKaTMM nesoa KHonKH MbIlllM 6YJIeT BbI3blBaTbC$l MeTO.n pHCOBaHM$l nepsoro COM-06DeKTIl, a npa HIDKaTMM npasoa KHonKM MblWM - BTOpOfO.
nOCMOTpMTe na npmrep, pacnonoxeuauti B KaTMOre Examples\COM\Client Ha KOMnaKT-JIMCKe. 3TOT rtpmrep npeJICTaBJmeT co6oti KnMeHTCK}'IO xacrs, ncnons- 3YJOIllYlO B03MO>KHOCTM onacannoro ssnue COM-cepBepa. B nMCTMHre 4.3 npnBOJIMTCSi TeKCT npnjaepa,
unit FormMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ActiveX, ComObj, COM_Server_TLB, StdCtrls;
type
TMainFor.m ~ class (TFor.m)
procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
private
FSimpleObjectl: ISirnpleConfigurator; FSimpleDrawingl: ISirnpleDrawing;
FSimpleObject2: ISimpleConfigurator; FSimpleDrawing2: ISimpleDrawing; public
end;
var
MainFor.m: TMainForm;
(nasa 4. nUweM COM-cepsep
31
implementation
{$R *.dfm}
procedure TMainForm. FormCreate (Sender: TObject); var
hr: HResult; begin
FSimpleObjectl := CreateCornObject(CLASS_SirnpleObject) as ISirnpleConfigurator;
if FSirnpleObjectl <> NIL then
begin
FSirnpleObjectl.SetWindow(Handle); FSirnpleObjectl.QueryInterface(IID_ISirnpleDrawing, FSirnpleDrawingl); end;
hr := CoCreateInstance(CLASS_SirnpleObject, NIL, CLSCTX_INPROC, IID_ISirnpleConfigurator, FSirnpleObject2);
if (SUCCEEDED(hr» then
begin
FSirnpleObject2.SetWindow(Handle)i
FSirnpleObject2.SetObjectSize(lO)i
FSirnpleObject2.SetColors(clRed, clYellow)i FSirnpleObject2.Querylnterface(IID_ISirnpleDrawing, FSirnpleDrawing2);
end; end;
procedure TMainForm.ForrnDestroy(Sender: TObject); begin
if FSirnpleDrawing2 <> NIL then FSirnpleDrawing2 := NIL; if FSirnpleObject2 <> NIL then FSirnpleObject2 := NIL; if FSirnpleDrawingl <> NIL then FSirnpleDrawingl := NIL; if FSirnpleObjectl <> NIL then FSirnpleObjectl := NIL;
end;
procedure TMainForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
32
l{aCTb I.
begin
if ssLeft in Shift then begin
if FSimpleDrawingl <> NIL then begin
FSimpleDrawingl.DrawSimpleObject(X, Y);
end;
end else if ssRight in Shift then begin
if FSimpleDrawing2 <> NIL then begin
FSirnpleDrawing2. DrawSimpleObject (X, Y);
end; end; end;
end.
Iloaxcnepnuenrapoeaa C npavepo«, Mhl MO)l{eM nony-nrn, cnerryroutati pe3YJ1hTaT (pnc. 4.5).
PHC. 4.5. l'1cnOllb30BaHL-1e COM-cepBepa
VlTorM
6 ::lTO~ BBOAHOIii 4aCT14 MbI C BaM14 nepe414CTlWl14 ace KOMnOHeHTbI. BxoAflut14e B COeTas DirectX, onpeAeTl14T114, B 4eM >Ke OTTl14414e DirectX OT OpenGL. xparxo on14CaJl14 cpeAY paapa60TK14 14 HaY4W114Cb paoorare C 6146T1140TeKO~ COM Ha np14Mepe. OH flSJ1fleTCfI T114Wb npocTelilw14M np14MepOM pa60TbI C 6146T1140TeKO~ COM 14 He noxa- 3blsaeT acex BOaMO>KHOCTe~ STOIii TeXHOTlOr1414, HO B TIIo60M CTIY4ae 6YAeT nonesea reM. KTO He 14MeTl onsrra pa60TbI C AaHHO~ 6146T1140TeKO~.
· ,.
4ACTb II
DIRECTX GRAPHICS
, "
DirectX Graphics - MOLltHru! rpa¢1II4ecKffiI nOACIIICTeMa, BXOAflLltru! B DirectX III COCTOS!Lltru! 1113 ABYX 4aCTe~: KOMnOHeHTOB Direct3D III nepBbl~ KOMnOHeHT npeACTaBIlS!eT c060~' M0LltHYIO nOACIIICTeMY AIlSl pa60TbI TpeXMepHO~ III ABYMepHO~ rpa¢IIIKO~, a BTOpO~ KOMnOHeHT npeAHa3Ha'-leH AIlS! pa60Tbi C ABYMepHo~ rpa¢IIIKo~. Hecuorpa Ha TO, '-ITO B HaCTOS!Lltee nOACIIICTeMa DirectDraw ucnonsayerca 04eHb M81l0, nOA,lJ,ep>KKa ee IIIHTer)cbe~ltoE OCT8HeTCS! B DirectX III B A81lbHe~weM.
~3Y4aTb nOACIIICTeMY DirectX Graphics 6YAeM B ABa ST8na. Ha nepaou erane paccMoTpIllM pa60TY C nOAcIIICTeMO~ Direct3D III HaY4I11McSI paeorars C rpa¢IIIKO~, Ha4I11Hru! C a30B III 3aKaH~IIIBafi pa31l1114HblMIII TpexMepHblMIII sct:)¢leKlra BTOpO~ STan 6YAeT nOCBS!LlteH KpaTKOMY o6aopy nOACIIICTeMbl DirectDraw. pa36epeM OCHOBbi pa60TbI C nOBepXHOCTSlMIII, pa60TY C n81llllTpo~ III pa31l1114Hble 4BeTOBbie s¢¢eKTbI, a B KOH4e 1113Y4I11M pa60TY C oseplleSlMIII DirectX.
B OTlllll4111e OT nOClleAYIOLltIllX 4aCTe~ KHlllrIII, 06Y4eHllle patiore C rpa¢IIIKO~ npOIll3BOAIIITbCS! B BIIIAe nocneaoearensaocra nplllMepOB.
rnaea 5
Oirect3D
Ha'-IHeM 3HaKOMCTBO C rpa<pMKOH C M3yqeHMH nOLICMCTeMhI Direct3D. Bee rrpnMephl, xoropue 6y,lIYT HaMM paCCMOTpeHhI, pacnOJ1araIOTCH Ha npanaraevou K KHl1re KOMnaKT-,lIMCKe B xaranore Examples\DirectX Graphics\Direct3D\ Example_xx, rne xx - rropsnxossra HOMep npMMepa. Ilepaue nOCTpoeHMH 6YLIYT caenaau na nJIOCKOCTM - Mhl Ha'lHeM M3yqeHl1e C MHMUHaJIH3aUJHf nOLICMCTeMhl 11 BhlBOLIa na 3KpaH TO'lKM. ,Uo6epeMcH ,lIO pacosaaaa npasroyronsuuxa aa nJIOCKOCTM, a sarexr M B npOCTpaHCTBe, M nepetl)leM K M3yqeHMIO npocrpaucrsemrsrx nOCTpOeHMH. PaccMOTpMM paanaxnsre MaTpM'IHhIe rtpeotipasosamcr, pa60Ty C TeKCTOM na nJlOCKOCTM M B npOCTpaHCTBe, M3Y'HfM pa60TY C Marepl1aJIOM M MCTO'lHMKaMM CBeTa M T. LI.
Ilon MHHl.{MaJIM3al.{MeH LIaHHoH nOLICMCTeMbl HY)l(HO nOHMMaTh C03)laHMe rnaanoro o&beKTa C MHTep<peHcoM IDirect3D9 M C03lIaHMe OUbeKTa YCTpoHCTBa IDirect3DDevice9. PaccMOTpHM 3TO nonpotiuee.
nepBhIM ,lIeJlOM HaM Heo6xonMMO C03naTb OUbeKT C MHTep<peHCOM IDirect3D9. 3TO LIeJlaeTCH rrpn nOMOlUM BhI30Ba MeTOna Direct3DCreate9:
function Direct3DCreate9(
SDKVersion: LongWord):
IDirect3D9i
3LIeCh SDKVersion - KOHCTaHTa, Heo6xo,llMMasr JJ,JIH npoaepxn roro, 'ITO nporpaMMa 6hIJ1a CKOMnl1J1MpoBaHa C H~HhIMM aepcMHMM saronosovnux <paHJlOB 11 6M6J1MOTeK. ,UOJl)l(HO MCnOJlb30BaThCH anaxenne D3D _SDK_VERSION.
3.ueCb:
[j Adapter -- nopnnxouurt HOMep anarrrepa, OCHOBHOi1 anarrrep scerna J1MeeT HOMep D3DADAPTER_DEFAULT;
[j DeviceType -- TJ1n ycrpoticraa. MO)l(eT npJ1HJ1MaTb 3Hat{eHJ1i1:
• D3DDEVTYPE_HAL -- annapaTHaSl paCTepJ13auJ1Sl;
• D3DDEVTYPE_REF -- npOrpaMMHa51. paCTepJ13aUJ1S1;
• D3DDEVTYPE_SW -- CMeHHoe nporpasesnoe YCTpOi1CTBO, 3aperJ1CTpJ1pOBaHHOe npa novoum xerona IDirect3D9. RegisterSoftwareDevice;
[j hFocusWindow -- necxpnrrrop OKHa, xoropoe 6y.ueT J1CnOJIb30BaHO no.uCJ1CTeMOi1 Direct3D .llJI5I. ausona J1306pa)l(eHJ1S1. J1,.ruI nOJIH03KpaHHoro pe)l(J1Ma 1100)I(HO YKa3bIBaTbCSI OKHO sepxuero YPOBHSI;
[j BehaviorFlags -- KOM6HHaUJ1S1 ozmoro J1JIJ1 HeCKOJIbKJ1X q)JIaroB:
• D3DCREATE_ADAPTERGROUP_DEVICE -- TeKYIUJ1i1 a,nanTep CTaHOBIITCSI HOBHbIM (no OTHOlUeHJ11O K OCTaJIbHbIM);
• D3DCREATE_DISABLE_DRIVER_MANAGEMENT -- noncacresra Direct3D 6y.ueT casra ynpaansrs pecypcasm BMeCTO npatlaepa;
• D3DCREATE_FPU_PRESERVE -- .uBOi1HaSI TOt{HOCTb npn onepauasx C nnaBaIOIUei1 TOt{KOi1. KaK CJIe.uCTBJ1e, CHJ1)1(aeTCSI np0J13B011J1reJIbHOCTb;
• D3DCREATE HARDWARE VERTEXPROCESSING -- annapaTHaSl 06pa6OTKa BepIllJ1H;
• D3DCREATE MIXED VERTEXPROCESSING -- CMeIllaHHaSI (nporpaseauaa W armaparnas) 06pa6oTKa BepIllJ1H;
• D3DCREATE_MULTITHREADED -- YKa3bIBaeT na TO, 'lTO npIDIO)l(eHJ1e Direct3D .uOJl)l(HO 6bITb MHoronOTOt{HbIM. C03.uaeTCSI rJI06aJIbHaH KpJ1TJ1lIeCKaSI cexUJ1S1. xoropas CHJ1)1(aeT np0J13BO.uJ1reJIbHOCTb;
38
C03.uaB rJIaBHbli1 06'beKT, nepexonnsr K C03.uaHJ11O 06'beKTa YCTpOi1CTBa, KOTOPblij C03.uaeTCSI npa nOMOIUJ1 MeTo.ua IDirect3D9. CreateDevice: function CreateDevice(
Adapter: LongWord; DeviceType: TD3DDevType; hFocusWindow: HWND; BehaviorFlags: DWord;
pPresentationParameters: PD3DPresentParameters; out ppReturnedDeviceInterface: IDirect3DDevice9):
HResult; stdcall;
(nasa 5. Direct3D
39
• 030CREATE_PUREOEVlCE - He nonnepxaears Get-Bbl30Bbl M OTKJUOlJMTb nOJJ.llep>KKY cepBMCOB 3MYJUlUMM npa o6pa6oTKe BepWMH;
• 030CREATE SOFTWARE VERTEXPROCESSlNG
_ _
nporpasomas o6pa6oTKa
BepWMH.
• <I>JIam 03 OCREATE_HAROWARE_VERTEXPROCESS lNG, 030CREATE_MlXEO_ VERTEXPROCESSlNG M 030CREATE SOFTWARE VERTEXPROCESSlNG ~BrrHWTC~
_ _
B3aMMOMCKJIWlfaWll.{MMM;
[j pPresentationParameters - }'Ka3areJIb Ha CTpYKTYPY T030PresentParameters, onncsrsaioutyro napauerpu YCrpOHCTBa;
[j ppReturnedOevicelnterface - aapec YKa3areJI~, B KOTOPbIH 6Y.ller sanecea
MHTep¢eHC lOirect300evice9 coanannoro 06oeKTa.
CrpYKTYPa T030PresentParameters, onncsraaroutas napasrerpu cosnasaevoro ycrpoticrsa, MMeeT cnenytourae nOJI~:
[j BackBufferWidth - WMpMHa sannero 6y¢epa; [j BackBufferHeight - BblCOTa sanaero 6y¢epa;
[j BackBufferFormat - ¢OPMaT aannero 6y¢epa Moxer "CnOJIb30BaTbC~ TeKylllMH ¢opMar, nOJlyYeHHbrH: C nOMoIUbw MerO,lla IDirect3ooevice9. GetOisplayMode;
[j BackBufferCount - lfMCJlO 33.llHMX 6y¢epoB (0, 1, 2 MJlM 3, npMlfeM 3HalJeHMe o B ,llaHHOM CJIyYae 3KBMBaneHTHO 1). Ilpn HeB03MO)((HOCTM coanars YKa3aHHoe lfMCJIO 6y¢epoB B .llaHHbIH naparaerp 6Y.ller 3aHeCeHO peansnoe lfMCJIO C03LlaHHblX 6y¢epoB;
[j MultiSampleType - TMn MYJIbTMC3MnJIMHra (nOJIH03KpaHHoro CrJIa)((MBaHim). J],aHHbIH napauerp ucnonssyerca TOJIbKO npn YCTaHOBJIeHHOM pe)((MMe 06MeHa 030SWAPEFFECT_OlSCARO;
[j MultiSampleQuality - xasecrso nOJlH03KpaHHoro CrJIa)((MBaHM~; [j SwapEffect - 3¢¢eKT 06MeHa 6y¢epoB;
[j hOeviceWindow - necxpnrrrop OKHa nsrsona (nns nOJIH03KpaHHbIX npMJIO)((eHMH);
[j Windowed - ¢Jlar, onpenenmouian pe)((MM pa60TbI (OKOHHblH MJIM nOJIH03K-
paHHbIH);
[j EnableAutoOepthStencil - ynpaanenae 6y¢epoM my6MHbI; [j AutoOepthStencilFormat - ¢opMaT 6y¢epa rJIy6MHbI;
[j Flags - ¢JIar, sanaroumn B03MO)((HOCTb 6J10KMpOBaHM~ sanaero 6y¢epa;
[j FullScreen_RefreshRatelnHz - lJaCTOTa 06HOBJIeHM~ B nOJIH03KpaHHOM pe)((MMe;
[j Presentationlnterval - CMHXpOHM3aUM~ lJaCTOTbl anarrrepa C lfaCTOTOH ausona na 3KpaH sannero 6y¢epa.
40
'-IaCTb II. DirectX Graphics
Bee 3T&1 JleHcTBJUI 6YJlYT BblnOJIHSlTbCSI B npouenype Ini tD3D HaUJ&1X npavepoa (JI&1CT&1Hr 5.1).
{** ~arrwsaUXR nO~C~CTe~ Direct3D
**}
{******************************************************************}
{******************************************************************}
function TMainForm.InitD3D: HResult;
var
d3dDisplayInfo: TD3DDisplayMode; d3dParams: TD3DPresentParameters; begin
II PesynbTaT no YMon~aHMD Result := E_FAIL;
II Cos~aeM O~KT C HHTep~eUCOM IDirect3D9 FD3D := Direct3DCreate9(D3D_SDK_VERSION);
II 3aBepmaeM pa60TY npo~e~ np~ o~6Ke if FD3D = NIL then EXIT;
I I ITOJzyL!aeM yCTaHOB~ TeKYJI{erO peJB:l1Ma anarreepa
Result := FD3D.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, d3dDisplayInfo);
II 3aBepmaeM pa60Ty B CJIYL!ae C60R if ~ILED(Result) then EXIT;
II 3a~aeM napaMeTPhl YCTpoucTBa:
ZeroMemory(@d3dParams, SizeOf(d3dParams»; II ~cnonbsoBaTb OKOHHhlM ~ d3dParams.Windowed := TRUE;
I I peJlCl.1M nepeKJ1IO',!e~R MeJl()zy 6wep~ d3dParams.SwapEffect := D3DSWAPEFFECT_DISCARD;
II ~OPMaT 6y~epa He onpe~eneH d3dParams.BackBufferFormat := d3dDisplayInfo.Format;
(nasa 5. Direct3D
41
II C03~aeM 06beKT YCTpoucTBa
Result := FD3D.CreateDevice(D3DADAPTER_DE~ULT, D3DDEVTYPE HAL, Handle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, @d3dParams, FD3DDevice) i
end;
O"lIilCTKa YCTpOMCTBa
Ol{I1CTKa ycrpoacrsa np0I13BO,llHTC$I MeTOnOM IDirect3DDevice9. Clear. ,llaHHbIti MeTOn n03BOJUIeT Ol{I1IUaTb see npocrpancrso BbIBOna Jm60 Ha60p np$lMOyronsmrx ofinacreti 11 3aJII1BaTb ¢OH YKa3aHHhIM UBeTOM. TaK)I(e MeTOn Ol{I1IUaeT 6y¢ep rJIy611HhI 11 6y¢ep Wa6JIOHa:
function Clear(
Count: DWord; pRects: PD3DRect; Flags: DWordi Color: TD3DColor; Z: Single; Stencil: DWord):
HResult; stdcall;
3neCh:
[j Count - l{I1CJIO npsnroyronsustx 06JIaCTeti B MaCCI1Be pRects. £eJII1 pRects I1MeeT HYJIeBOe 3HaQeHl1e, TO 11 naHHhIti napasrerp nOJI)I(eH 6bITh HYJIeBbIM;
[j pRects - MaCCI1B np$lMoyroJIbHbIX 06JIaCTeti, xoropsre nOJI)I(HbI 6bITb Ol{I1IUeHbI. ):(onYCTI1MO I1CnOJIb30BaTb HYJIeBOe 3HaQeHI1e nJl$l Ol{I1CTKI1 Bceti o6JIaCTI1 uenaxo»;
[j Flags - napasrerp yxasuaaer, KaKMe nOBepXHOCTI1 nOJI)l(HbI 6bITb Ol{l1weHbl:
• D3DCLEAR _ STENCIL - Ol{I1IUaeT 6y¢ep Wa6JIOHa 11 3auaeT eMY 3Ha'leHMe, YKa3aHHOe B napaxrerpe Stencil;
• D3DCLEAR_TARGET - YCTaHaBJIl1BaeT UBeT Ol{l1IuaeMoti 06naCTI1 B 3Hal{eHl1e, YKa3aHHOe B napaverpe Color;
• D3DCLEAR_ZBUFFER'__ oxautaer 6y¢ep rny611HbI no 3Hal{eHI1$1, yxaaanaoro B napaxrerpe z;
LJ Color - UBeT 06naCTI1 B ¢OpMaTe ARGB;
[j Z - sua-renae, KOTOpOe 6yneT I1CnOJIb30BaTbC$I rrpn O'lI1CTKe 6y¢epa rny611- Hbi. MO)l(eT npl1HI1MaTb anaxenae OT 0.0 no l. 0;
42
'-IaCTb II. DirectX Graphics
Cl Stencil - HOBOe 3HaqeHlfe 6y¢epa rua6JIOHa. MO}KeT npHHHMaTb snaxeaae OT 0 J],O 2n - 1, rne n $IBJI$leTCH pa3pH)lHOCTblO 6y¢epa rua6JIOHa.
B npnaepax O'lHCTKa 6y¢epa 6yJ],eT npOH3BOJ],HTbC$I B MeTOJ],e ClearDevice (JIHCTHHf 5.2).
{*****************************************************~************}
{** OtrnmaeM YCTpoMCTBO
{******************************************************************}
function TMainForm.ClearDevice: HResult; begin
I I l?esYJJbTaT no YMOJ1'laHVIlO Result := E_FAIL;
II ECJJM YCTpOMCTBO He cos~aHO, TO saBepWaeM pa60TY if FD3DDevice = NIL then EXIT;
II ~CTMM YCTpOMCTBO
Result := FD3DDevice.Clear(0, NIL, D3DCLEAR_TARGET, D3DCOLOR_XRGB($FF, 0, $FF), 1, 0);
end;
npOpMCOBKa cu.eHbl
**}
**}
npOpHCOBKa 6YJ],eT ocymeCTBMTbC$I B MeTOJ],e RenderScene (JIHCTHHf 5.3). IlepBbIM J],eJIOM MbI O'lHIllaeM YCTpOHCTBO, a 3aTeM nepexmosaesr 6y¢epbl.
, ..? ... - ,~.,',~, ~"'v ""L,,::,'i!4*Jx;t<':'tl">h>; ~",,:,'!il>'I-~'y~j:-o/.'"1;y~"~';:~
;f}: ,J;, ~ r~Y , /;.;~\~'<J:<~-i",:.,;, .:P,.;""--:'~, ,-.1;" "v v ~~'>:'~ ~:'''''''''/iI!:*:~
{*********************************************************************}
{** npoP~COBKa c~e~
{*********************************************************************}
function TMainForm.RenderScene: HResult; begin
II q~CTHM YCTpoMCTBO Result := ClearDevice;
(nasa 5. Direct3D
43
II EcnM npoH30mna oWH5Ka, TO 3aBeprnaeM pa60TY if FAILED(Result) then EXIT;
II nepe~eHHe 5y~epoB FD3DDevice.Present(NIL, NIL, 0, NIL); end;
3TOT MeTQll B naJIbHeHllleM 6yneT YCJlo)KHeH no Mepe H3y'reHHfI HOBOro MarepHaJla.
nepBblM npMMep
Bee, 'ITO 6bmo CKaJaHO Bbl ure , OTHOCHTCfI K CJlenYIOIUCMY npnsrepy. 3ro npoCTeHlllMH npMMep, pacnonaraioumacs B karanore ExarnplcDl , B KOTOpOM npoM3BO.nMTCH MHMUMaJlM3aUMfi noncacrevu Direct3D H OKHO nsmona 3aKpaWHBaeTCH llBeTOM. Ha pMC. 5.1 MbI MO)l(eM ysanen, PC3YJlbTaT pa60TbJ naanoro npauepa,
PMC. 5.1. nepBblCi nplAMep pafiorst C Direct3D
B JIMCTMHre 5.4 TeKCT OCHOBHOro MOnYJlH npusenen nOJTHOCTbIO co BCCMl1 KOMMeHTapMHMM. B nMbHeHllleM H He BM)I(Y neooxonmrocra B npellCHlBJTCHHM nOJIHbIX JIMCTMHroB scex npasrepoa - nOCTaTO'lHO 6y.neT npHBOnMTb TOJlbKO re MeCTa xona, KOTOpbIe nperepnesasor KaKMe-JIM6o M3MCHeHM$I.
44
UNIT FormMain;
{******************************************************************}
{** Direct3D: Example_Ol
{** ABTOp: EceHMH CepreM AHaTorrbe~
{********-*********************************************************}
{**} INTERFACE {***************************************************}
{**} USES {********************************************************l
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Direct3D9, ExtCtrls, AppEvnts;
{**} TYPE {********************************************************}
TMainForm = class (TForm) applicationEventsMain: TApplicationEvents; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject);
procedure applicationEventsMainIdle(Sender: TObject;
var Done: Boolean);
procedure applicationEventsMainMinimize{Sender: TObject); procedure applicationEventsMainRestore(Sender: TObject); procedure FormActivate(Sender: TObject);
PRIVATE
FD3D: IDirect3D9;
FD3DDevice: IDirect3DDevice9;
FIsActive: boolean;
function InitD3D: HResult; proceclure FreeD3D;
function ClearDevice: HResult;
**} **}
(l7asa 5. Direct3D
45
function RenderScene: HResult; PUBLIC
END;
{**} VAR {*********************************************************} MainForm: TMainForm;
{**} IMPLEMENTATION {**********************************************}
{$R * .dfm}
{**} { TMainForm } {***********************************************}
{******************************************************************}
(** V1IDIUI1aJI1113aUl1R: nOJlCl!rCTeMbl Direct3D
**)
{******************************************************************}
function TMainForm.InitD3D: HResult; var
d3dDisplayInfo: TD3DDisplayMode; d3dParams: TD3DPresentParameters; begin
II Pe3ynbTaT no YMOn~aHJ![D Result := E_FAIL;
II C03JlaeM OO~KT C l!rHTe~eHcoM IDirect3D9 FD3D := Direct3DCreate9{D3D_SDK_VERSION);
II 3aBeprnaeM paooTy npoueJlYPhl npl!r OllJ![OKe if FD3D = NIL then EXIT;
II nO~aeM YCTaHOBKW Te~ero pe~a aJlanTepa
Result := FD3D.GetAdapterDisplayMode{D3DADAPTER_DEFAULT, d3dDisplayInfo);
II 3aBepwaeM pa5cTy B c~ae COOR: if FAILED(Result) then EXIT;
46
II 3a~aeM napaMe~ YCTp~CTBa:
ZerOMemory(@d3dParams, SizeOf(d3dParams)); II ~CnOnb30BaTb OKOHHhlM p~ d3dParams.Windowed := TRUE;
II pe~ nepeKrnO~eH~H Me~ 5y~ep~ d3dParams.SwapEffect := D3DSWAPEFFECT_DISCARD;
II ~OPMaT 5y~epa He onpeneneH d3dParams.BackBufferFormat := d3dDisplayInfo.Format;
II C03~aeM o6~eKT YCTpoMcTBa
Result := FD3D.CreateDevice(D3DADAPTER_DE~ULT, D3DDEVTYPE_HAL, Handle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, @d3dParams, FD3DDevice)i
end;
{******************************************************************}
{** OCBo5~aeM peCypChl
{******************************************************************}
procedure TMainForm.FreeD3D; begin
FD3DDevice := NIL; FD3D := NIL;
end;
{******************************************************************}
{******************************************************************}
procedure TMainForm.FormCreate(Sender: TObject); begin
if FAILED(InitD3D) then begin
ShowMessage('Error initializing Direct3D ... '); Halt;
end;
end;
**}
**}
(flaBa 5. Direct3D
47
{******************************************************************}
{*" OCBo50~aeM pecyp~ np~ 3aBepWeHM~ pa60Thl nporpaMMhl
""}
{************************************************************~*****}
procedure TMainForm. ForrnDestroy {Sender: TObject); begin
FreeD3Di
end;
{******************************************************************}
{ "" Ot.llilllaeM YCTpoi1:CTBO
*"}
{********************~*********************************************}
function TMainForm.ClearDevice: HResult; begin
I I Pe3YJIbTaT no YMOJNaHHIO Result := E~FAIL;
II E~ YCTpOMCTBO He C03~aHO, TO 3aBepwaeM pa60TY if FD3DDevice = NIL then EXIT;
II ~~c~ YCTpoMCTBO
Result := FD3DDevice.Clear(O, NIL, D3DCLEAR_TARGET, D3DCOLOR_XRGB($FF, 0, $FF) , I, 0);
end;
{************************************************************~*****}
{"" npOp~coBKa cue~
**}
{******************************************************************}
function TMainForm.RenderScene: HResult; begin
II ~CT~ YCTPOMCTBO Result := ClearDevice;
I I ECJl11 npoasoiuna o~6Ka, TC aaaeputaesz pa60TY if FAILED(Result) then EXIT;
48
l./aCTb II. DirectX Graphics
II TIepeKnroqeHMe 6y~ePOB FD3DDevice.Present(NIL, NIL, 0, NIL) end;
{***************k**************************************************}
{ * * Pa3JlMt.lHble .I1ei1cTBMR
**}
{******************************************************************}
procedure TMainForm.applicationEventsMainIdle(Sender: TObject; var Done: Boolean);
begin
if FIsActive then begin RenderScene; end;
Done := FALSE; end;
{********************~*********************************************}
**J
{******************************************************************}
procedure TMainForm.applicationEventsMainMinimize(Sender: TObject); begin
FIsActive
FALSE;
end;
{******************************************************************}
**J
{******************************************************************}
procedure TMainForm.applicationEventsMainRestore(Sender: TObject); begin
FIsActive .- TRUE; end;
{******************************************************************}
**J
rnasa 5. Direct3D
49
{************************************************************~*****}
procedure TMainForm.FormActivate(Sender: TObject); begin
FIsActive .= TRUE;
end;
END.
nonH03KpaHHbiM pe)l(MM
nOMMMO OKOHHOro pe)!(I1Ma, B Direct3D MMeerCR 11 n0J1H03KpaHHbIH pe)!(I1M. CJ1enylOllI.MH npMMep M3 xaranora Example_02 aarnsnno neMOHCTpl1pyeT HaM ero McnOJIb30BaHl1e. Ha caMOM nene nporpavaa 3TOro rtpasrepa nenaer naxe 6oJ1bwe - OHa n03B0J1f1eT nepexmo-rarscs Me)!(llY OKOHHblM M n0J1H03KpaHHbIM pe)f(I1MOM pa60TbI (npa novouur KOM6MHauMM KJIaBMlll <Nt>+<Enter».
Y Hac B npnsrepe nORBJIReTCR nOnOJIHMTeJ1bHbIH dmar:
FWindowed: boolean;
3TOT ¢J1ar 11 orrpenenser pe)f(MM paoorsr npMJ10)f(eIDfR - OKOHHbTH MJ1M nOJ1HO- 3KpaHHbIH. B CBfl3M C nORBJIeHl1eM HOBbIX B03MO)!(HOCTeH M3MeHMTCfI 11 pan npouenyp.
B rtponenype C03naHMfI ¢OPMbI Mbl YCTaHaBJII1BaeM 3Ha'IeHMe nannoro dmara B FALSE, lffo6bI I1Cn0JIb30BaTb M3Ha'IanbHO OKOHHblH pe)f(MM pa60Tbl (J1MCTI1Hr 5.5).
{*******************************************************************}
**}
{*******************************************************************}
procedure TMainForm.FormCreate(Sender: TObject); begin
/ / no YMOJIt,IaHYlIO Harne np~JIoJKeHllIe OKOHHoe FWindowed := TRUE;
if FAILED (InitD3D) then begin
ShowMessage('Error initializing Direct3D ... ');
50
l/aCTb II. DirectX Graphics
Halt;
end;
end;
H3MeHHJ1aCb npouenypa HHHUJ1aJIJ13aUHl1 nO.ll.CJ1CTeMbl Direct3 D - nORBl1J1acb .uonOJ1HHTeJ1bHM cPYHKUJ10HaJ1bHOCTb, CB~l3aHHM C YKaJaHlfeM rexyuiero pe)l(l1Ma pa60TbJ npJ1J10)l(eHHR (JIHCTJ1Hr 5.6).
{******.**************~*********************************************}
**}
{*******************************************************************}
function TMainForm.InitD3D: HResult;
/1 3aBepmaeM pa60TY B cnyqae C60R if FAILED(Result) then EXIT;
var
d3dDisplayInfo: TD3DDlsplayMode; d3dParams: TD3DPresentParameters; begin
II Pe3ynbTaT no YMon~a~ Result := E_FAIL;
II C03~aeM o6beKT c MHTe~eHCoM IDirect3D9 FD3D :=.Direct3DCreate9(D3D_SDK_VERSION};
II 3aBepmaeM pa60TY npouegypH npM OillM6Ke if FD3D = NIL then EXIT;
II n~Y4aeM YCTaHOBKM TeKymero pe~ a~anTepa
Result := FD3D.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, d3dDisplayInfo);
II 3a~aeM napaMeTpH YCTpoHcTBa:
ZeroMemory(@d3dParams, SizeOf(d3dParams));
(Jlasa S. Direct3D
S1
II KaKO~ pe~ MCnOnbSOBaTb d3dParams.Windowed := FWindowed;
II pe~ nepeKnDqeHHR Me~ By~epaMM d3dParams.SwapEffect := D3DSWAPEFFECT_DISCARD;
I I ~OPMaT 6~epa He onpenenea d3dParams.BackBufferFormat := d3dDisplaylnfo.Format;
I I EcnM npMJIOl!<:eHlIle nOnH03KPaHHoe, TO ... if not FWindowed then
begin
II ... McnonbSYeM TeKYmUe napaMeTP~ peJ!(JllMa a,llanTepa d3dParams.FUllScreen_RefreshRatelnHZ := d3dDisplaylnfo.RefreshRate; d~dParams.BackBufferWidth := d3dDisplaylnfo.Width; d3dParams.BackBufferHeight := d3dDisplaylnfo.Height;
I I Y611lPaeM aarorroaox OKHa M nMHIIlM rpamni BorderStyle := bsNonei
end
I I E= npMJIol!<:eHMe OKOHHoe, TO ... else begin
II 3a,llaeM o6~ cTMnb OKHa BorderStyle := bSSizeable; end;
II COS.IlaeM 06~KT yCTpo~cTBa
Result := FD3D.CreateDevice(D3DADAPTER_DEFhULT, D3DDEVTYPE_HAL, Handle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, @d3dParams, FD3DDevice) ;
end;
nOHBHJIaCb npouenypa o6pa6OTKH HIDKaTHH KJ1aBHlll (J1HCTHHf 5.7).
{** 06pa60TKa Ha~aTMR KnaBHlli
**}
52
LJaCTb 11. Direct)( Graphics
{*******************************************************************}
{*******************************************************************}
procedure TMainForm.FormKeyDown(Sender: TObjecti var Key: Word; Shift: TShiftState)i
begin
II Ha~aTHe <ALT>+<Enter> npHBo~T K CMeHe p~a if (ssAlt in Shift) and (Key = VK_RETURN) then begin
FWindowed .= not FWindowed; FreeD3D;
InitD3D;
end;
end;
Cl>aKTI1'1CCKI1 )JJISI pafiorst B nOJlH03KpaHHOM PC)I(I1MC MbI BCCro JlI1Wb 113MCHI1Jll1 HCCKOJlbKO napaverpoa B CTPYKTYPC TD3DPresentParameters, a TO'lHCC YKa3MI1, 'ITO HC 6YJlCM I1CnOJIb30BaTb OKOHHOC npI1JlO)l(CHI1C, 3aJlMI1 'IaCTOTY VVlnv.UJ"_' sxpana B nOJIH03KpaHHoM pe)l(I1Me, YKa3MI1 umpany 11 nsrcory ~HOro pC)I(I1Ma 11 C03JlMI1 COOTBCTCTBYJOUlce ycrpoacrso. M.3McHHeTCSI TaK)I(e 11 rpaHI1U OKHa uaurero npI1JIO)l(eHI1S1: B nOJlH03KpaHHOM pC)I<I1Me Mhl y611paeM roJIOBOK <pOPMbl 11 JlI1HI1I1 rpaHI1U, a B OKOHHOM npl1JIO)l(eHl111 soccraaaanasae 06bI'lHbriil CTI1JIb.
Ha'lI1HaSI C 3TOro npavepa, BCe nOCJIenyJOUll1e 6yJlYT I1MeTb B03MO)l(HOCTb KJIJO'IeHI1S1 Me)l(JlY OKOHHblM 11 nOJlH03KpaHHbIM pe)l(I1MaMH pa6OTbl.
Floreps YCTpOMCTBa
n03KCnepl1MeHTI1pyMre CO BTOpblM npauepoa. Ilorrepexmoxaare PC)I(l1Mbl TbI. A 3aTeM nonpotiyare BKJIJO'II1Tb cnSlUlI1ii1 pe)l(l1M pa60TbI 11 BblMTI1 113 JII160 npocTo nepeKJIJO'lI1TeCb Ha Jlpyroe npl1JIO)l(CHl1e 113 nOJIH03KpaHHoro )l(I1Ma paoorst, Ycrpoticrso 6YJleT nOTepSiHO 11 BOCnp0l13BeJleHI1e CTaHeT MO)l(HblM.
Ilpoaepars TeKYUlI1ii1 CTaTYC ycrpoiicraa MO)l(HO C nOMOUlbJO
IDirect3DDevice9.TestCooperativeLevel: function TestCooperativeLevel: HResult; stdcall;
fnasa 5. Direct3D
53
B cnysae ycnexa }laHHblM Mel-O}l sepner snaxeaae D3D _OK, a B cnysae HeY}la'll1 - O}lHO 113 cnenyioumx 3Ha'leHI1M:
o D3DERR_ DEVICELOST - yC'rpOMCTBO norepnno, 11 ero HeJJh3SI BOCCTaHOBI1Th B }laHHbIM MOMeHT. BOCnp0I13Be}leHl1e HeB03MO}l(HO;
o D3DERR DEVICENOTRESET - ycrpoacrso norepano, HO MO>KeT 6hITb BOCCTa-
HOBJ1eHO.
COOTBeTCTBeHHO, B npauepc 113 KaTaJ10ra Example_03 peamraosana raxas nposepxa 11 BOCCTaHOBJ1eHl1e ycrpoficrna. <l>aKTI1'leCKI1 non BOCCTaHOBJleHl1eM YCTpoacrsa MO}l(HO nOHI1MaTb nOJlHYlO nOBTOpHYlO I1HI1UHMI13aUl11O nO}lCI1CTeMbl. UI1I<Jl O}l(I1}laHI1f1 reneps Bhlfllfl}lI1T TaK, KaK npencraaneno B JlI1CTI1Hre 5.8.
{*********************************************************************}
{** Pa3~HHe ~eMCTBHR
**}
{*********************************************************************1
procedure TMainForm.applicationEventsMainIdle(Sender: TObject; var Done: Boolean);
var
hr: HResult; begin
if FIsActive then begin
II TIon~aeM CTaTYC yCTpOMCTBa
hr .- FD3DDevice.TestCooperativeLeveli
II ECITM YCTPOMCTBO He rOTOBO, TO 3aBepmaeM pa60TY if hr = D3DERR DEVICELOST then EXIT;
II ECITM yCTpoMCTBO MO~O BOCCTaHOB~Tb, TO BOCCTaHa~BaeM
if hr
D3DERR DEVICENOTRESET then
begin FreeD3D; InitD3D;
end;
54
LJacTb /I. Direct)( Graphics
II TIpopMCOBWBaeM CueHY RenderScene;
end;
Done . = FALSE;
end;
I
BOT 11 )l06Pa.JHlCb MbI, HaKOHeu-TO, no cavoro npouecca pMCOBamUI. B Direct3D
OHO npOI1CXO)lI1T npn rtououta npl1MMTI1BOB (KaK 11 B DirectDraw, aaecs HeT KaKl1x-Jur60 aarorosox, ro-mee, OHM MMelOTCH B naxere CneUMaJIbHblX YTMJlMT D3DX, HO 06 3TOM 6Y)leT paCCKa3aHO n03)1(e). K OCHOBHblM npl1MMTMBaM MO)l(HO oTHeCTM TO'IKl1, JlI1HI1M 11 TpeyrOJIbHI1KM. A nOJIHbliiI cnHCOK npHMMTMBOB TaKOB:
o TO'IKM (Point Lists);
o JIMHMI1 (Line Lists);
o nOCJIe)lOBaTeJIbHOCTb mmMti (Line Strips);
o TpeyrOJlbHI1KI1 (Triangle List);
o nOCJIenOBaTeJIbHOCTb TpeyrOJIbHI1KOB (Triangle Strip);
o nOCJle.nOBaTeJlbHOCTb rpeyronsuaxon C 06111eti sePWHHOiil (Triangle Fan).
Pa60Ta C 6y¢epoM BepWI1H OCYllleCTBJlHeTCH npu
IDirect3DVertexBuffer9. C03)laeTCH 6y¢ep
IDirect3DDevice9.CreateVertexBuffer:
function CreateVertexBuffer(
Length: LongWord;
nOMOlllM HHrep¢eiilca BepWI1H
6ycpep BepWL1H
Ka)l(.flblH npMMI1TI1B COCTOHT M3 nafopa sepWI1H: M3 onnoa sepunrnsi COCTOHT TO'lKa, H3 )lBYX BepWHH COCTOMT orpesox 11 113 rpex rpeyrOJIbHI1K. Cnl1COK sepWHH )lOJl)f(eH xpamrrsca B CneUI1a.J1bHOM 6y¢epe - 6y¢epe eeptuun (Vertex Buffer).
Usage,
FVF: DWord; Pool: TD3DPool;
(nasa 5. Direct3D
55
out ppVertexBuffer: IDirect3DVertexBuffer9; pSharedHandle: PHandle):
HResult; stdcall;
3JleCb:
Cl Length - pasuep 6ycpepa B 6aMTax;
Cl Usage - yxasstsaer na cnoco6 I1CnOJIb30BaHIUI pecypcos. Moxer npl1HHMaTb HYJIeBOe 3Ha'leHHe;
Cl FVF - KOM6HHaUmi OJlHOro HJII1 HeCKOJIbKI1X IPJIarOB:
• D3DFVF_DIFFUSE - cpopMaT BepWI1H conepxar Jll1CPCPY3HYlO UBeTOBYIO COCTaBJISIlOmylO;
• D3DFVF_NORMAL - B cpopMaTe sepunur npl1CYTCTByeT BeKTOp HOPMaJll1. <l>JIar He MO)l(eT I1CnOJIb30BaTbCSI COBMeCTHO C cpJIarOM D3DFVF XYZRHW;
• D3DFVF_PSIZE - pasvep TO'lKH rrpacyrcrsyer B IPopMare BepWI1HbI;
• D3DFVF_SPECULAR - cpopMaT BepWI1H COJlep)l(l1T OTpIDKalOmylO UseTOBYIO COCTaBJISIIOIilYIO;
• D3DFVF _ XYZ - <PoPMaT BepWHHbI BKJIIO'lae-r n0311UI1lO nerpancdiopsorpoBaHHOM aepurausr;
• D3DFVF_XYZRHW - cpopMaT sepWI1HbI BKJIIO'lae-r n0311UI1lO TPaHCCPOPMI1POBaH HOM aepunnru. <l>JIar He MO)l(eT HCnOJIb30BaTbCR COBMeCTHO C ¢JIaraMI1 D3DFVF_NORMAL 11 D3DFVF_XYZ;
• D3DFVF_XYZBI sepes D3DFVF_XYZBS - ¢opMaT BKJIIO'lae-r n0311UI1lO H sec llJIR I1CnOJIb30BaHHSI B onepaunax CMelllI1BaHHSI;
• D3DFVF_XYZW - IPOpMaT BepWI1H COnep)l(I1T x-, y-, Z-, W-KOOpJlI1HaTbl. ,D,aHHM KOHCTaHTa I1cnOJIb3yeTcSI TOJIbKO B nporpasoaapyeuov KOHBeMepe BepWI1H;
LI Pool - xnacc naMSlTl1 llJIR pecypcos:
• D3DPOOL _ DEFAULT - pecypCbI 6YJlYT pa3MemaTbCSI B JIOKaJibHOM Bl1JleonaMSlTI1 JII160 B AGP;
• D3DPOOL_MANAGED - nOnCI1CTeMa Direct3D ynpaBJISIeT pa3MeIUeHl1eM pecypca Me)l(Jly CHCTeMHOM naMSITblO H BHneonaMSITblO;
• D3DPOOL_SYSTEMMEM - pecypc pa3MelilaeTCSI B CI1CreMHOM naMSlTI1;
• D3DPOOL_SCRATCH - pecypc paaaeuiaercs B CI1CTeMHOM naMSITI1 11 He 6yner aocrynen Direct3D;
LI ppVertexBuffer - aapec nepeaennoa, B KOTOPYIO 6YJleT nepenan mrrepcpeMc C03JlaHHoro 6ycpepa sepWI1H;
qeTBePTI>lH npavep, 113 xaranora Examples_04, BhIBO.lUlT rosxy B uerrrp sxpana <l>OH 3aKpaUlHBaeTCSI ':IepHblM UBeTOM. PaCCMOTpI1M nonpotiaee HaWI1 .lIeHCTBI1SI.
JI106ru! TO':lKa, TaK I1JII1 I1Ha':le, npe.llCTaBJISIeT C060H BepWI1HY, 11 MhI .lI0JI>KHhI sanars ee THn:
TCustomVertex = packed record x, y, z, rwh: Single;
end;
56
LJaCTb 11. DirecfX Graphics
o pSharedHandle - aapeaepaapoaano. )lOJI>KHO I1CnOJIh30BaTbCSI HYJIeBOe 3Ha-
':IeHl1e.
)lJISI pa60TbJ C 6ycpepoM BepWI1H HaM norpefiyerca nsa MeTO.lIa. Ilepsua MeTO.ll - 3TO 6JIOKI1pOBKa nocryna K aepunmaa 11 nOJIY':leHl1e YKaJareJISI aa 06JIaCTh naMSITI1 6ycpepa IDirect3DVertexBuffer9. Lock:
function Lock(
OffsetToLock, SizeToLock: LongWord; out ppbData: Pointer; Flags: DWord):
HResult; stdcall;
3.l1eCh:
o OffsetToLock - cxemenae OT nasana 6ycpepa B 6aihax;
o SizeToLock - paaxep 6JIOKa .LIaHHhIX B 6aHTaX;
o ppbData - YKa3aTeJIh, KOTOPhIH 6Y.lleT conepxars CChIJII<)' na 06JIaCTh naM}{TH .lIaHHhIX 6YQJepa;
o Flags - cnoco6 nocryna K .lIaHHhIM B 6ycpepe. MO>KeT npl1HI1MaTh HYJIeBOe
anaseaae,
BTOPOH MeTO.ll n03BOJISIeT BblnOJIHSITh pa36JIOKI1POBKY 6ycpepa sepunnr IDirect3DVertexBuffer9.Unlock:
function Unlock: HResult; stdcall;
TO"lKa
,[laHHa$l crpyxrypa onacsrsaer nOJIO>KeHl1e TO':lKI1 B npocrpaacrne, a TaK>Ke YKaasmaer Ha TO, 'ITO Mhl I1CnOJIh3yeM npeoopaaoaannue xoopnanaru 11 TO':lKa HBJISIeTCSI OCBeweHHoH.
Ineee 5. Direct3D
57
COOTBeTCTBeHHO, KOHCTaHTa, Om1CbJBaIOlllaH cpopMaT TOqeK, fiyner I1MeTb cnenyio 11111 tI Bl1n:
D3DFVF CUSTOMVERTEX = D3DFVF XYZRHW;
_ -
Ilepsu« neJIOM nocne I1HI1UI1aJII13aUI111 Direct3D MbI nonxnu 3anOJIHI1Tb 6ycpep BepWI1H. D,JUI sroro MbJ n06aBmleM npouenypy PrepareVertices (nl1CTI1Hf 5.9).
{*****-***************************************************************}
{** IToAroToBKa Ha60pa BepWMH
**}
{*********************************************************************}
function TMainForm.PrepareVertices: HResult;
var
Vertices: TCustomVertex; pVertices: pointer; d3dViewport: TD3DViewport9;
begin
II C03AaeM 6y~ep BepWMH
Result := FD3DDevice.CreateVertexBuffer(SizeOf(Vertices). O.
D3DEVF_CUSTOMVERTEX, D3DPOCL_DEFAULT, FD3DVertexBuffer, NIL);
I I ITPI1 HeB03MOlKHOCTl1 C03AaHYlH 3aBepmaeM pa60TY if FAILED{Result) then EXIT;
I I Ilorry-raesa napasse'rpsr OKHa BhlBOAa FD3DDevice.GetViewport{d3dViewport);
II YCTaHOBKa'napaMeTpOB BepWMHN ZeroMemory(@Vertices, SizeOf(Vertices»;
Vertices. x
d3dViewport.Width div 2;
Vertices.y .- d3dViewport.Height div 2; vertices.rwh := 1;
II BnoKHpyeM AocTyn K 6y~epy BepWMH
Result := FD3DVertexBuffer.Lock(0, SizeOf{Vertices). pVertices, 0);
if FAILED(Result) then EXIT;
J 331<. 339
58
4aCTb 11. Direct)( Graphic
try
II Konl1pyeM B 6ycJ?ep .D;aHHble
CopyMemory(pVertices, @Vertices, SizeOf(Vertices»; finally
II Pa36noKMpoBKa 6ycJ?epa FD3DVertexBuffer.Unlock;
end;
end;
Bepurany MbI pacnonaraeu no uenrpy OKHa BbIBOna, napaverpsr KOTOpOro nony~aeM MeTOnOM IDirect3DDevice9.GetViewport:
function GetViewport(
out pViewport: TD3DViewport9):
HResult; stdcall;
3necb pViewport - CTpYKTypa TD3DViewport9, B KOTOpylO 6YJlYT 3am1CaHbl TeKYlUlle napaxerpu,
CTpYKTYpa TD3DViewport9 COnep)l(I1T cnenyiourae nona:
o X, Y - KOOpnl1HaTbI sepxnero nesoro yrna OKHa asrsona;
o Width, Height - urupaaa 11 BbICOTIl OKHa nusona;
o MinZ, MaxZ - napauerpst rny6I1Hbl.
Ilpouenypa npOpl1COBKI1 cuenu raiose rrpereprtena onpenenennue 113MeHeH (nI1CTI1Hr 5.10).
{** npOpl1COBKa c~eHbl
**}
{**********************~************************~*********************}
{*********************************************************************}
function TMainForm.RenderScene: HResult; begin
II ~CTI1M yCTpoMCTBO
Result := ClearDevice;
II EcnI1 npol130mna oWl16Ka, TO 3aBepmaeM pa60TY if FAILED(Result) then EXIT;
rnasa 5. Direct3D
59
I I Haxarrc Cl..leHbI FD3DDevice.BeginScene;
try
II CBR3~aeM 6y~ep BepWMH c nOTOKOM ~aHHhlX YCTpoMcTBa FD3DDevice.SetStreamSource(0, FD3DVertexBuffer, 0, SizeOf(TCustomVertex»;
II YCTaHaBITHBaeM ~OPMaT BepWHH FD3DDevice.SetFVF(D3DFVF_CUSTOMVERTEX);
II PHcyeM np~~B FD3DDevice.DrawPrimitive(D3DPT_POINTLIST, 0, 1); finally
II 3aBepmaeM Cl..leHY FD3DDevice.EndScene;
end;
II ITepeKnIDt,leHHe 6y~epoB
FD3DDevice. Present (NIL, NIL, 0, NIL);
end;
npOpHCOBKa cuensr HaQI1HaeTCSl C Bbl30Ba IDirect3DDevice9. BeginScene: function BeginScene: HResu1t; stdca11;
<DaKTI1QecKI1 ,[(aHHbIH MeTO'[( 0603HaQaeT HaQaJIO 6JlOKa npOpl1COBKI1 cuensr, B KOHue 6JlOKa Heo6xOlll1MO auaaars MeTO,[( IDirect3DDevice9. EndScene: function EndScene: HResu1t; stdca11;
060~BHB HaQaJIO CUeHbI, nepBblM ,[(eJlOM Mbl CBH3bIBaeM 6ycpep sepurau C nOTOKOM ,[(aHHbIX YCTpOHCTBa MeTO,[(OM IDirect3DDevice9. SetStreamSource: function SetStreamSource(
StreamNumber: LongWord;
pStreamData: IDirect3DVertexBuffer9:
OffsetInBytes, Stride: LongWord):
HResu1t; stdca11;
60
LJacTb II. DirectX Graphics
3neCb:
o StreamNumber - HOMep noroxa, nasanaa C HYJIeBoro;
o pStreamData - YKa3aTeJIb na I1HTepcpeHc 6ycpepa BepUlI1H;
o OffsetInBytes - cueutetnre B 6aHTax OT aaxana noroxa;
o Stride - war B 6aHTax.
H nOCJIe sroro YCTaHaBJTl1BaeM cpopMaT BePWI1H npa noxouta MeTona IDirect3DDevice9.SetFVF: function SetFVF(
FVF: DWORD):
HResult, stdcall,
3neCb FVF - 6I1TOBa51 KOM611HaullH cpJIarOB (rpnarn npencraanenu paaee B onncaH1I1I napauerpa FVF MeTOna IDirect3DDevice9. CreateVertexBuffer).
3neCb:
o PrimitiveType - TlIn npIlMI1TI1BOB:
• D3DPT_POINTLIST - TO'!KI1;
• D3DPT_LINELIST - JII1HI1I1;
• D3DPT _ LINESTRIP - nOCJTenOBaTeJTbHOCTb JII1HIIH;
• D3DPT_TRIANGLELIST - TpeyroJIbHIIKlI;
• D3DPT_TRIANGLESTRIP - nOCJIenOBareJIbHOCTb TpeyroJIbHI1KOB;
• D3DPT TRIANGLE FAN - nOCJIenOBaTeJIbHOCTb TpeyrOJIbHIIKOB C
BepWIIHOH;
o StartVertex - I1HneKC l1epBOH 3arp}'}KaeMOH BepWI1Hbl;
o PrimitiveCount - 'lIlCJIO npIlMIITIIBOB.
nOCJIe 3anYCKa nOSlBIITCH OKHO, B uenrpe KOTOpOrO fiyner CBeTI1TbCH TO'! (pac, 5.2).
PllCOBaHl1H
npllMIITIIBOB
IDirect3DDevice9.DrawPrimitive: function DrawPrimitive( PrimitiveType: TD3DPrimitiveType, StartVertex,
PrimitiveCount: LongWord):
HResult; stdcall;
(nasa 5. Direct3D
61
PMC. 5.2. P~cyeM TO'lKY
TOlJKY MbI HapHCOBaJIl1, rerteps nasatire ee paCKpaCI1M. D.JUI saxpacxn neofixo}lI1MO KOe-lJTO 113MeHHTb B natunx CTpYKTYpax. B crpYKTYPY TCustomVertex JlO- 6aBJuleTcSI HOBblM napaverp color:
TCustomVertex = packed record
x, y, z, rwh: Single;
color: DWORD;
end;
A B KOHCTaHTY, onacsreaiouiyio cpopMaT aaumx BepWHH, BKJIlOlJaeM napaverp, YKa3b1BalOlllHM na nonaepxxy JlHCPCPY3HOro OCBellleHHSI:
D3DFVF_CUSTOMVERTEX = D3DFVF_XYZRHW or D3DFVF_DIFFUSE;
H nocneznree, 'ITO Mbl nenaev, - ::ITO sanaev QBeT BepWHHbI:
Vertices.color := $OOOOOOFF;
Teneps Y Hac tra sxpaue nOSlBI1TCSI CHHSISI TO'-lKa. Ilpuuep HaXOJlI1TCSI B nanxe Example_OS.
62
'-IaCTb II. DirectX Graphics
YCJ1Q)KHJilM sanaxy 11 3aCTIlBJilM naunr BepWHHbI ,n:BHraTbCH. Ilpauep H3 xaranora ExampJe_06 HaM 3TO HarJ1H,n:HO ,n:eMOHCTpHpyeT (pHC. 5.3).
PMC. 5.3. npltlMep aHItlMallltl1tl
BepWHHbI nepenanrarorcs CJ1eBa nanpaao. MaKCHMaJIbHOe KOJ1Ji1l1eCTBO sepmaa sanaerca B sane KOHCTIlHThl:
MAX_VERTICES = 500;
Ilpouenypa 3an0J1HeHHH sepuran reneps paCClIHTIlHa na MaCCHB (J1Ji1CTJilHr 5.11), a He na O,n:HY, KaK B npOWJ10M npavepe.
{*********************************************************************}
{** rrO~roToBKa Ha60pa BepllMH
**}
{******************~******************~*******************************}
function TMainForm.PrepareVertices: HResult;
var
Vertices: array[O .. MAX_VERTlCES - 1] of TCustomVertex; pVertices: pointer;
rnasa 5. Direct3D
63
d3dViewport: TD3DViewport9; I: integer;
begin
II C03~aeM 6y~ep BepWMH
Result := FD3DDevice.CreateVertexBuffer(SizeOf(Vertices) , 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, FD3DVertexBuffer, NIL);
II TIPH HeB03MO~OCTH C03~aHHR 3aBepWaeM pa60TY if FAILED (Result) then EXIT;
II TIonyqaeM napaMe~ OKRa B~o~a FD3DDevice.GetViewport(d3dViewport);
Randomize;
II YCTaHoBKa napaMeTpOB aepWHH for I := 0 to MAX VERTICES - 1 do begin
Vertices [I] .x := Random(d3dViewport.Width); Vertices [I] .y := Random(d3dViewport.Height); Vertices [I] .rwh := 1;
Vertices[I].color := Random($OOFFFFFF);
end;
/1 BnoKMpyeM ~ocTyn K 6y~epy BepWHH
Result := FD3DVertexBuffer.Lock(0, SizeOf(Vertices), pVertices, 0);
if FAILED(Result) then EXIT;
try
II KOnHpyeM B 6y~ep ~aHHhle
CopyMemory(pVertices, @Vertices, SizeOf(Vertices)); finally
II Pa36noKMpoBKa 6y~epa FD3DVertexBuffer.Unlock; end;
end;
Flepeveuienae BepWHH npOHCXO,lU1T B MeTO,lle MoveVertices (JUiCTI1Hf 5.12).
64
{*********************************************************************}
{*********************************************************************}
function TMainForm.MoveVertices: HResult; var
Vertices: array[O .. MAX_VERTICES - 1) of TCustomVertex; pVertices: pointer;
d3dViewport: TD3DViewport9;
I: integer;
begin
II TIonyYaeM napaMeTphl OKHa BhlBo~a FD3DDevice.GetViewport(d3dViewport);
II EnOKMpyeM ~ocTyn K 6YWepy BepwwH
Result := FD3DVertexBuffer.Lock(O, SizeOf(Vertices) , pVertices, 0);
if FAILED (Result) then EXIT;
try
ZeroMemory(@Vertices, SizeOf(Vertices));
II KODX;PyeM BepillMHhl BO BpeMeHHhlH 6yWep CopyMemory(@Vertices, pVertices, SizeOf(Vertices));
II MeHReM nonO~HMe BepwwH'
for I .- 0 to MAX VERTICES - 1 do begin
Vertices [I] .x .- vertices [I] .x + 1;
if Vertices[I).x > d3dViewport.Width then begin
Vertices[I].x '= -1;
Vertices[I].y '= Random(d3dViewport.Height);
(Jl8Ba 5. Direct3D
Vertices[Ij . color := Random($OOFFFFFF);
65
end;
end;
II KonMpyeM BepillM~ B 6y~ep
CopyMemory(pVertices, @Vertices, SizeOf(Vertices)); finally
II Pa36noKKpOBKa 6~epa FD3DVertexBuffer.Unlock;
end;
end;
Ilpanuan pa60TbI TIOH npouenypsr O'leHb npOCT: xonapyev conepxauoe 6y¢epa sepumn BO BpeMeHHbrt!: 6y¢ep, MeHHeM xoopnnnary X Ka)(()lot!: BepWI1HbI 11 sarracuaaev nannue 06paTHO B 6y¢ep. Ilpn IlOCHDKeHI1M sepumnoti npasoa rpaHI1UbI MbI ee 06HYJISJeM 11 sanaev BepWI1He HOBoe nOJIo)((eHMe BblCOTbI 11 HOsoe anasenae UBeTa. 3a C'IeT :3TOro IlOCTMraeTCH nJIaBHOCTb 11 ueJIOCTHOCTb Hawet!: KapTI1Hbi.
IlMHMM M nOCneAOBaTenbHOCTb nMHMM
npl1Mepbl M3 KaTaJIOfOB Example_07 M Example_DB IleMoHcTpMPYIOT HaM pafiory C JTMHMSIMM M nOCJIeilOBaTeJTbHOCTHMI1 JIMHMil. ,UJTH 60JTbwet!: HafJTSJIlHOCTM H peWMJI cnenars npuvepst aHMMMpoBaHHbIMM, KaK M npoumsni npuvep. KOHUbl JIMHl1il B npnraepax OTCKaKMBalOT OT rpannu axpana,
3Ha'leHMH cMew.eHMil no OCHM X M Y J]JIH Ka)(()loil BepWJ1HbI xpaHHTCH B MaCCJ1Be FOe 1 taPoints:
FDeltaPoints: array[O .. MAX_VERTICESj of TPoint;
CMellleHI1H 3aIIaJOTCH O,llI1H paa B npouenype nOilfOTOBKM aafiopa BepWMH:
II 3anOJIHReM MaCCffi3 cMelUeHMM MR HaillMX BepillMH ZeroMemory(@FDeltaPoints, SizeOf(FDeltaPoints)); for I := 0 to MAX VERTICES - 1 do
begin
FDeltaPoints[Ij.X := Random(S) + 1; FDeltaPoints[Ij.Y := Random(S) + 1;
66
II CnyqaM~ 06paSOM YKaShlBaeM HanpaBneHMe if Random(lOO) mod 2 = 0 then FDeltaPoints[I).X := -FDeltaPoints[I).X; if Random(lOO) mod 2 = 0 then FDeltaPoints[I).Y := -FDeltaPoints[I) .Y;
end;
nOJIO)l{eHHe aepumn MeHfleTCfI CJIeJIYlOmHM 06pa30M:
II MeHReM nono~eHHe BeplliMH
for I .- 0 to MAX VERTICES - 1 do
begin
Vertices [I) .x := Vertices[I).x + FDeltaPoints[I).X; Vertices [I] .y := Vertices[I).y + FDeltaPoints[I).Y;
if (Vertices[I).x < 0) or (Vertices[I).x > d3dViewport.Width) then begin
FDeltaPoints[I).X := -FDeltaPoints[I) .X; Vertices[I).x := Vertices[I).x + FDeltaPoints[I).X;
end;
if (Vertices[I).y < 0) or (Vertices[I).y > d3dViewport.Height) then begin
FDeltaPoints[I).Y := -FDeltaPoints[I) .Y; Vertices[I).y := Vertices[I).y + FDeltaPoints[I) .Y;
end;
end;
COOTBeTCTBeHHO H3MeHHJICfI H MexaHH3M npOpl1COBKH npHMHTHBOB - JlJIfi PHCOBaHHfI JIHHHH Mbl HCnOJIb3yeM MeTOJI IDirect3DDevice9. DrawPrimi tive C napaverpora D3DPT_LINELIST H KOJIHQeCTBOM npHMI1THBOB B JIM pasa MeHbllIHM ofinrero 'lHCJIa aepunm:
FD3DDevice.Drawprimitive(D3DPT_LINELIST, 0, MAX_VERTICES div 2);
Ha pHC. 5.4 noxasana pafiora nepsoro npHMepa C JIHHI1f1MH.
rnaBa 5. Direct3D
67
PMC. 5.4. PVlcyeM nVlHVIVI
Ecnn )f(e HaM H}')KHO HapMCOBaTh He ornensno sanrsre llMHMM, a uenyro nocnenoaarensnocrs, TO .nOCTaTO'lHO M3MeHMTh napaverp D3DPT_LINELIST B MeTo.ne ssrsozta npl1MMTMBOB na D3DPT _ LINESTRIP 11 YKa3aTh 'lMCllO llMHMH na e.aMHMUY, MeHbWYIO ofiutero 'lMClla BepWMH:
FD3DDevice.Drawprimitive(D3DPT_LINESTRIP, 0, MAX_VERTICES - 1);
B rrrore Mhl yBM.aMM aa axpane TO, 'lTO npencraaneno Ha pMC. 5.5.
PMC. 5.5. PVlcyeM nocnenoearensaocrs nVlHVI~
68
Tpeyrol1bHMK
M nOCl1eAOBaTel1bHOCTM Tpeyrol1bHMKOB
OT pHCOBaHHH JIHHMti rtepetiaea K pacoaamno TpeyraJIhHHKOB. Ilpouecc MX BhIBOlla He CMJIhHO OTJII1'IaeTCH OT npouecca nsrsona TaKHX npHMI1THBOB, KaK TOlJKa 11 JIHHHH. OCHOBHoe OTJIHlJHe - ::lTO lJHCJIO aepumu.
,UJIH asrsona rpeyronsnaxa MhI 3a.llaIIHM era aepiuansr B BHIle KOHCTaHT B npouenype nOilfOTOBKH aepunm (JIHCTMHf 5.13).
{*********************************************************************}
{** nO~rOTOBKa Haoopa BeplliMH
{*********************************************************************}
function TMainForm.PrepareVertices: HResult;
const
Vertices: array[O .. 2) of TCustomVertex = (
(x: 50; y: 50; z: 0.5; rwh: 1; color: $OOOOOOFF) ,
(x: 250; y: 250; z: 0.5; rwh: 1; color: $OOOOFFOO) ,
(x: 50; y: 250; z: 0.5; rwh: 1; color: $OOFFOOOO) ) ;
var
pVertices: pointer; begin
II C03~aeM 6y¢ep BeplliMH
Result := F'D3DDevice.CreateVertexBuffer(SizeOf(Vertices), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, FD3DVertexBuffer, NIL);
II np~ HeB03MO~OCT~ C03~aHMR saBepmaeM pa60TY if FAILED (Result) then EXIT;
II Brro~pyeM ~OCTyn K 6y~epy BeplliMH
Result := FD3DVertexBuffer.Lock(0, SizeOf(Vertices), pVertices, 0);
if FAILED (Result) then EXIT;
(paBa 5. Direct3D
69
try
II KOnHpyeM B 6y~ep ~a~e
CopyMemory(pVertices, @Vertices, SizeOf(Vertices)); finally
II Pa36rroKHpoBKa 6y~epa FD3DVertexBuffer.Un1ock;
end;
end;
MeTO.Il IDirect3DDevice9. DrawPrim£ti ve .Il0JDKeH 6bITb Bbl3BaH C, rrapasrerpov D3DPT_TRIANGLELIST H K0J1H4eCTBOM npHMHTHBOB paBHblM O.llHOMY, T. K. 6Y.IleT pHcoBaTbcR O.llHH rpeyronsmnc
FD3DDevice.DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
Pe3YJ1bTaT pafioru npasrepa H3 xaranora Example_09 npasenen na pHC. 5.6.
PMC. 5.6. TpeyrollbHL1K
nOCJ1e.llOBaTeJ1bHOCTb TpeyroJ1bHHKOB BH.IlHa aa pHC. 5.7.
B 3TOM npavepe (H3 xaranora Examples_tO) Mbl BH.IlHM nocnenosarensnocrs CMe)l(HbIX TpeyrOJ1bHHKOB, HMelOIllHX 06IllYlO rpans, ,UrIR HX pHCOBaHHH HCnOJlb- 30BMCR pe)l(HM asmona npHMHTHBOB D3DPT_TRIANGLESTRIF:
FD3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 6);
{*********************************************************************}
Pille. 5.7. nOCJleAOBaTellbHocTb rpeyronsuaxoe
70
KaK BbI }')Ke nasepuo ycnenn 3aMeTl1Tb, rpeyronsamcr B .uaHHoM pe>KMMC He saKpaWCHbI, H MbI OT'leTJIHBO MO>KeM YBH,Uen xapxac ¢HrypbI, HMM COCTaBJ1CHHOit. 3'ro .uOCTHraCTCR nyresr BKJIlO'1eHHR pe>KHMa npopMCOBKM xapxaca B npouecce asmona cueau:
FD3DDevice.SetRenderState(D3DRS_rILLMODE, D3DFILL WlREFRAME}i
A caMM BepWHHbI 3a,nalOTCR B npouenype PrepareVertices (mI.CTIIHf 5.14) .
• "/>;.0 ',0 -';!'<I:*'..v ~.
< s > 1;: ,~ , ~', • ( 1:"';; ~
';~~~ ~ .:';~ ;";:-.'",.¥..i.< ~~\.:f~" ~ ~ ... ;,r.v.. .. /~I ~f:<'" ' :~; .. ~1 ~,,~.'f'''''.~ k.~}:,,\~
{** rrO~rOTOBKa Ha60pa Bep~H
** }
(*********************************************************************)
function TMainFor.m.PrepareVertices: HResult;
var
Vertices: array[O .. 7] of TCUstornVertex; pVertices: pointer;
I: integer;
begin
1/ Co3~aeM 6y~ep Bep~H
(JI8Ba 5. Direct3D
71
Result := FD3DDevice.CreateVertexBuffer(SizeOf(Vertices), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, FD3DVertexBuffer, NIL);
II npH HeBOSMO~OCTH COS~aHMR saBeprnaeM pa60TY if FAlLED(Result) then EXIT;
Randomize;
II YCTaHOBKa napaMeTpOB BepWMH ZeroMernory(@Vertices, SizeOf(Vertices)); for I .- 0 to 7 do
begin
Vertices[Ij.x :~ I * 50 + 10; Vertices[Ij.y := ((I + 1) mod 2) * 50 + 25; Vertices[Ij.rwh := 1;
Vertices[Il.color .- $OOFFFFFF;
end;
II BnOKHpyeM ~ocTyn K 6y~epy BepWMH
Result := FD3DVertexBuffer.Lock(0, SizeOf(Vertices), pVertices, 0);
if FAILED (Result) then EXIT;
try
I I Kortzpyesa B 6ycllep ~aHHble
CopyMernory(pVertices, @Vertices, SizeOf(Vertices)); finally
II PaS6nOKHpOBKa 6ycllepa FD3DVertexBuffer.Unlock;
end:
end;
HaMM OCTaJICSI HepaCCMOTpeHHbIM nOCJ1ellHl1tt pe)!(MM sstsorta npl1MMTMBOB - D3DPT _ TRIANGLEFAN. 3TOT pe)!(MM n03BOJ1S1eT pMCOBaTb nOCJTe,nOBaTeJ1hHOCTh TpeyroJ1bHI1KOB C O.nHMM 06lUl1M ueHTpOM.
Ilpmiep H3 KaTaJIOra Example_II HafJ1S111HO HaM 3TO nevoacrpapyer (pMC. 5.8).
Pille. 5.8. Flocnenoearemsuocn, rpeyronsuaxoa C 06UJ.Ii1M ~eHTpOM
72
Ilepaaa sepumua pacnonaraercs no uenrpy axpana, a OCTIUlbHble HD.yr no 'laCOBOH crpenke aoxpyr nee (jIHCTHHf 5.15).
{** nO~rOTOBKa Ha60pa BepWMH
**}
{******************************************~**************************}
{*********************************************************************}
function TMainForm.PrepareVertices: HResult;
var
Vertices: array[0 .. 7] of TCustomVertex; pVertices: pointer;
I: integer;
begin
II C03~eM 6y~p BepillMH
Result := FD3DDevice.CreateVertexBuffer(SizeOf(Vertices), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, FD3DVertexBuffer, NIL);
II np~ HeB03MO~OC~ C03~a~R 3aBepwaeM pa60TY if FAILED(Result} then EXIT;
(J78s85.Direct3D
73
Randomize;
II YCTaHOBKa napaMeTpoB BeprnMH ZeroMemory(@Vertices, SizeOf(Vertices)); Vertices [0] .x '= 180;
Vertices [0] .y .- 120;
Vertices[O].rwh := 1;
Vertices[O].co1or := $OOFFFFFF;
for I := 0 to 5 do begin
Vertices[I + l].x .- sin(I * 60 * PI j 180) * 100 + 180;
Vertices[I + l].y -cos(I * 60 * PI I 180) * 100 + 120;
Vertices [I + 1] .rwh := 1;
Vertices[l + 1].co1or := $OOFFFFFF;
end;
Vertices [7] '= Vertices[l];
II EnOKMpyeM ~OCTYll K 6~epy BepruMH
Result := FD3DVertexBuffer.Lock(0, SizeOf(Vertices) , pVertices, 0);
if FAILED(Resu1t) then EXIT;
try
II KonupyeM B 6y~p ~~e
CopyMemory(pVertices, @Vertices, SizeOf(Vertices)); finally
II Pa36noKMpOBKa 6y~pa FD3DVertexBuffer.Un1ock; end;
end;
74
-tect» II. DirectX Graphics
OT TpeyronbHIf1Ka K npRMoyronbHIf1KY
Haysasuracs onepaposan, OCHOBHbTMH THnaMH npHMHTHBOB, nasaare HaY'IHMCSI CTPOHTb H3 HHX npavoyronsmo; A TO':lHee, nOCTpoHM npSlMoyrOJIbHHK H3 nayx rpeyronsaaxos (pHC. 5.9).
PMC. 5.9. Kaanoar
Ilpavep H3 KaTaJIOra Example_12 noxaausaer rtocrpoeirae npauoyromuaxa (xsaapara) H3 nsyx TpeyrOJIbHHKOB. 3aJIHB rpeyronsuaxa O.lIHHaKOBbIM UBeTOM, MbI He BH.lIHM HX rpauausr, H y Hac C03.lIaeTCSI enesarnenne OJIHOH ueJIOCTHOM qlHryPbI.
nOCTpOeHIf1R B npocrpaacrae
Bee HaWH nOCTpoeHHSI .lIO CHX nopnpOBO.lIHJIHCb na nJlOCKOCTH, a He B npoCTpaHCTBe. M KaK 6bl KpaCHBO He ssrrnanena naura cuena, OHa BCe paBHO napaCOBaHa na nJlOCKOCTH. B H3Y'leHHblx HaM" npauepax MbI HCnOJlb30BaJIH snaseHHe FVF, pasaoe D3DFVF_XYZRHW, npn C03.llaHHH YCTpoHCTBa. 31'0 03Ha':laJIO HCnOJIb30BaHHe npe06paJOBaHHbIX KOOp.lIHHaT. B pafiore C TpeXMepHOM rpaq,HKOM MbI 6Y.lIeM HCnOJIb30BaTb aenpeotipaaoaamrsre xoopnanaru (q,Jlar D3DFVF_XYZ), H xoopznnrara Z, no CHX nop HaMH HrH0pHpyeMaSI, OKIDKeTCSI O':leHb ztaxe acnonsoyevoa.
TaK HJlH HHa':le, see ortepauan C o6'beKTaMH cuenu H caMOH cuenca 6a3HpYlOTCSI aa nOHSlTHH "uampuua". Bpauienae o6'beKTa no pa3JIH':IHbIM OCSlM, MaCWTa6Hpo-
(nasa 5. Direct3D
75
BaHHe, nepeveureuae H mo6ble ztpynre onepauaa nocrpoeuu HMeHHO Ha HHX. TaJ< ':ITO nasaare Ha':lHeM H3Y':leHHe npOCTpaHCTBeHHbIX nOCTpOeHHM C MaTpHU.
MaTpL14bl
flI06M TO':lKa npOCTpaHCTBa sanaerca TpeMJI KOOp.lll1HaTaMH (x, y, Z). Msr )!(e 6yJIeM I1CnOJIb30BaTb sanacs He 113 rpex COCTaBJIHIOlllI1X, a 113 ':IeTblpex. COOTBeTCTBeHHO, KOOp.llI1HaTa B npOCTpaHCTBe 6Y.lleT onpenensrrsca ':IeTBepKOM ':IHCeJI (x, y, z, w), me w - HeKI1H BeCOBOM K03<PtPI1Ul1eHT, na KOTOPblM nonxnsr nepevno)KaTbCH xoopnaaatsr TO':lKI1 npn npOeUl1pOBaHI1I1.
Mampul{eu pasvepa mxn Ha3blBaeTCH npnvoyronsxan Ta6JIl1ua ':Il1ceJI, KOTopaH conepxrrr m CTPOK 11 n CTOJI6UOB. lJacTHblM CJIY':IaeM MaTpI1Ubl MO)!(HO C':II1TaTb OT.lleJIbHYIO CTpOKy ':Il1ceJI I1JII1 cronfieu, Hanpuvep, BeKTOp HBJIHeTCH ':IaCTHbIM CJIy'meM MaTpl1Ubl.
Marpausr MO)!(HO YMHO)!(aTb ira ':II1CJIO, nepesnroxart, Me)!(Jly C060H H rpancnoHl1pOBaTb, MO)!(HO HaXO.llI1Tb onpenenarerrs MaTpl1Ubl 11 MaTpI1UY, 06paTHYIO I1CXO.llHOM.
CnO>KeHMe MaTpM4 M YMHO>KeHMe aa "IMCnO
Cxnansmars MaTpl1Ubl MO)!(HO TOJIbKO rorna, xorna I1X paauepsr O.llHHaKOBbl. nYCTb y Hac ecrs nse MaTpl1Ubl - A 11 B paaxrepa mxn. Marpuua C, STBJISTIOl..l.la5JCST CYMMOM 3TI1X MaTpI1U, 6Y.lIeT BbI'lI1CAATbCST no <PoPMYJIe cij ::: aij + hi), rne i =
1,2, ... , m;j= 1,2, ... , n:
[~ 5 ~ ~]+[~ ~ ~ !]=[~ ~ ~ ~].
9 3 2 6 3 3 8 2 12 6 10 8
2 5 3 1 7 9 1 9 6 12 2
Marpaua C, HBJIHIOI..l.lMCST npouaseneaaea MaTpI1Ubl A pasvepa mxn na LJI1CJIO A, 6Y.lIeT BblLJI1CJIHTbCST CJIe.nyrollll1M o6pa30M: co::: A x aij' rae j = 1, 2, ... , m; j = 1, 2, ... , n. Ilpauep:
[7 2
7x 7 5 12 6
9 6
l~ :] [:H~
12 2 63 42
63 77]
49 28
70 56 .
84 14
76
4aCTb II. DirectX Graphics
nepeMHO>KeHlIIe MaTp1ll4
MaTpMUbI MO)KHO nepeunoxars Me)f():{y c060i1 TOJ1bKO B TOM cnysae, eCJ1M '-IMCJ10 CT0J16UOB nepsoa MaTpMUbl cosnanaer C 4MCJ10M CTPOK BTOpOH. 3TO 03Haxaer, '-ITO MO)KHO nepevuoacars J1MUIb MaTpMUbl pasvepov mxn na MaTpMUbl paavepov nxk. Pe3YJ1bTaTOM raxoro YMHO)KeHMSI 6Y,UeT MaTpMua pa3MepOM mxk:
n
Cij = L ais x bsj , rne i = 1, 2, ... , m; j = 1, 2, ... , k. s=l
[lX9+2X6 :J= 3x9+4x6 5x9+6x6
lx8+2x5 lX7+2X4] [21 18 15] 3 x 8 + 4 x 5 3 x 7 + 4 x 4 = 51 44 37 .
5 x 8 + 6 x 5 5 x 7 + 6 x 4 81 70 59
Ilpnvep:
YMHO)KeHHe MaTpMU 6y,UeT MCn0J1b30BaHO HaMM B ,UaJ1bHeHUIeM npu 06be,UMHeHHM Pa3J1M'-IHbIX 3¢qleKTOB. B Ka'-IeCTBe npnvepa MO)KHO npMBeCTM O,UHOBpeMeHHoe BpaIUeHMe 06beKTa no HeCKOJ1bKHM OCSIM H era MacUITa6MpOBaHMe.
Marpnua, ace 3J1eMeHTbl KOTOPOH, KpOMe 3JIeMeHTOB rnaBHOH (xoropue SIBJISIIOTCSI e,UMHMuaMH), pasnu HYJIIO, Ha3bIBaeTCSI eOUHU'fHOii uampuueu. Ilpnvep TaKOH MaTpMUbI:
[~ ; : ~l
Ilpyroe Ha3BaHMe TIOH MaTpHUbI - uampuua uOeHmU·/HOCmu. OHa 6Y,UeT npnveHSITbCSI HaMH B ,UaJ1bHeHUIeM ,lIJISI pacxera Pa3J1H'-IHbIX npe06pa30BaHI1H .
.lI.JISI nepenoca no OCSIM x, y M Z Mbl, casro C060H, 6y,UeM TaK)Ke nOJIb30BaTbCSI MaTpl1uaMM. Marpnua nepenoca no OCM x I1MeeT CJIe,UYIOIUHH BM,U:
[~ ~ P}
{nasa 5. Direcf3D
77
Marpuua nepenoca no OCM Y BbIrJUI.llMT CJIelIYlOlUMM 06PaJOM:
[~ I ! ~l
J.1, naxoneu, MaTpMlla nepeuoca no OCM Z CJIe.llYlOlUM:
[~ ; : ~]
MO)KHO TaK)Ke npasecra npaxep H MaTpHllbl cnaura no BceM rpev OCHM O.llHOapeuenno:
[~ I n]
TaKMM 06Pa30M, nepenoc rosxa (x, y, z, w) B HOBoe nOJIO)KeHHe MO)KHO aupa- 3HTb cnenyiouursr 06pa30M: (XI, YI, ZJ, WI) = (X + Axw, Y + Bxw, z + Cxw, w) . .llaHHbIH nprrvep noxaausaer, ':!TO YMHO)KeHHe BeKTOpa KOOp.llMHaT na MaTpHllY cnsura npHBO.llHT K nepeveuienaro 06beKTa B HOBOe nOJIO)KeHMe B npocrpancrse.
no aHaJIOfHl1 C npenunyuur« npavepoa nasanre paCCMOTpHM H MaTpHllbl spalUeHIHI. Marpaua spaurenaa no OCH X aa yrOJI a Ja,UaeTCSI cnenyrouurv 06pa30M:
[~ c~~" s:" ~].
o =sm u cos o 0
o 0 0 1
.nJIH nosopora na yron 13 soxpyr OCM y HaM nOTpe6YeTCH cnenyrouiaa MaTpHua:
[CO; 13 ~ -s~n 13 ~]
sin 13 0 cos 13 O·
o 0 0 I
78
[COSY sin Y
-sin Y cosy
o 0
o 0
~ ~l·
1 0
o 1
Ii, naxoneu, nOBopOT ua yron Y soxpyr OCH Z MO)l(HO ocymecraurs npn nOMolllH 3TOH MaTpHUbl:
MaTp~4a MaCWTa6~pOBaH~fI
li3MeHeHHe MaClllTa6a npOH3BOnHTCSI npa nOMOlll11 cnenyiouren MaTpMUbI:
[n ~ ~l
3necb (1, (3 H Y - K03<P<P111meHTbI C)I(aTI1S1 B)lOJlb ocea x, Y 11 Z COOTBeTCTBeHHO.
Ii MaTpl1ua OTpa)l(eHMSI OT nJlOCKOCTM zx:
[~ -i ! ~l·
MaTp~4bl OTpa>KeH~fI
Ii nOCJlenHI1H BliJl MaTpHU npeoopaaosanaa, KOTOPbIH Mbl paCCMOTpI1M, - 3TO MaTpl1Ubl OTpa)l(eHl1S1. Marpnua OTpa)l(eHI1S1 OT nJlOCKOCTM xy:
[~ 0 0 ~l
0
0 -1 o .
0 0 1
Orpaxeune OT nJlOCKOCTM YZ:
[-~ 0 0 ~l
1 0
0 o .
0 0 1 (nasa 5. Direct3D
79
TMnbl Ma·rpM4 Direct3D
06bl'LHO npMJIO>KeHIHI, C03,ruUOIilMe rpexvepnue cuensr, MCnOJIb3YIOT ozury M3 )lBYX HmOB nexaprossrx CMCTeM KOOp.llMHaT - JIeBOCTOpoHHlO1O (pMC. 5.10) MJIM npasocropomuoro (pMC. 5.11).
y
z
x
PMC. 5.10. neBoCTopoHHHR CL-1CTeMa KOOPAL-1HaT
y
x
z
PMC. 5.11. npaBocTopOHHHH CL-1CTeMa KOOPAL-1HaT
OCb X B 3TMX CMCTeMax nanpaanena snpaeo, OCb Y asepx, a nanpaanenne oca Z M onpenenaer TMn CMCTeMbl KOOp.lIHHaT. B Direct3D MCnOJIb3yeTcSI neBOCTopOHHSISI CMCTeMa xoopnanar.
LlnSl patiorsr C TpeXMepHoM cueaoa B nO,llCMCTeMe onpeneneusr TpM OCHOBHble rnna MaTpMu:
LJ MMpOBM MaTpMUa (World Matrix); LJ MaTpliua BMlI,a (View Matrix);
LJ MaTpMua npoexuan (Projection Matrix).
x
80
L{acTb II. Direct)( Graphics
MMPOBa5I MaTpl1ua Onl1CbIBaeT J10KaJlbHYIO .lI)ISl o60eKTa CI1CTeMY KOOp,llI1HaT. Bce onepaumr C o60eKToM, raxue KaK Macll1Ta6I1pOBaHl1e. nepeveurcnue 11 spauie, mre, 6Y,llYT <ilaKTM'-IeCKI1 np0l13BO,llI1TbCSl C MI1POBOH MaTpl1ueH o60eKTa.
Ha PI1C. 5.12 Har.lUI.UHO npencraaneasr OTH0ll1eHI1Sl Me)l()lY Ml1pOBblMI1 KOOp,llMHaTaMI1 M J10KaJlbHbIMI1 .lI)ISl KOHKPeTHOro o60eK'ra:
y
x
z
P&IIC. 5.12. Jloxansuaa KOOpAI'1HaTHaS! MOAeIlb
Marpnua anna COOTBeTCTByeT sarnany Ha6J1IO,llaTeJTSl na cueay, a 3'[0 03Ha'-IaeT, '-ITO OHa sanaer n0311Ul11O 11 aanpaanenae npOCMOTpa (PI1C. S.13). 3TY MaTpI1UY MO)!{HO TpaHc<PoPMl1pOBaTh TO'-IHO TaK )!{e, KaK M Ml1pOBYIO MaTpl1UY - nanrars, npautars 11 T. ,ll.
y
z
P&IIC. 5.13. nOIlQ)KeHL-1e KaMepbl B npocrpaucrse
Marpnua npOeKU1111 npezmaaaascna .llJ1Sl nOCTpOeHI1Sl npOeKUMI1 TpeXMepHOM cueasr ua axpaae (PI1C. S.14). 3TO 03Ha'-IaeT, '-ITO OHa sanaer npaaana npoeunpoBaHI1Sl, raxue KaK MeCTOn0J10)!{eHl1e nepennea 11 3a,llHeH nJ10CKOCTI1 OTCe'-IeHI1Sl 11 nepcnexraaa.
(nasa 5. Direct3D
81
3aAH~~ orcesaouiaa nIlOCKOCTb
BI1AI-1Ma~ 06IlaCTb
PMC. 5.14. 06beKTbI nonaaaior Ha 3KpaH, TOIlbKO HaxOA51Cb B BL-1A1'1MOL;1 06IlaCTL-1
<J)YHK4~n1 Direct3D
AllH pa60·rbl c MaTp~4aM~
Panee MbI C BaMH yxe roOOPHJIH, ruIH qero npezntasuavensr MaTpl1I..{bI, H KaKl1e I1X THnbI 6bIBaIOT. Teneps nputuno BpeW! rtoroaopirn, 0 <PYHKUWIX lUIH pa60ThI C MaTpHuaMH. Ilaxer 6H6JIHOTeK D3DX COJlep)KHT Ha60p <PYHKUHH BHJla D3DXMatrixXXX, xoropsre CHJIbHO ynpouiaror )KH3Hb nporpasoracry, MbI pacCMOTPHM nexoropue H3 3THX <PYHKUHM 60JIee JleTaJIbHO.
I1TaK, Mbl )!)ICe ynoMHHaJIH 0 CJIeJlYIOIUHX onepauasx:
LJ CJlBHr;
D spaureuae;
LJ MaClllTa6HpOBaHHe; LJ OTpa)KeHHe .
.lI.JIH Ka}KJlOH H3 3THX onepauan HMelOTCH COOTBeTCTBYIOIUHe <PYHKUHH.
82
'-IacTb II. DirectX. Graphics
OnepaUHSI C.llBI11d:
function D3DXMatrixTranslation( out mOut: TD3DXMatrix;
x,
y,
z: Single):
PD3DXMatrix; stdcall; external d3dx9mathDLL:
3.lleCb:
a mOut - pe3YJ1bTl1pYlOlUaSl MaTpliUa;
a x, y, z - cooTBeTCTBYlOll[He KOOp.llI1HaTbI cMellleHI1S1.
Bpauienae no OC}IM x, y 11 Z oCYllleCTBJ1S1eTCSI npu nOMOml1 psna MeTO.llOB. Bpauiemre no OCI1 x:
function D3DXMatrixRotationX( out mOut: TD3DXMatrix: angle: Single):
PD3DXMatrix; stdcall; external d3dx9mathDLL:
3.lleCb:
a mOut - peaynsrapyiouras MaTpI1Ua; a angle - yron nosopora. Bpaureaue no OCI1 y:
function D3DXMatrixRotationY( out mOut: TD3DXMatrix; angle: Single):
PD3DXMatrix: stdcall; external d3dx9mathDLL;
Bpautemre no OCI1 z
function D3DXMatrixRotationZ( out mOut: TD3DXMatrix; angle: Single):
PD3DXMatrix; stdcall; external d3dx9mathDLL;
31'11 TpI1 tPYHKUl111 I1MelOT O.llI1HaKOBble napaverpu - peaynsrapyioutyto MaTpHUY 11 yron nOBOpOTa.
,llrr}I MaCIllTa6I1pOBaHI1S1 npenaaaaaxea CJ1e.llYJOlllI1H MeTO.ll: function D3DXMatrixScaling(
out rnOut: TD3DXMatrix;
(nasa 5. Direct3D
83
sx,
sy,
sz: Single):
PD3DXMatrix; stdcall; external d3dx9mathDLL;
3neCb:
o mOut - pe3YJlbTMpYlOma51 MaTpl1Ua;
o sx, sy, sz - K03CPCPMUMeHTbI C)I(aTMSl no COOTBeTCTBYlOlllMM OCSlM. Orpaxenae ocyutecranaerca CPYHKUMeit
function D3DXMatrixReflect(
out mOut: TD3DXMatrix; const Plane: TD3DXPlane):
PD3DXMatrix; stdcall; external d3dx9mathDLL;
3neCb:
o mOut - pe3YJlbTl1PYIOlllaSi MaTpl1ua;
CI Plane. - crpyxrypa TD3DXPlane, ornrcsraatouiax nnau. CTPYKTYpa l1MeeT cnenyrouuo; BMn:
TD3DXPlane = record
a, b, c, d: Single; end;
Ilapaverpsr a, b, c 11 d 3TOti CTDYKTYPbl COCTaBJlSlIOT ypasnenae nJlOCKOCTM:
ax + by + cz + dw = O.
11 nocnennas onepanua C MaTpMuaMl1, KOTOpylO MbI cea-rac paCCMOTpMM, - 3T0 nepenaoxenae MaTpl1U:
function D3DXMatrixMultiply(
out mOut: TD3DXMatrix; const mI, m2: TD3DXMatrix):
PD3DXMatrix; stdcall; external d3dx9mathDLL;
3neCb:
a mOut - pe3YJlbTMpYIOmaSi Ma1pMua; amI, m2 - nepeMHO)l(aeMble MaTpMUbI.
Erue HeCKOJlbKO MeTOnOB 1I)1Sl patiorsi C MaTpMUaMl1 fiyner paCCMOTpeHO nanee B nponecce M3Y'-leHMSl MarepMaJIa.
84
LJacTb II. Direct)( Graphic
HopManM
Kaxnas nOBepXHOCTb B Direct3D HMeeT nepneHlIHKYJlSlPHblM BeKTOp, KOTOPbl Ha3blBaeTCSI HOPMaAblO (pHC. 5.15). Hartpaanemre HopMarrH onpenenserca 0PHenraunea CHCTeMbI KOOPlIHHaT (JleBOCTOpOHHSISI CHCTeMa xoopnanar HJlH rtpa BOCTOpOHHSlSI) H HanpaBJIeHHeM ofixona aepunrn (no 'laCOBOM crpenxe JlH6 npOTHB nee).
P",c. 5.15. Hopeaans
BepW~Hbl
no YMOJl'laHHIO na cueae npopHCOBblBaeTCSI TOJlbKO nepelIHSISI cropona npHMH THBa. <DaKTH'leCKH ra, 'lbH aepunrnu saaaasr B nopaaxe 06XOlIa no 'laCOBO crpenxe,
P",c. 5.16. BepWL-1HHble HOPMaflL-1
Ho MbI MO}l{eM H caMH yrtpaansrn, pe}l{HMOM oT06pa)!(eHHSI CTOPOH npHMI1THBa 3a,uaB pe}l{HM D3DRS _ CULLMODE MeTo)J.oM IDirect3DDevice9. SetRenderState:
o D3DCULL_NONE - He 06pa6aTbiBaTb 3anHIOIO rpans. 3TO oaaasaer, 'lTO 3anHJUI CTopOHa npHMHTHBa 6Y)J.eT scerna oT06pa)!(aTbCSI na sxpaae;
(naaa 5. Direct3D
85
CJ D3DCULL_CW - sannue rpaau l1Jlyr no 'laCOBOM crpenxe;
CJ D3 DCULL _ CCW - 3a;J,Hl1e rpann l1Jlyr npOTI1B 'laCOBOM CTpeJ1Kl1.
HopMaJ111 I1Cn0J1b3YIOTCH T8lOKe npn 3aTeHeHl111 npl1MI1TI1BOB no MeTO.llY Iypo, pac sera OCBell[eHHOCTI1 11 HaJ10)l(eHI1H rexcrypu. Ll,JIH sroro ~e npI1MeH5IIOTCH Bepllll1HHble HOPMaJ111 (pnc. 5.(6).
OT TeOpMM K npaxraxe
BCnOMHI1M nOCJTe.llHJ1H pa306paHHbIH HaMI1 npnvep. TaM MbI PI1COBaJ111 npavoyronsmnc Ha axpane. Ilasaare reneps Hapl1cyeM TOT xe CaMbl" npHMoyroJlbHI1K, TOJIbKO B npOCTpaHCTBe.
)1JTH I1Cn0J1b30BaHJ1H HeTpaHC¢OpMl1pOBaHHbIX aepurun MbI .llOJ1)1(Hbl npl1MeHI1Tb Clle.llYIOll[I1H I1X ¢opMaT:
D3DFVF_CUSTOMVERTEX = D3DFVF_XYZ or D3DFVF_DIFFUSE;
Ilpa I1Hl1Ul1aJIl13aUl1l1 nOlICI1CTeMbI MbI 3a)laeM pe)l(HM o6pa6OTKl1 3a;J,HI1X rpaneii H OTKJlIO'laeM ocsemenae CUeHbI:
II BKITOQaeM pe~ o6pa6oTKM rpaHeM
FD3DDevice. SetRenderState (D3DRS_CULLMODE, D3DCULL_NONE);
I I OTKITOQa€M OCB~eJ-Il1e cueasr FD3DDevice.SetRenderState(D3DRS_LIGHTING, 0);
CJlelIYIOll[I1M uiarov MbI .llOJl)l(HbI HaCTpOHTb cnocof npOCMOTpa cuensr, T. e. HaCTPQI1Tb MaTp"UY Bl1lIa I1 MaTpHUY npOeKUI1H. Ml1pOBaH MaTpHua HaM noxa He nOHa;J,06HTCH. Bee He06xo.llHMble HaCTpOHKI1 MbI 6YlIeM np0l13BOlIl1Tb B MeTO.lle SetupCamera (J1I1CTI1Hr 5.16).
{*********************************************************************}
**)
{*********************************************************************}
function TMainForm.SetupCamera: HResult;
var
ViewMatrix: TD3DMatrix; ProjectionMatrix: TD3DMatrix; Eye: TD3DVector;
86
At: TD3DVectori Up: TD3DVectori
begin
II BeKTop, onpenen~WM~ nonO~eHMe rna3 Ha6nIDnaTenR Eye.x := Oi Eye.y := Oi Eye.z := -3i
II HanpaBneHMe KaMep~
At.x := 0; At.y:= 0; At.z:= 0;
II BeKTop, onpenen~WM~ HanpaBneHMe Bepxa MMpOB~ KOOpnMHaT. II ~HO MMeeT 3Ha~eHMe (0, 1, 0).
up.x := 0; Up.y:= 1; Up.z·= 0;
I I CTPOMM rreeocs-opoaazso MaTpm~ BMna D3DXMatrixLookAtLH(ViewMatrix, Eye, At, Up);
II YCTaHaBnMBaeM MaTPM~ BMna FD3DDevice.SetTransfor:m(D3DTS_VIEW, ViewMatrix)i
II CTPOMM neBocTopOHHID~ MaTPHUY npoeKUMM D3DXMatrixPerspectiveFovLH(ProjectionMatrix, D3DX PI I 4, 1, 1, 100); II YCTaHaBnMBaeM MaTPM~Y npoeKUUM
Result '= FD3DDevice.SetTransfor:m(D3DTS_PROJECTION, ProjectionMatrix);
31IeCb:
D mOut - peaynsrupyiouraa MaTpliUa;
D Eye - BeKTOp, onpenenstourafi nonoxemre fJIa3 Ha611lOlIaTeJISI; D At - uanpaanenae KaMepbl;
D Up - BeKTOP, onpenensnounrn nanpaaneaue aepxa Ml1POBblX KOOplIl1HaT. 06bl'lHO l1MeeT 3Ha'leHl1e (0, 1,0).
end;
MeTOlIbI lIaHHoH npouenypu 3aCllY)l{HBalOT ornensnoro paCCMOTpeHHSI. MeTOlI - 31'0 nOCTpOeHl1e xeaocropounen MaTpl1Ubl BHlIa:
function D3DXMatrixLookAtLH(
out mOut: TD3DXMatrix;
const Eye, At, Up: TD3DXVector3):
PD3DXMatrix; stdcall; external d3dx9mathDLL;
(naBa 5. Direct3D
87
Oocne nOCTpOeHl1Sl }laHHOM MaTp"Ubl MbI }lOJDKHbl ee YCTaHOBl1Tb MeTO}lOM IDirect3DDevice9.SetTransform:
function SetTransform(
State: TD3DTransformStateType; const pMatrix: TD3DMatrix):
HResult; stdcall;
3}lecb:
o State - nepeveanas, onpenenmouras o6neKT 113MeHeHl1Sl. MO)l(eT npl1HI1- MaTb O}lHO 113 cnenytotuax 3HalJeHl1M:
• D3DTS_VIEW - MaTpl1Ua Bl1}la;
• D3DTS_PROJECTION - MaTpl1ua npoeKUI1I1;
• D3DTS_TEXTUREO, ... , D3DTS_TEXTURE7 l1}leHTI1IPI1Ul1pyeT MaTpHUY llJISl
TeKCTypbI.
111160 l1CnOJ1b3yeTcSl MaKpOC D3DTS_WORLDMATRIX;
o pMa t r i.x - CTpYKTYpa. onacusarouran TeKYIUee 113MeHeHl1e. Marpuua npoexuan CTPOl1TCSl MeTOlIOM D3DXMatrixPerspectiveFovLH: function D3DXMatrixPerspectiveFovLH(
out mOUt: TD3DXMatrix; flovy,
aspect,
zn,
zf: Single):
PD3DXMatrix; stdcall; external d3dx9mathDLL;
3L{eCb:
CJ mOut - pesynsrapyroutaa MaTpl1ua; CJ flovy - yron 0630pa B PaJIl1aHaX;
CJ aspect - OTHOll1eHl1e llJIl1HbI K BbICOTe;
CJ zn - orcesemre no OCl1 Z ua nepeztaev nnane; CJ zf - OTCelJeHHe no OCl1 Z na 3aJIHeM nnane,
Ilocne HaCTpOMKl1 napaverpoa npOCMOTpa cueHbl MbI }lOJl)KHbI onpenemrn- Ha- 60p BepIUl1H (nl1CTl1Hr 5.17).
88
{*********************************************************************}
{** nO~rOTOBKa Ha60pa BepillMH
{*********************************************************************}
function TMainForm.prepareVertices: HResult;
const
Vertices: array[O .. 5] of TCustamvertex = (
(x: -1; y: 1; z: 0; color: $OOFFOOOO) ,
(x: 1; y: 1; z: 0; color: $OOFFOOOO) ,
(x: 1; y: -1; z: 0; color: $OOFFOOOO) ,
(x : 1; y: -1; z: 0; color: $OOFFOOOO) ,
(x: -1; y: -1; z: 0; color: $OOFFOOOO) ,
(x: -1; y: 1; z: 0; color: $OOFFOOOO)
) ;
var
pVertices: pointer;
begin
II C03~aeM oycl>ep BepillMH Result := FD3DDevice.CreateVertexBuffer(SizeOf(Vertices), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, FD3DVertexBuffer, NIL);
II ITPM HeB03MO~OCTM C03~HMR 3aBepmaeM paOOTY if FAILED(Result) then EXIT;
try
I I KonMpYeM B 6ycl>ep naaaue
CopyMemory(pVertices, @Vertices, SizeOf(Vertices)); finally
II Eno~pyeM ~ocTyn K oycl>epy BepillMH
Result := FD3DVertexBuffer.Lock(O, SizeOf(Vertices), pVertices, 0);
if FAILED(Result) then EXIT;
(J1asa 5. Direct3D
B9
II Pa36noKMpOBKa 6y~pa FD3DVertexBuffer.Unlock;
end;
end;
Haw npavoyronsmo; 6YlleT no-npexnevy COCTOSITh 113 llBYX TpeyrOJIhHI1KOB. 06paTI1Te BHI1MaHl1e, xaxae 113MeHeHI1SI np0I130WJlI1 B KOOplll1HaTaX BepWI1H - y Hac nOSlBI1JlI1Cb orpauarensnste KOOplll1,HaTbI, T. K. uerrrp oceti KOOPlll1HaT HaXOlll1TCSI B uempe sxpana,
Dpl1Mep 113 KaTaJIOra Example_l3 HamSiLlHO HaM nee lleMOHCTpl1PYeT (pac, 5.17).
Plo1C. 5.17. IlPflMoyroflbHItIK B npOCTpaHCTBe
Ky6
HaY'lI1JlI1Cb CTPOI1Tb xsanpar - nasaare YCJIO)l(HI1M 3a,ua'lY 11 nOCTpOI1M KY6. KaK 113BeCTHO, Ky6 COCTOI1T 113 6 rpaaea, Ka)l(JlaH 113 KOTOPblX fiyner COCTOSlTb y Hac, B CBOIO osepens, 113 nsyx TpeyroJlbHI1KOB. COOTBeTCTBeHHO, y Hac nOJIY'laeTCSI 12 npI1MI1TI1BOB. Ilpouenypa nOnrOTOBKI1 Ha60pa BePWI1H 6YneT TaKoH, KaK npenCTaBJIeHO B JII1CTI1Hre 5.18.
4 3aK. 339
{*********************************************************************}
{** nOArOTOBKa Ha60pa BeplIMH
{*********************************************************************}
function TMainForm.PrepareVertices: HResult;
canst
Vertices: array[O .. 35] of TCustomVertex = (
i
(x: -1; y: 1; z: -1; color: $OOFFOOFF) ,
(x : 1; y: 1; z: -1; color: $OOFFOOFF) ,
(x: 1; y: -1; z: -1; color: $OOFFOOFF) ,
(x : 1; y: -1; z: -1; color: $OOFFOOFF) ,
(x : -1; y: -1; z: -Ii color: $OOFFOOFF) ,
(x : -1; y: 1; z: -1; color: $OOFFOOFF) ,
(x: -1; y: 1; z: 1; color: $OOFFOOFF) ,
(x : -1; y: Ii z: -Ii color: $OOFFOOFF) ,
(x: -Ii y: -Ii z: -Ii color: $OOFFOOFF) ,
(x : -1; y: -Ii z: -Ii color: $OOFFOOFF) ,
(x : -1; y: -1; z: 1; color: $OOFFOOFF) ,
(x: -1; y: Ii z: Ii color: $OOFFOOFF),
(x: Ii y: Ii z: Ii color: $OOFFOOFF) ,
(x: -1; y: Ii z: Ii color: $OOFFOOFF) ,
(x: -1; y: -li z: 1; color: $OOFFOOFF) ,
(x: -li y: -Ii z: Ii color: $OOFFOOFF) ,
(x : Ii y: -1; z: Ii color: $OOFFOOFF) ,
(x: 1; y: Ii z: 1; color: $OOFFOOFF) ,
(x : 1; y: Ii z: -1; color: $OOFFOOFF) ,
(x : 1; y: 1; z: Ii color: $OOFFOOFF) ,
(x : Ii y: -Ii z: Ii color: $OOFFOOFF) ,
(x: 1; y: -Ii z: Ii color: $OOFFOOFF) ,
(x : 1; y: -1; z: -1; color: $OOFFOOFF) ,
(x: 1; y: 1; z: -Ii color: $OOFFOOFF) , (naBa 5. Direct3D 91
(x : -1; y: Ii z: 1; color: $OOFFOOFF) ,
(x: 1; y: Ii z: Ii color: $OOFFOOFF) ,
(x : 1; y: 1; z: -Ii color: $OOFFOOFF) ,
(x: Ii y: Ii z: -1; color: $OOFFOOFF) ,
(x : -1; y: Ii z: -Ii color: $OOFFOOFF) ,
(x: -Ii y: Ii z: 1; color: $OOFFOOFF) , (x : -1; y: -1; z: Ii color: $OOFFOOFF) ,
(x: -1; y: -1; z: -1; color: $OOFFOOFF) ,
(x: 1; y: -1; z: -1; color: $OOFFOOFF) ,
(x : Ii y: -1; z: -Ii color: $OOFFOOFF) ,
(x: Ii y: -Ii z: 1; color: $OOFFOOFF) ,
(x: -1; y: -1; z: Ii color: $OOFFOOFF)
) i
var
pVertices: pointer;
begin
II C03.D:aeM e5y<PeP BeplID1H Result := FD3DDevice.CreateVertexBuffer(SizeOf(Vertices), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, FD3DVertexBuffer, NIL);
1/ rrp~ HeB03MO~OCTM C03.D:aHHR 3aBepmaeM pa60TY if FAILED(Result) then EXITi
II 6noKHPYeM .D:ocTYTI ~ e5y<PePY Bep~H
Result := FD3DVertexBuffer.Lock(0, SizeOf(Vertices), pVertices, 0);
if FAILED(Result) then EXITi
try
II Kon~pyeM B e5y<PeP .D:aHHhle
CopyMemory(pVertices, @Vertices, SizeOf(Vertices»; finally
II Pa36nOKMpOB~a 6y~epa FD3DVertexBuffer.Unlock; end;
end;