Lad os sætte nogle ting helt fast inden vi begynder med kode eksempler osv.
For at kunne programmere hurtige og effektive 3D spil på en PC, kræves der en vigtig grundlæggende element, nemlig, en kompiler. En kompiler er et stykke software der kan "kompile" et menneske-venligt sprog, så som Delphi, til maskinkode. Maskinkode er det eneste sprog der kan forståes af cpu'en. Det bliver defor kaldt for det første sprog. Da det er svært at overskue maskinkode, har man i sin tid udviklet et andet sprog kaldet, Assembler. Assembler bliver stadig flittigt brugt i dag, dog mest i mere avancerede situationer, så som spil udvikling. Alle kompiler kan forstå Assembler, da den er ledet mellem dit tredje sprog (Delphi, C#, eller C++) og maskinkode. Så når vi siger at noget Delphi kode bliver "kompilet", betyder det at vores kode bliver omkodet til Assembler for dernæst at blive videre omkodet til maskinkode.
I bund og grund gør det derfor ligemeget om man udvikler sine 3D spil i Delphi, C#, C++ eller "rent" Assembler (Sprog som Java og Visual Basic er ikke kompiler sprog!). Men da 3D udvikling er ret omfattende kan det lette arbejdet meget, hvis man skriver det i et objekt-orienteret sprog. Da kun Delphi og C++ er objekt-orienteret vil det være meget oplagt at vælge et af disse to sprog. Da jeg altid har kunnet lide Delphi's (Pascal) syntaxer, har jeg derfor valgt Delphi.
Et objekt-orienteret sprog kræver tre facileter: Arv, Indkapsling og Polymorfi. Disse er grunden til at vi kan arbejde med records, objects og klasser. Alt det vil vi se nærmere på i kommende kode eksempler. Det er vigtig at man kender sin kompiler og sine syntaxer rigtigt godt, inden man begynder at programmere et spil. Alt så som arrays og pointers og de før omtalte records og klasser skal helst kunne implementeres uden de store problemer.
Hvorfor så bruge OpenGL? OpenGL er let at gå til. Du behøver kun at tilføje "OpenGL" under "uses" i din Delphi unit, og du er klar til at skrive et 3D spil. Hvorimod du skal downloade og installere en lang række komponenter (DelphiX) for at arbejde med DirectX. Desuden kan OpenGL også anvendes under Kylix (Linux versionen af Delphi) så hvis du har i sinde at dit projekt engang skal bruges til andre operative styresystemer end Windows, er det relativt let at gøre dette. OpenGL er effektiv og hurtigt (da det er hardware-accelerende) og bliver desuden anvendt i et hav af komercielle 3D spil der findes på markedet.
Alle mine eksempler er skrevet til Delphi 4, og vil derfor også kunne bruges af alle nyer versioner af Delphi.
Den OpenGL unit du tilføjer til dit projekt er en interface mellem Windows og OpenGL. Den version jeg bruger er OpenGL 1.1., så har du tænkt på at benytte nogle af mine kode eksempler til en nyer OpenGL inteface unit, kan det være nødvendigt at ændre på nogle OpenGL kald og opsætning.
Lad os snakke lidt om hvordan OpenGL er opbygget.
Alle grafikkort har sin egen selvstændige processor kaldet: GPU (Graphical Process Unit). Denne processor fungere stort set ligesom CPU'en. Så når man sætter en grafikkort i sin computer udvider man faktisk sin computer med en mindre selvstændig grafisk computer. Det er denne GPU der i sidst ende bestemmer hvor hurtig og kraftig spillet bliver. Som spiludvikler er det derfor godt at udvikle sine spil på markedets langsomste grafikkort, for at sikre sig at alle grafikkort kan være med. Derfor vil du opleve at mange fancy extensions og komprimerings funktioner, som OpenGL tilbyder de nye GeForce kort, ikke kan bruges, hvis alle skal havde en chance for at spille dit spil. Så sidder du med et gammelt TNT kort må du bestemt ikke smide den ud! Udover GPU'en råder OpenGL blandt andet over et hav af funktioner, som kan kaldes fra din applikation gennem din OpenGL interface unit. Dem vil vi komme til at stifte bekendtskab med senere. Først vil vi nemlig kigge lidt på de mange buffers som OpenGL også indeholder. OpenGL tilbyder blandt andet følgende buffers:
Denne buffer er den mest anvendte buffer af dem alle. Desuden er det den eneste "synlige" buffer. Den kan indeholde enten RGBA (Red, Green, Blue, Alpha) værdier eller Index Pixels (I alle mine eksempler bruger vi kun RGBA). I forbindelse med Color bufferen bliver en DoubleBuffer ofte omtalt. Meningen er, at der faktisk er to Color buffers. En Front og en Back buffer, hvor af det kun er Front bufferen der er synlig, men vi tegner på Back bufferen og gør den synlig ved at bytte dens content med Front bufferen via en Windows funktionen, SwapBuffers(). På den måde undgår vi den "flimmeren" der ellers vil opstå, hvis ikke vi brugte DoubleBuffer. Den omtalte DoubleBuffer må ikke forveksles med funktionen "DoubleBuffered" der findes på stort set alle visuelle komponenter i Delphi. De to funktioner har intet med hinanden at gøre! Color bufferen er defineret som gl_Color_Buffer_Bit i din OpenGL interface unit, og kan Enables/Disables via glColorMask(True, True, True, True) og glColorMask(False, False, False, False). Som default er den sat tilgængelig.
Også kaldet for Z bufferen. Denne buffer indeholder ikke farve værdier men afstanden mellem geometri og viewporten (Skærmen). Det er denne buffer OpenGL bruger til at finde ud af, hvilket grafik der skal overlappe hinanden, for at det ser korrekt ud. Depth bufferen er defineret som: gl_Depth_Buffer_Bit, og bliver Enabled/Disabled via glEnable(gl_Depth_Test) og glDisable(gl_Depth_Test).
Udover disse to nævnte buffers findes der fire andre: Stencil, Accumulation, Stereo og Auxiliary buffer. Disse vil jeg ikke beskrive, da det kun vil forvirre mere end det vil gavne!
Lad os prøve at se en grafisk illustration på, hvordan OpenGL er placeret i forhold til din Delphi applikation og Windows:
Inden vi går helt i gang, så bemærk denne artikel er kun en guide og er bestemt ikke et regelsæt. 3D udvikling er meget omfattende, så der er sjældent én vej for at komme til mål!
Kommentarer (58)
WooooW... Her kan jeg ikke sig andet en flot arbejde... Det er fandme en Nice artikel... Du har ændret 2 ting i mit liv:
1. Du har lært mig om mulighederne med OpenGL
2. Du har givet mig MEGET lyst til at prøve Delphi
Fandme en flot artikel
Den har sQ nok taget langtid om at lave men jeg har fandme fået løst til at sætte mig til OpenGL istedet at programmere programmere browsere .mm
Mange tak skal I havde...
En rigtig, rigtig god artikel. Tak for det!
Håber virklig der kommer flere artikler fra dig af med OpenGL
God, enkel og detaljeret artikel :o)
Virkelig god artikel! Håber meget på at vi snart får nogle flere af den slags - spilprogrammering må vist være noget af det mest populære man kan skrive om
. Keep up the good work!
Endnu engang mange tak for rosen! Jeg vil lige nævne at hele kildekoden jeg brugte til denne artikel, kan downloades fra min site. Det kan måske være lettere at overskue de mange procedure i en Delphi unit.
Fed artikel!!
Men jeg har et problem... Hvis jeg sætter min forms WindowState til WsMaximized bliver gulvet, loftet og vægen usynelige.. hvorfor??
Jeg har undladt at nævne det i denne artikel, Da jeg syntes den allerede fyldte ret meget. Men jeg burde nok havde inkluderet den, siden flere har spurgt mig. Det er beskrevet som det første i den NYE artikel, (som jeg er halvvejs med). Så hvis du kan leve med det indtil da
Det er helt i orden
Så øver jeg mig bare lidt mere i OpenGL i mellem tiden...
Jeg synes virkelig denne artikel er meget god! Og den fortjener virkelig at få top karakter. Jeg glæder mig til at komme videre med mit spil
Håber der snart kommer en efterfølger af dig! Bliv ved med det!
Imponerende artikel!
Præcist, hvad skal man bruge til denne her tutorial??? jeg har Delphi, men hvad ellers???
jeg er lidt af en n00b
Det er det eneste! En Delphi kompiler er såmænd nok
Det er blandt andet derfor jeg foretrækker OpenGL!
Så mangler vi bare at der er en der omskriver artiklen til os der programere c++ i borland
Kanon artikel ellers
"Jeg vil lige nævne at hele kildekoden jeg brugte til denne artikel, kan downloades fra min site. " - Hvorhenne på din side? Jeg kan ikke lige finde den...
Men, fandme en nice artikel! Hvis alle skrev sådanne artikler, havde der overhovedet ikke været behov for rating system, da alle ville ligge til et 13-tal (5-tal, men altså
)
!
Så til Søren Klit Lambæk: Godt arbejde, og bliv endelig ved med det
Sidst i artiklen er en link til den! ellers er det:
http://www.opengl-delphi.dkDet glæder mig meget at I kan bruge min artikel! Det er ikke tit man ser artikler om 3D udvikling på dansk, men nu ved jeg, at det i hvert fald IKKE er fordi, at folk ikke værdsætter det
Gerne direkte link, kan ikke lige finde kildekoden
Kunne ikke forstå et eneste ord.
Det her er det jeg ikke forstår:'
1) for ikke at hvide hvor komomenterne ligger...
2) Den første kode er et elle andet sted hvor der står type. Hvor er det...
3) Nr. 2's sted skriver du navnet på de 2 kompomenter. Kan ikke skrive det før at kompomenterne er fundet.
Resten læste jeg ikke da det ikke ville hjælpe mig.
Kan i ikke lige hjælpe mig...
Tak
Theis>> Helt ærligt så ved jeg ikke hvad du mener! Hvis du er usikker med at programmere Delphi, så vil denne artikel være en stor mundfuld for dig, så det kan være at du skal vente til du ved lidt mere om Delphi.
Jeg har i ligevel prøvet at besvare så godt jeg kunne forstå:
1-2) En Type skal selvfølig altid defineres før selve typen blive anvendt i en kodesammensætning. Præcis hvor en type skal defineres er meget afhænig af dit formål med typen. I dette eksempel ville en global definering være meget indelysende!
3) Jeg ved ikke hvad det er for nogen 2 komponenter du mener!
NB: Prøv ar være mere præcis næste gang
)
Tja...
Søren Klit Lambæk
Vis du syns at jeg skal vænte efter jeg har læst en bog på 500 sider, en anden på 200 og en 3'ge på 140 sider, vil jeg sige nej.
Jeg ved udmærket meget om delphi.
Men jeg fårstår ikke rigtigt hvor de første 2 koder skal insættes...
Der er måske ikke 2 komomenter men jeg kunne bare ikke få det til at virke...
Kan i hjælpe???????
He he det var bestemt ikke for at fornærme dig, men siden du ikke er sikker på hvor det første kode skal skrives fik jeg den opfattelse at du ikke var helt inde i Delphi - hvilket jo ville havde været en ærlig sag
Du kan downloade kildekoden fra min site:
http://www.opengl-delphi.dk/source1.zipDer vil du hurtig kunne overskue hvordan jeg har sat det sammen.
Men det gør faktisk ligemeget hvor du implementere de 2 første kode eksempler, så længe de kan identificeres af din forms OnCreate property!
NB: Desuden vil jeg sige at en bog på 500 sider, en bog på 200 og en på 140 ikke er særligt meget! Jeg har 7 x 500 siders bøger liggende omkring Delphi, og føler stadig jeg mangler at vide meget endnu!
Søren Klit.
Im sorry. Det var ikke negativt ment. Det er sådan, at jeg bare godt tror at jeg ville kunne klare det. Jeg får også somme tider hjælp af en ekspert jeg kender...
Og jo 500 side, 200, 150 er ikke helt utrolig meget. Men jeg syns dog at det er nok til dette.
Jeg syns heller ikke selv at jeg ved nok om delphi. Men dog en masse...
Jeg kigger lidt på hjemmesiden...
Kanon artikel! Det må jeg sige... Klart et 5 tal herfra! Synes der er 1 ting som er dårligt! Det er at du kun har fået 2000 UP for den! Come on Admin's, den er da mindst 10.000 værd!
Kepp Up The Good Work!!!!!
Hej Søren Klit Lambæk.
Nu prøver jeg igen efter at have kigget på noget andet.
Dog har jeg et spr. efter dine første 30 linier.
Det lyder jo let. Og jeg kan fortå at jeg bare skal skrive det der (mener det er
OpegGL i user listen.
Men da jeg læste den ble jeg usikker om der er noget kompoment der skal fides frem fra kompomentpalleten? Er der det. Der står ingen adresse så det skal i såfald ikke hentes...
Nå Men Tak
type
TContext = record
RenderContext, DeviceContext : THandle;
end;
--------
Skal denne ikke ned i vores kode der oppe vor der allerede står
type
TForm1 = class(TForm)?
Vis ja, skal jeg slætte TForm1 = class(TForm). For så vil jo den ikke starte. Det er klart?
Bleger det ikke altid at være en liste over vilke kompoments der er brugt der står der oppe?
Hvis ja, hvor ligger så de kompomenter?
Engang for ALLE! Nej, der er ikke brug for komponenter eller at installere nogen komponenter, eller hentes findes nogen frem fra komponentpanelleten, for at bruge OpenGL i mine artikler! Så er det vist sat på plads! Alt du skal gøre for at kunne benytte OpenGL kald er at tilføje "OpenGL" under uses, som jeg har nævnt op til flere gange!
Når man skriver noget under uses, linker man en unit (.pas eller .dcu) til sit projekt! Dette er ikke nogen komponent, det er bare en anden unit med noget kode!
Du må selv om hvor du definere dine typer og varianter, så længe de kan identifiseres af de forskellige procedure og funktioner der har brug for dem!
Du skal ikke på nogen måder slette din forms klasse! Hvis du gør det vil du jo ikke havde nogen form, og dermed ikke kunne se grafikken! Du skal forøvrigt slet ikke slette noget af det kode som din Delphi kompiler for-skriver for dig!
Hvilken Delphi kompiler bruger du? Jeg har hørt at der skulle være problemer med de helt nye kompiler fra Borland, da de bruger et helt nyt filsystem! Men hvis du har en kompiler fra version 7 og ned efter, skulle der ikke være nogen problemer overhovedet!
Med venlig hilsen
Søren Klit Lambæk
Tillykke.
Jeg bruger Delphi 7 Enterprice (eller hvad det hedder).
Du behøver ikke at hisse dig op. Husk på at jeg spør da jeg er en noob. Og jeg må indrømme at jeg burde kunne havde lidt mere viden om hvad du taler om, får at jeg kan arbejde med det.
Men en 13 årigs drøm er da 100% at kunne lave fede 3d spil. Så jeg kan ikke vændte.
Men vis du syns det er irrigterende at jeg spør. Så må du lade vær at svare. Som dog ikke er pænt og jeg vil heller ikke blive glad.
Men så har jeg da heller ikke spurt så meget.
Men er det så umuligt at få lavet OpenGL med mit delphi version igennem din artikel.
Så må du da lave en for de folk som ejer den nyeste version.
Ellers må jeg da købe en af de gamle.
MEN SÅ ER JEG SUR VIS DET IKKE VIRKER!!!
Den er i såfald ikke glad for den første kode...
Tag det roligt.
Hilsen Theis F. Hinz (Shafh)
Jeg har bestemt ikke hidset mig op (Så skulle du høre når jeg hidser mig rigtigt op he he...)
Jeg er ikke træt af at folk spørger og slet ikke noob, men det kan måske være lidt trættende at få samme spørgsmål igen og igen... når jeg ikke kan gøre det mere klart end - INGEN KOMPONENTER!
Nå, men nok om det!
Selvom man er 13 år skal man selvfølgelig også havde en chance for at lave sine egne 3D Spil. Denne artikel henvender sig derfor til alle uanset alder, køn og race!
Du bruger Delphi 7, og den skulle altså hvad jeg har fået fortalt virke til mine artikler. Men du kan selv tjekke det ved at se hvad efternavne dine projekt filer hedder. Hvis de enten hedder DCR, PAS eller DCU skulle der være rimlig garanti for at det virker. Men hvis du siger at mit kode ikke virker så gør den det jo selvfølgelig ikke! Jeg har aldrig haft version 7 selv (bruger den gamle version 4 standard), så jeg kan med gode grunde ikke vide det med sikkerhed!
Prøv at oprette et nyt projekt og skriv "OpenGL" under uses, uden at skrive andet. Hvis det viser sig at din kompiler allerede brokker sig der er der noget galt!
Hvis den skriver: "OpenGL.Pas unidentified" eller lign. er det fordi filen OpenGL.pas ikke ligger, hvor den skal eller slet ikke findes!
OpenGL.Pas filen er en interface til OpenGL32.DLL filen som Windows bruger til at få kontakt til dit grafikkort med. OpenGL.pas filen skulle følge med din kompiler som standard! Ellers prøv at lade Windows foretage en fil-søgning efter denne fil!
Hvis det viser sig at du ikke kan finde denne fil kan du helt sikkert downloade den fra nettet. Der findes en anden fil kaldet OpenGL12.Pas det er ikke den! Det er en nyere version, og bliver ikke brugt i mine artikler, men den kan dog fint bruges, hvis man har lidt forstand på OpenGL!
Hvis intet af dette virker, så spørg igen. Og vi vil finde ud af en anden løsning! For 3D udvikling er noget af det sjoveste der findes, og det må du ikke gå glip af, hvis du hat lyst til det!
Held og Lykke
Med venlig hilsen
Søren Klit Lambæk
Tak.
det var et dejligt svar.
Men det virker med OpenGL i user listen.
Men koderne du skriver på artiklen virker ikke...
Men mine filer er også: .dmf, .dpr og .Pas.
Jeg prøver mig at andskaffe en gratis udgave af delphi 4, 5 eller 6.
Du behøver ikke at svare.
Du har været til fantastisk hjælp, og jeg kan ikke vendte til at prøve!!!
Svare måske om en et godt stykke tid, og siger om det virker.
Du behøver ikke at skifte kompiler! Det skulle virke, jeg har fundet ud af at jeg kender en som bruger Delphi 7, og han kan sagtens kompile min artikel!
Prøv at downloade kildekoden fra artiklen!
kopiere indholdet fra .pas filen men KUN det jeg skriver i artiklen, og ikke noget af det der er pre-skrevet af Delphi! og tilføj derefter OpenGL under uses!
Så skulle det virke! Kom tilbage, hvis det ikke virker, og fortæl mig præcis det din Delphi kompiler skriver af fejlbesked!
Jeg tror grunden er at Delphi 7 bruger nogle units filer som Delphi 4 ikke behøver! Så hvis du kopiere hele min .pas fil og vil kompile det i Delphi 7, mangler den nogle af de units!
Theis tror du ikke du skulle passe lidt på med at sige at dine artiklens koder ikke virker!...
Somregl er det jo en selv som har tastet forkert...
Jeg ved godt du har læst 999999999 sider om delphi... det er også godt... men kan du bruge alt det du har lært? eller har du bare læst det?...
Jeg har arbejdet med delphi i ca. 1, 2 uger nu... sådan for sjovt.... og jeg kan sagtens få denne artikel til at virke...
jeg bruger også Delphi 7 EnterPrise...
Så der skulle ikke være noget der!
Men tænk lige en ekstre gang når du siger at en kode ikke virker!
måske er det dig som har lavet fejlen!
Til Søren.....
Damn en god artikel! kan det gøres bedre?
Jo, tak.
Men nu har jeg også fået delphi 6. Men det virker ikke.
Jeg vil meget gerne sende dig et screenshot af det. Men alt det du skriver har jeg gjordt...
Kasper Svendsen>> Mange tak
Theis>> Send mig lige din kildekode! Der må absolut være noget du helt har misforstået med denne artikel eller Delphi generalt!
Kan jeg skrive det i en mail, ellers vil det fylde total meget. Og det vil både fylde på din artikel, og gør det måske lidt ufedt. Og også da det ikke interresere andre. Kan du ikke give en mail?
Heyyyy.
Jeg har fundet ud af det sådan set.
Fedt.
Og Søren jeg må undskylde alt den tid jeg har brugt....
Har kommet langt i denne artikel (helt hen og fået lavet en firkant.¨
Men mystisk nok at efter jeg har fået lavet det første med en firkant (den der er lidt lang), og jeg bliver ved med at bruge artiklen, vil den i de næste koder i artikelen kun komme den sorte baggrund på formen nå jeg afprøver det.
Why?
Men tak...
Nu er jeg kommet længere igen.
Jeg undskylder...
Men er der en der kan forklare hvordan idle kan laves i delphi 6 og 7?
har fundet ud af det igen...
Hej Drenge og Piger,
Sidder lige en sen Lørdag nat, og prøver denne fantastiske tutorial... men der kommer et problem jeg aldrig har set før.... Jeg er nogenlunde kendt i delphi, men har lige set det her før, er nået til første compile, og så kommer fejlen: EResNotFound???
Hvad er det og hvor kommer det fra, er det en fejl i installationen af Delphi? Eller er det mig
God weekend!
HA HA typist.... havde kommet til at slette linien: {$R *.dfm}
Undskyld drenge og piger..!!!
Hav en god aften...
I lige maade... Det var da godt at du fandt ud af problemet selv!
Hejsa igen drenge og piger, hvis I bare ønsker at BitMappet skal være i det samme bibliotek som dit program (EXE fil) så skal I skrive følgende ved LoadTexture delen:
Bitmap.LoadTexture('./Gulv.Bmp');
rigtig god artikel. men jeg har et lille problem,
min væg og mit loft er helt hvidt.
Kan du hjælpe?
Hejsa Tobias... Det kan vi jo ikke ha' ;-) Send lige dit kode til min mail, og jeg vil straks se på sagen!
Søren
jeg tror jeg har løst det selv.
Hej Søren,
Virkelig god artikel, men når man nu først kigger på artiklen nu her, og egentlig gerne ville se HELE koden, som du tidligere har haft liggende på dit website, er dette jo ikke muligt. Har du mulighed for at lægge koden op på nettet igen?
Med venlig hilsen
Daniel Juhl Mogensen
Jeg har skiftet hjemmeside da jeg ikke laengere bruger Delphi som mit hovedsprog! Jeg vil proeve at finde koden frem igen og evt. uploade den til mit nye site! Jeg skriver igen naar dette er sket!
Ikke for at skynde på dig, Søren, men det burde ikke tage over et år at finde en kode frem
Thomas>> ehhh, ikke helt sikker paa hvad du mener??? Har jeg lovet noget jeg ikke har holdt?
Naa, oki nu tror jeg at jeg er med igen! He he... du mener hele kilde koden for denne artikel? Ja, det har jeg altsaa fuldstaendigt glemt drenge! Er faktisk ikke sikker paa at jeg har den laengere!
Pyt med det
Hvad er dit nye hovedsprog?
Mit hovedsprog er C/C++. Jeg bruger stadig Delphi men dog i begrænset omfang. Egenligt kan jeg godt lide begge sprog på hver deres måde. Når det kommer til stykket er de stort set meget ens! Jeg er derfor ved at udvikle en spil motor der understøtter begge sprog. Det kan være jeg en dag skriver et par artikler/tutorials om hvordan man bruger den med de forskellige programmerings sprog. Hvis du er interesseret så kig en smut forbi
http://www.pixie3d.com
Rigtig godt skrevet!!
Kunne ikke gøres bedre
Dit Pixie3D projekt ser rigtigt interessant ud, og jeg tror at jeg vil tjekke det ud
Du skal være
logget ind for at skrive en kommentar.