Start på OpenGL

Tags:    c++
Skrevet af Bruger #1615 @ 20.04.2003
I denne artikel vil vi se på hvordan vi laver vores første OpenGL-prpgram i Windows. Artiklen henvender sig mest til brugere af Dev-C++, så hvis du ikke har den installeret, vil jeg anbefale dig at tage et smut ind på www.bloodshed.net og hente den nyeste version.

Opsætning


Opret et nyt projekt ved at gå ind i Files -> New -> Project... og vælg derefter Windows Application. Slet derefter al kode der måtte fremkomme i main.cpp eftersom vi vil starte helt fra bunden :)

Gå nu ind i Project -> Project Options og tilføj følgende under linker/library feltet:
-lopengl32 -lglu32
Klik derefter på OK og gem dit projekt.

Så koder vi



Start med at tilføje følgende kode, hvor vi beskriver hvilke funktioner vi
vil bruge:

Fold kodeboks ind/udKode 


Det er nu tid til at oprette vinduet. Det gør vi med følgende kode:


Fold kodeboks ind/udKode 


OpenGL



Nu vil vi igang med at kode noget OpenGL.
Først vil jeg lige fortælle lidt om grundprincipperne i OpenGL:
Alle farver defineres med RGB (Red, Green, Blue). RGB-værdierne er altid af
typen float. Hvis vi nu skriver glClearColor(0.0f,0.0f,1.0f,0.0f) får vi en klar blå farve.

Koordinatsystemet


Koordinatsystemet i OpenGL er opbygget således, at et punkt i bunden af skærmen er en negativ værdi, hvor et punkt øverst er en positiv værdi. Dette inkludere også, at jo dybere ind i skærmen et punkt er, desto lavere bliver værdien, hvilket betyder, at punktet 0.0f,0.0f,1.0f altså befinder sig foran skærmen, hvor -1.0f ved z-værdien befinder sig "inde i" skærmen.
Grunden til at vi bruger 0.0f og ikke bare 0 er, at vi i OpenGL har muligheden for at specificere yderligere og mere præcis hvor hvores koordinat skal ligge.
Kun skærmopløsningen sætter grænsen for hvor præcis dine koordinater er.
1.0f betyder, at koordinatet er rykket 1 enhed. Men du kan også vælge en halv enhed, ved 0.5f eller 0.4f osv.
f'et indikerer, at det er af typen float.

Tegne figurer


Inden man begynder at tegne objekter, skal man fortælle OpenGL hvad vi vil tegne, f.eks. om det skal være en trekant eller en firkant. Dette gøres med
glBegin() og glEnd() hvor der i glBegin defineres hvad vi vil tegne. glBegin(GL_QUADS) fortæller OpenGL at vi vil tegne et kvadrat.
glVertex3f() bruges til at tegne punkterne.
Når man er færdig med at tegne, kalder man altid funktionen SwapBuffers.
Årsagen til, at vi tegner i en buffer og ikke direkte på skærmen, er fordi vi ikke ønsker at brugeren skal se selve tegne-processen, men kun det færdige resultat, hvilket altså bliver kaldt med SwapBuffers. hDC definerer en Device Context.

Fold kodeboks ind/udKode 


Håndtering af messages


Som jeg skrev før i en kommentar i source-koden da vi lavede lidt Windows-programmering, så skal vi kunne sende messages til Windows for at kunne håndtere lukning af vinduet, tastetur, mus etc. Så hvis du engang skal gøre det muligt at bruge mus/tastetur i dine OpenGL-programmer (eller i andre Windows-programmer for den sags skyld) så er det i følgende procedure det gøres (efter case WM_KEYDOWN):

Fold kodeboks ind/udKode 


Gør OpenGL tilgængelig


Så skal vi til at lave en procedure til at gøre OpenGL tilgengængelig for vores program. Det er i en denne funktion vi får fat på vores device -og render context samt pixel format. Vi har valgt at bruge 24 bits farver og 16 bits dybde.

Fold kodeboks ind/udKode 


Oprydningen


Som førnævnt, skulle vi lukke ned for OpenGL med proceduren DisableOpenGL().
Det gør vi, fordi vi ikke ønsker at OpenGL skal ligge og fylde i RAM'en efter programmet er lukket ned. DisableOpenGL-proceduren laves her:

Fold kodeboks ind/udKode 


Prøv nu at compile dit projekt (gøres med CTRL+F9) og kør programmet. Du skulle nu gerne have en hvid firkant til at vise sig på skærmen.

Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (27)

User
Bruger #1615 @ 21.04.03 09:55
Lidt feedback ville være nice :)
User
Bruger #2959 @ 21.04.03 19:05
Din artikel er en stor hjælp for en nybegynder, for du fortæller meget grundigt. Men du bruger helt andre ting, end dem jeg har lært, og det forvirre mig en lille smule. Men det kan du jo ikke gøre for :). Ellers meget nice artikel, og venter på den næste....
User
Bruger #2193 @ 22.04.03 19:51
Kikkede lige lidt igennem, og bare en detalje som sprang i öjnene i en ellers rigtig god artikel.
"DisableOpenGL" ?!?
Du mener vel "FreeOpenGL", for du disabler jo ikke for andre end dig selv.
Er free ikke god nok for dig, så må det være Destroy .. for du disabler vel ikke toolSættet/Ram, men befrierdet eller ödelægger/nedlægger objecterne eller hvad det nu var.
Ellers sikkert rigtig god artikel ;)
User
Bruger #1615 @ 22.04.03 20:28
Objekterne fylder stadig i RAM'en. Hvis disse bliver disabled, fylder de ikke længere i RAM'en.
User
Bruger #2959 @ 16.05.03 14:23
Hvornår kommer der en artikel til?
User
Bruger #2614 @ 17.05.03 18:35
GL_QUADS er da ikke til at lave kvadrater med. Et kvadrat er et rektangel med fire lige lange sider. Så "rektangel" ville nok være mere passende. Ellers god artikel for nybegyndere som ikke ved hvor de skal starte. :)
User
Bruger #4007 @ 30.05.03 12:10
Lav indryk i din kode, det der er totalt ulæseligt. ubruglige kommentarer, eller rettere sagt ikke forklarende nok. forklarer ikke så meget om opengl, du skulle måske hellere give eksempler på brug af opengl bibliotekets funktioener, effekter, forklare hvad forskellen på GL_QUADS, GL_TRIANGLES, GL_TRIANGLE_STRIP etc etc er, det ville nok komme folk mere til gode.
User
Bruger #2438 @ 02.06.03 15:52
RENE: "GL_QUADS er da ikke til at lave kvadrater med. Et kvadrat er et rektangel med fire lige lange sider. Så "rektangel" ville nok være mere passende. Ellers god artikel for nybegyndere som ikke ved hvor de skal starte. :)" --- Den kan sgu da godt tegne andet end rektangler! Quad kommer af ordet quadrilateral, som betyder firkant.
User
Bruger #3966 @ 05.06.03 13:29
Some facts:
-Et rektangel er en firkant.
-Et kvadrat er både et rektangel og en firkant.
-En firkant har fire hjørner.
-I et rektangel er siderne to og to lige lange, og alle vinkler er rette
-Et kvadrat er et rektangel med fire lige store sider.

//Jakob (pcnoerd)
User
Bruger #4120 @ 23.06.03 19:12
Konklusion: Man anvender GL_QUAD til at tegne firkanter, dvs. ikke kun rektangler og kvadrater, men også firkanter med skæve vinkler.

//Mikkel (grafikprogrammerings-noerd)
User
Bruger #4819 @ 06.12.03 18:49
cult da
User
Bruger #2855 @ 24.12.03 08:13
Total ude mærket artikel, men jeg syntes det er lidt mærkelig at der et par artikler om at starte på det. Der er bare ingen der går videre fra det punkt jeg står nu!!!
mne ellers total god artikel :D
User
Bruger #3897 @ 27.12.03 14:13
god artikel som giver et grundlæggende intryk at OpenGL i C++
men er lidt for simpel. 4 fra mig
User
Bruger #2695 @ 05.01.04 12:00
Citat: "Et rektangel er en firkant"
Hmm...ikke helt. Et rektangel er en firkant hvor alle kanter har en vinkel på 90 grader.
User
Bruger #4882 @ 08.01.04 14:39
Det der med at lænke til andre filer er da noget underligt noget og jeg kunne overhovedet ikke finde ud af det istarten da mit dev-c++ er sat til dansk og der er en der hedder filer/kataloger som jeg troede det var
til andre der har den danske version:
gå ind i parameter i projekt indstillinger og så der hvor der står linker skal i tilføje teksten
User
Bruger #4479 @ 17.01.04 09:37
Det virker ikke? Man kan iverfald ikke se noget?
User
Bruger #4833 @ 16.02.04 17:55
min compiller siger at der er 12 fejl
User
Bruger #5846 @ 22.05.04 12:54
Jeg fatter sQ bjælde af det her...
User
Bruger #1870 @ 21.06.04 11:46
hmmm den giver 10 fejl hos mig :S
User
Bruger #1870 @ 21.06.04 11:46
glemte lige at skrive dem ;)

--------------------Configuration: Cpp1 - Win32 Debug--------------------
Linking...
Cpp1.obj : error LNK2001: unresolved external symbol __imp__glEnd@0
Cpp1.obj : error LNK2001: unresolved external symbol __imp__glVertex3f@12
Cpp1.obj : error LNK2001: unresolved external symbol __imp__glBegin@4
Cpp1.obj : error LNK2001: unresolved external symbol __imp__glClear@4
Cpp1.obj : error LNK2001: unresolved external symbol __imp__glClearColor@16
Cpp1.obj : error LNK2001: unresolved external symbol __imp__wglMakeCurrent@8
Cpp1.obj : error LNK2001: unresolved external symbol __imp__wglCreateContext@4
Cpp1.obj : error LNK2001: unresolved external symbol __imp__wglDeleteContext@4
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/Cpp1.exe : fatal error LNK1120: 9 unresolved externals
Error executing link.exe.

Cpp1.exe - 10 error(s), 0 warning(s)
User
Bruger #5847 @ 01.08.04 16:41
Bjarke S:

prøv at skrive:
#pragma comment(lib, "OpenGL32.lib")
lige under dine #includes
så skulle de gerne funke
User
Bruger #5097 @ 27.03.05 15:22
Køre Cev-c++ i dansk version...

hvad skal jeg gøre her når det er på dansk:

Opret et nyt projekt ved at gå ind i Files -> New -> Project... og vælg derefter Windows Application. Slet derefter al kode der måtte fremkomme i main.cpp eftersom vi vil starte helt fra bunden :)

Gå nu ind i Project -> Project Options og tilføj følgende under linker/library feltet:
-lopengl32 -lglu32
Klik derefter på OK og gem dit projekt.

he he... Og -lopengl32 -lglu32 skrives vær for sig? :D
User
Bruger #4414 @ 09.02.06 02:58
har samme problem som ovenstående, fatter ikke en bregne...
User
Bruger #9421 @ 26.05.06 16:43
Hvordan kommer man videre med opengl? ER ny i det såå ikke alt for svært:)
User
Bruger #10281 @ 05.03.07 16:41
Jeg synes det er nice nok med en opengl artikel. Jeg synes bare det er synd at du trækker så meget windows API med ind i det :S Jeg ville klart gerne have set en artikel der klarer sig uden da der ville være mindre kode og mere portabilitet.. Men ellers nice ide - sad lige og kiggede igennem efter en, for ellers ville jeg have skrevet en ;) Men det bør jeg nok lade folk der kan finde ud af det om... Good work
User
Bruger #11328 @ 06.07.07 11:32
det virker jo IKKE!!
for den her fejlmeddelese:
Warning: no newline at end of file.

og jeg har sq heller ingen ny linje!?!
jeg har skrevet:
1. kodeblok ind,
2.kodeblok ind
og tenefigurer blokken ind...!


jeg bruger Code::Blocks, for jeg synes at det klart er det bedste, der skal man vel bare lave et nyt project Opengl application ikk?

User
Bruger #8985 @ 24.07.07 23:51
Warning: no newline at end of file.

og jeg har sq heller ingen ny linje!?!

hahaha ... Det betyder jo netop, du skal have en ny linie. Men jeg tvivler stærkt på, det er fejlen. Måske mangler du at linke med et eller andet? Måske kan den ikke læse gl/gl? Måske har du udført en forkert handling med programmet?

Som det tydelig er forklaret i starten af artiklen, skal der oprettes en windows application, (i codeblocks hedder den vist GUI application). Hvorfor vælger du så en opengl application? Der er sikkert ikke forskel, udover den genererede kode, men når forfatteren nu siger, du skal vælge en window application? Har du mon gået artiklen grundigt nok igennem? hmm...
Du skal være logget ind for at skrive en kommentar.
t