Základy 3D grafiky
Výukové texty
Ing Miroslav Fribert Dr.
Obsah 1. Prostorová geometrie – základní vztahy 2. Křivky 3. Plochy 4. 3D modelování a reprezentace těles 5. Geometrické transformace 6. Zobrazování prostorových dat
2
1. Geometrie v prostoru - základní vztahy V této kapitole opakujeme základní pojmy z analytické geometrie v prostoru. Jedná se o problematiku probíranou v předmětu matematika, proto bude uveden pouze přehled základních vztahů, které jsou důležité z hlediska pochopení principů vytváření 3D grafiky.
1.1 Vektory V praxi se často setkáváme s veličinami, které mají velikost a orientovaný směr (rychlost, síla). Takové veličiny nazýváme vektory a zobrazujeme je pomocí orientovaných úseček s počátečním a koncovým bodem. Rozeznáváme volné a vázané vektory. Volný vektor je umístěn v libovolném místě prostoru, vázaný vektor je spojen s nějakým konkrétním bodem – počátek souřadnic, střed tělesa apod.
Obr. 1.1 Vázaný vektor Jestliže umístíme počáteční bod vázaného vektoru do počátku souřadnic, je tak určen polohový vektor. Polohový vektor je vázaný vektor a určuje bod v prostoru P. Počátečním bodem polohového vektoru je tedy počátek souřadnic a koncovým je bod P. Vektory značíme r různými způsoby. My budeme používat OP , nebo a , nebo a - tučným písmenem bez šipky.
k
r
kde x,y,z jsou složky vektoru
j
i
r
Pro souřadnicové vyjádření polohového vektoru platí =x +y +z , i, j, k jednotkové vektory ve směru os souřadné soustavy.
2
+
z
2
= x2 +
y
r
Velikost polohového vektoru
x= y= z=
a a a
Průměty vektoru a do souřadných os (složky vektoru) cos α cos β
cos γ
kde α, β, γ jsou úhly, které svírá vektor a se souřadnými osami. 3
b
a
b
a
Pro jednotkový vektor jsou velikosti jeho složky x = cosα, y = cosβ, z = cosγ protože velikost složky jednotkového vektoru je 1. Součet a rozdíl dvou vektorů Součet vektorů + a rozdíl vektorů − definujeme jako úhlopříčky rovnoběžníka, který vznikne, když počátky vektorů umístíme do společného bodu a oba vektory považujeme za dvě strany tohoto rovnoběžníka.
= ( x1 ± x 2 ) + ( y1 ± y 2 ) + ( z1 ± z 2 )
k
j
i
±
b
a
Obr. 1.2 Součet a rozdíl dvou vektorů Pro souřadnicové vyjádření platí vztah
V souřadnicovém vyjádření bude mít vypočítaný rozdílový vektor počáteční bod ve společném bodě vektorů a, b. Nebude tedy úhlopříčkou uvedeného rovnoběžníka, ale bude mít stejnou velikost i směr. Násobení vektoru skalárem Součin vektoru a a skaláru λ je vektor λ a, jehož absolutní hodnota je λ násobkem ab-
λ = λx + λy + γz
k
j
i
a
solutní hodnoty a a směr je pro kladné λ souhlasný se směrem a a pro záporné λ opačný. V souřadnicovém vyjádření
⋅
b a
b a
Skalární součin dvou vektorů je skalár daný vztahem cos ϕ
=
b a
kde φ je úhel, který oba vektory svírají. V souřadnicovém vyjádření ⋅
= x1 x 2 + y1 y 2 + z1 z 2
×
b a
b a
Vektorový součin dvou vektorů je vektor kolmý na směr obou vektorů, orientace je dána kladně orientovaným trojhranem a jeho absolutní hodnota je dána vztahem sin ϕ
=
kde φ je úhel, který oba vektory svírají.
k
j
i
V souřadnicovém vyjádření s použitím determinantu a × b = x1
y1
z1
x2
y2
z2
a × b = ( y1 z 2 − y 2 z1 ) + ( x 2 z1 − x1 z 2 ) + ( x1 y 2 − x 2 y1 )
4
k
j
i
Po vyčíslení determinantu pomocí Hornerova schematu
1.2 Prostorová křivka t k t
j t
i t
t r
Vektorová rovnice parametrického vyjádření křivky je vektorová funkce skalárního argumentu. Pro polohový vektor r parametrické křivky můžeme psát () = (φ ) ⋅ +(χ ) ⋅ +( ψ) ⋅ ∈ a;b kde t je parametr (skalární argument funkce). Rozepsáním do složek dostaneme skalární tvar parametrické rovnice křivky x = φ (t )
y = χ (t ) z = ψ (t ) Funkce φ(t), χ(t), ψ(t) jsou obecně nelineární, pro přímku jsou potom lineárními funkcemi argumentu t. Příklad 1. Parametrické rovnice φ(t) =sin t, χ(t) = cos t, ψ(t) = t pro t ∈< 0,10π > určují spirálovou křivku podle následujícího obrázku.
Obr.1.3 Graf prostorové křivky
a b t a
t r
Zvláštním případem křivky je přímka. Parametrická vektorová rovnice přímky určené dvěma body A = [a1,a2,a3], B = [b1,b 2,b3] () = + ( ) kde a je polohový vektor bodu přímky v bodě A, b je vektor bodu přímky v bodě B do, r je polohový vektor obecného bodu P přímky, t je skalární parametr v intervalu (-∞,∞).
Obr.1.4 Vektorové vyjádření přímky
5
Rozepsáním do složek dostaneme skalární tvar parametrické rovnice přímky x = a1 + t (b1 − a1 ) y = a 2 + t ( b2 − a 2 ) z = a3 + t ( b3 − a3 ) Hodnoty b1 – a1, b2 – a2, b3 – a3 jsou směrovými koeficienty této přímky.
r
r
m i l
Derivace vektorové funkce Jestliže existuje limita
r
∆t →0
(t + ∆t ) − (t ) ∆t
k
j
i
k
j
i
r
Potom má funkce r(t) v bodě t derivaci ′(t ) vektorové funkce skalárního argumentu t rovnou této limitě.
dϕ dχ dψ + + dt dt dt Derivace složek křivky φ ′(t ), χ ′(t ),ψ ′(t ) jsou směrovými koeficienty tečny v bodě t. ′(t ) = ϕ ′(t ) + χ ′(t ) + ψ ′(t ) =
j
k
t r
i
i
t r
Příklad 2.
k
j
Je dána křivka( ) = t + t 2 + t 3 . Vypočítejte rovnici tečny v bodě t = 1 a souřadnice jejího průsečíku v rovinou z = 0. Velikosti složek bodu křivky v bodě t = 1 určíme z vektorové rovnice křivky. Potom a1 = 1, a2 = 1, a3 = 1. Derivace rovnice křivky je( ′) = + 2t + 3t 2 . Směrové koeficienty v bodě t = 1 jsou b1 – a1 = 1, b2 – a2 = 2, b3 – a3 = 3. Parametrický tvar rovnice tečny určíme ze skalárního tvaru rovnice přímky. Potom v bodě t = 1 je x = 1+ t, y = 1+2t, z = 1+3t. Z poslední rovnice pro z = 0 je t = -1/3. Dosazením do x a y jsou souřadnice průsečíku [2/3, 1/3, -1/3]. Průvodní trojhran prostorové křivky Je dána prostorová křivka a na ní libovolně zvolený bod s parametrem t0. Průvodním trojhranem křivky v bodě t0 rozumíme tečnu t v toto bodě, která je dána první derivací křivky v bodě t0, normálu n, která je kolmá na tečnu a je dána druhou derivací křivky v bodě t0 a binormálu b, která je kolmá na tečnu a normálu. Binormálu můžeme vypočítat jako vektorový součin tečny a normály.
Oskulační rovina τ je pak rovina, která je určena tečnou a normálou, normálová rovina ν normálou a a binormálou a rektifikační rovina µ tečnou a binormálou. Všechny tři roviny jsou na sebe kolmé.
6
Obr. 1.5 Průvodní trojhran prostorové křivky Pomocí vzájemného natočení oskulačních rovin při změně parametru t se definuje tzv. druhá křivost křivky – zkrut. c=
dβ ds
kde dβ je úhel natočení a ds je délka oblouku při změně parametru o dt.
1.3 Plocha v prostoru v , u
k v , u
j v , u
i v , u
v , u r
Vektorová rovnice plochy je vektorová funkce dvou skalárních argumentů. Pro polohový vektor r plochy můžeme psát ( ) = (φ ) ⋅ +(χ ) ⋅ +( ψ )⋅ ∈ a; b
Rozepsáním do složek dostaneme skalární tvar parametrické rovnice plochy x = φ (u, v) y = χ (u , v) z = ψ (u, v) Funkce φ(u,v), χ(u,v), ψ(u,v) jsou obecně nelineární, pro rovinu jsou to potom lineární funkce argumentů u,v. Parametrické rovnice x = u + 0.5v, y = 3v, z = 1- u2 definují kvadratickou plochu podle následujícího obrázku 1.6.
Obr.1.6 Graf prostorové plochy Zvláštním případem prostorové plochy je rovina. V tom případě jsou funkce parametrů u,v lineární.
7
Příklad 3. Parametrické rovnice x = u + 0.5v, y = 3v, z = v-5u definují rovinu podle následujícího obrázku.
Obr.1.7 Rovina v prostoru Rovina v prostoru může být určena polohovým vektorem bodu, který v ní leží a normálovým vektorem, který je na ni kolmý, nebo dvěma protínajícími se přímkami, nebo třemi body [a1,a2, a3], [b1,b2,b3], [c1,c2,c3], které neleží na přímce.
Obr.1.8 Rovina určená bodem a normálovým vektorem
k
j
i
n
Rovina je v prvním případě, který je nejobecnější a na který lze převést ostatní, určena bodem P0(x0,y0,z0) a normálovým vektorem (je na rovinu kolmý) = a + b + c . Označíme r polohový vektor libovolného bodu P(x,y,z) roviny.
n
r0 r
Vektorový tvar normálové rovnice roviny vyplývá ze skalárního součinu kolmých vektorů a je tedy ( )⋅ = 0 kde r0 je polohový vektor definičního bodu P0 a r je polohový vektor libovolného bodu P roviny.
8
Po rozepsání do složek dostaneme
)⋅
k
j
i
) = (x − x0 ) + ( y − y 0 ) + (z − z 0 )
n
(
r0 r0 - r r
(
= a ( x − x 0 ) + b( y − y 0 ) + c ( z − z 0 )
Potom skalární tvar normálového tvaru roviny a ( x − x 0 ) + b( y − y 0 ) + c ( z − z 0 ) = 0 Po vynásobení a sloučení dostaneme obecný tvar rovnice roviny
kde d = ax0 + by 0 + cz 0 =
n r0
ax + by + cz − d = 0 ⋅ .
k
j i
n
Příklad 4. Napište rovnici roviny určené bodem P0(-3,5,-1) a kolmé na vektor
=2 − +4 .
Vyjdeme z rovnice 2( x + 3) − ( y − 5) + 4( z + 1) = 0 . Po úpravě je výsledná rovnice této roviny 2 x − y + 4 z = −15 . Vypočítáme pro kontrolu parametr d d = 2 ⋅ (− 3) − 5 + 4 ⋅ (− 1) = −15
3D graf této roviny vykreslený v Matlabu
Obr.1.9 Graf roviny z příkladu 4 Ještě uvedeme rovnici roviny danou třemi body P1, P2, P3, které neleží na přímce. Častým prvkem používaným v počítačové grafice jsou totiž trojúhelníkové plošky, které aproximují hraniční plochy nebo isoplochy těles. Plošky jsou zadány svými vrcholy.
9
r m r
Obr. 1.10 Rovina určená třemi body Normálový vektor m určíme jako vektorový součin kterýchkoli dvou vektorů určených definičními body (obr.1.10), např. jako vektorový součin vektorů P1 P2 a P1 P3 . Pomocí normálového vektoru m a bodu P roviny můžeme rovnici této roviny napsat například ve tvaru ( − 1) ⋅
m
= P1 P2 × P1 P3 =0
kde r je polohový vektor proměnného bodu roviny, r1 je polohový vektor bodu P1. Po rozepsání do složek a vyjádřením pomocí determinantu je rovnice roviny určené třemi body ve tvaru x − x1
y − y1
z − z1
x 2 − x1
y 2 − y1
z 2 − z1 = 0
x3 − x1
y 3 − y1
z 3 − z1
kde x1,y1,z1 jsou souřadnice bodu P1, x2,y2,y3 souřadnice bodu P2 a x3,y3,z3 souřadnice bodu P3.
k
j
i
k
j
i
Příklad 5. Vypočítejte normálový vektor a rovnici roviny proložené body P1(-2, 3, 1), P2(1, 0, -2) a P3(1,2, -3). Normálový vektor hledané roviny je vektor
k
j
i
m
= P1 P2 × P1 P3 = x 2 − x1 y 2 − y1 z 2 − z1 = 3 − 3 − 3 = 9 + 3 + 6 x3 − x1 y3 − y1 z 3 − z1 3 − 1 − 4
Potom rovnici roviny vypočítáme ze skalární rovnice roviny určené bodem P1 a normálovým vektorem m, nebo přímo z předchozího determinantu. 9( x + 2) + 3( y − 3) + 6( z − 1) = 0 3x + 7 + 2 z + 1 = 0
1.4 Promítání na rovinu V 3D počítačové grafice je problémem zobrazování těles na 2D zobrazovacích zařízeních. Jednou z metod je promítání jednotlivých bodů tělesa na rovinu. Touto problematikou se zabývá deskriptivní geometrie. Zobrazovanému tvaru říkáme vzor, odpovídající útvar vzniklý zobrazením na rovině - průmětně, je jeho obraz. V počítačové grafice se navíc při
10
tomto promítání řeší viditelnost jednotlivých částí tělesa, stínování a další postupy, které umožní pozorovateli obrazu vnímat i prostorové vlastnosti vzoru. Průměty velkých objektů (staveb, velkých strojů, zemského povrchu ) nelze provést ve skutečné velikosti, a proto je zmenšujeme. V takovém případě mluvíme o měřítku plánu, mapy nebo výkresu. Naopak průměty malých objektů pro zřetelnost výkresu zvětšujeme. Nejpoužívanější druhy promítání v počítačové grafice jsou středové a rovnoběžné promítání. Středové (centrální) promítání. Zvolme libovolnou rovinu ρ (obr. 1.11), kterou nazýváme průmětna, a mimo ni bod S, zvaný střed promítání. Středový čili centrální průmět bodu A je průsečík As spojnice SA s průmětnou. Této spojnici říkáme promítací přímka nebo též promítací paprsek.(orientovaná polopřímka). Je-li zobrazovaný bod A v témže poloprostoru jako střed promítání S, považujeme jeho vzdálenost od průmětny za zápornou, v opačném poloprostoru za kladnou (např. bod B). Bod C, ležící v průmětně, je totožný se svým průmětem Cs. Bod totožný se středem promítání nemá středový průmět.
Obr.1.11. Středový a kosoúhlý průmět bodu Obraz vzniklý středovým promítáním odpovídá přibližně dojmu, jaký bychom měli, kdybychom zobrazovaný objekt pozorovali jedním okem ze středu promítání. Téměř přesným středovým průmětem je fotografický snímek. Rovnoběžné (paralelní) promítání. Stane-li se střed promítání S nevlastním bodem S ∞ (je umístěn v nekonečnu) vzniká rovnoběžné promítání. Promítací přímky jsou vzájemně rovnoběžné a svírají s průmětnou úhel ρ úhel ϕ (obr. 1.11). Průměty bodů tělesa jsou průsečíky promítacích přímek, které jimi vedeme rovnoběžně se směrem promítání s průmětnou. Rovnoběžné promítání dělíme na: Kosoúhlé promítání je rovnoběžné promítání, kde 0° < ϕ < 90° . Na obrázku 1.8 jsou zobrazeny kosoúhlé průměty Ak, Bk obecně položených bodů A, B a bodu C ležícího v průmětně. Pravoúhlé čili ortogonální promítání vznikne, když směr promítání je k průmětně kolmý ( ϕ = 90° ). Pak tedy pravoúhlé průměty bodů A, B (obr.1.12) v prostoru jsou paty A0, B0 kolmic vedených z těchto bodů k průmětně.
11
Obr.1.12. Pravoúhlý průmět bodu Ve všech uvedených případech můžeme volit polohu průmětny v prostoru libovolně. V pravoúhlém promítání na jednu průmětnu bývá zvykem volit ji vodorovně a pak jí říkáme půdorysna a průmět tělesa jako půdorys. Vzdálenosti těch bodů od půdorysny, které leží v poloprostoru nad‚ považujeme za kladné, v dolním poloprostoru je považujeme za záporné. V technické praxi je obvyklé pravoúhlé promítání těles na více průmětných rovin, obvykle tři. Potom se volí směry pohledů kolmé a průmětny se nazývají nárysna a bokorysna. Na obr.1.13 jsou znázorněny všechny možné směry kolmých pohledů na těleso.
Obr.1.13 Směry pohledů na těleso při půdorysu (1), nárysu (2), bokorysu (3), pohledu zdola (4), pohledu zezadu (5), pohledu zprava (6) Dojem vzniklý při pohledu na rovnoběžný průmět objektu je podobný tomu, jako bychom těleso pozorovali ve směru promítání z velké vzdálenosti. Dodejme, že náš osobní prostorový dojem vnějšího světa vzniká v mozku po složitém přenosu obrazů vzniklých středovým průmětem na sítnicích obou očí, které jsou přibližně kulového tvaru. Je ještě mnoho dalších zobrazení těles na rovinu, uveďme některá z nich. Dvojstředové (bicentrální) promítání vzniká promítáním ze dvou různých středů do téže roviny. Toto promítání je základem stereoskopického vidění, kde získáváme plastický prostorový dojem téměř takový, jaký máme při přímém pozorování zobrazeného objektu oběma očima. S tímto promítáním se setkáváme v plastické fotografii, v plastickém filmu nebo v různých měřicích přístrojích. Válcové promítání čili cylindrická projekce je promítání na rotační válcovou průmětnu, kterou pak rozvineme do roviny.
12
Kuželové promítání čili kónická projekce je promítání na rotační kuželovou plochu, kterou pak rozvineme do roviny. Těchto promítacích metod různě přizpůsobených se užívá v mediálních technologiích ke zvýšení prostorového nebo panoramatického dojmu.
1.5 Knihovna OpenGL Knihovna OpenGL (Open Graphics Library) byla navržena firmou Silicon Graphics jako aplikační programové rozhraní (Application Programming Interface - API) ke grafickým subsystémům. OpenGL byla navržena s důrazem na to, aby byla použitelná na různých typech grafických akcelerátorů a aby ji bylo možno použít i v případě, že na určité platformě žádný grafický akcelerátor není nainstalován - v tom případě se použije softwarová simulace. V současné době lze knihovnu OpenGL použít na různých verzích unixových systémů (včetně Linuxu a IRIXu), OS/2 a na platformách Microsoft Windows. Jako doplněk ke grafické knihovně OpenGL byla vytvořena knihovna OpenGL Utility Toolkit - GLUT. Definuje a implementuje aplikační rozhraní pro tvorbu oken a jednoduchého grafického uživatelského rozhraní, přičemž je systémově nezávislá, tj. pro práci s okny se na všech systémech používají vždy stejné funkce, které mají stejné parametry. Nezávislost na operačním systému i platformě jde dokonce tak daleko, že se ve všech funkcích knihovny GLUT používají pouze základní datové typy jazyka C/C++. Kromě jazyka C/C++ existuje i rozhraní pro použití ve Fortranu a Object Pascalu (což je programovací jazyk, který tvoří základ prostředí Delphi). Knihovna GLUT je v našem případě implementována do vývojového systému Visual C++ 6.0. Syntaxe funkcí deklarovaných v OpenGL Většina funkcí, které jsou v knihovně OpenGL deklarovány, používá poměrně důmyslnou syntaxi, kdy je již ze jména funkce zřejmé, kolik parametrů je použito a jakého jsou typu. Nejprve si uveďme příklad volání funkce z demonstrační aplikace.
glColor3f(0.0f, 1.0f, 0.0f); Jméno každé funkce z knihovny OpenGL začíná prefixem (předponou) gl. Podobnou vlastnost mají i funkce z navazujících knihoven. Například všechny funkce z knihovny GLU začínají prefixem glu a u knihovny GLUT je použit prefix glut. Pokud chce tvůrce aplikace zachovat čitelnost a srozumitelnost kódu, neměl by své vlastní funkce pojmenovávat se zde uvedenými prefixy. Za prefixem gl následuje tělo jména funkce, které většinou značí vytvářený předmět (např. Vertex-vrchol) nebo vlastnost, jež se mění (např. Color-barva). Tělo jména funkce začíná velkým písmenem, a pokud se skládá z více slov, jsou počáteční písmena slov velká (např. ClearColor). Ve funkcích nejsou použita podtržítka a neexistují dvě jména funkcí, která by se lišila pouze ve velikosti písem, protože by to dělalo problémy u programovacích jazyků, které velikosti písma nerozlišují, například Pascalu.
13
Za tělem jména funkce většinou následuje číslo, které značí počet parametů. Z uvedeného příkladu je tedy zřejmé, že funkce bude mít tři parametry. Pokud funkce nemá žádné parametry, žádné číslo se nepíše (tedy ani 0). Na závěr je jedním či dvěma znaky uveden typ parametrů. U většiny funkcí mají všechny parametry stejný typ, takže typ lze specifikovat. Pokud má funkce více parametrů, z nichž každý je odlišného typu, tyto znaky se neuvádí. Některé funkce existující ve více variantách umožňují místo skupiny parametrů stejného typu předat pole. Pro dosažení co nejsnazší přenositelnosti definuje knihovna OpenGL své vlastní datové typy, které se při volání funkcí OpenGL doporučuje upřednostňovat před primitivními datovými typy použitého programovacího jazyka. Tyto nové typy si uvedeme v následující tabulce i s příslušným suffixem (příponou), který je použit při skládání jména funkce. Tabulka č. 449 suffix datový typ
v jazyce C
v OpenGL
b
8-bit integer
signed char
GLbyte
s
16-bit integer
short int nebo int
GLshort
i
32-bit integer
int nebo long int
GLint GLsizei
f
32-bit float
float
GLfloat GLclampf
d
64-bit float
double
GLdouble GLclampd
ub
8-bit unsigned integer
unsigned char
GLubyte GLboolean
us
16-bit unsigned integer unsigned short/int GLushort
ui
32-bit unsigned integer unsigned int/long
GLuint GLenum GLbitfield
Jak je z předchozí tabulky patrné, je v OpenGL u každého datového typu pevně definovaná bitová délka, což je rozdíl oproti například jazyku C, kde typ int může mít podle použité platformy nebo překladače šířku 16, 32 nebo 64 bitů. Většina deklarativních funkcí v OpenGL existuje ve více verzích, které se liší počtem a typem parametrů, například: glColor3f(float1, float2, float3); glColor3b(byte1, byte2, byte3); glColor4b(byte1, byte2, byte3, byte4); glVertex2i(int1, int2); glVertex2d(double1, double2);
14
glVertex3f(float1, float2, float3); glVertex4f(float1, float2, float3, float4); Dále jsou uveden jednoduchý demonstrační příklad programu s knihovnou GLUT. V příkladu pouze otevřeme okno do kterého vykreslíme zelený trojúhelník. Program reaguje na změnu velikosti okna a polohy okna. Aplikaci lze ukončit stisknutím klávesy ESC. Otevřeme prostředí Visual C++ a projekt troj.dsw. Postupně sledujeme jednotlivé příkazy a nakonec program spustíme a měníme vykreslovací okno. V kódu potom také změníme barvu okna a trojúhelníka a polohu jeho vrcholů. Vysvětlení funkcí a příkazů. Tělo programu je rozděleno do několika funkcí, které jsou volány při výskytu určitých událostí z funkce main(). Funkce onResize() je zavolána v případě, že se má změnit velikost okna aplikace. Tato funkce je také zavolána ihned po vytvoření okna. Funkce onDisplay() je zavolána při každém požadavku na překreslení okna. Funkce onKeyboard() se zavolá, když uživatel stiskne některou klávesu generující ASCII kód. A poslední je funkce main(). V tomto příkladu se zaměříme na volání příkazů OpenGL, které jsou uvedené ve funkci onDisplay(). Příkaz glClearColor(0.0, 0.0, 0.0, 0.0) specifikuje barvu, kterou se vymaže pozadí okna. Zadávají se čtyři barevné složky (Red, Green, Blue a Alpha), z nichž každá je v rozsahu 0.0-1.0 (0.0 znamená nulovou složku ve výsledné barvě, 1.0 maximální hodnotu). Příkazem glClear(GL_COLOR_BUFFER_BIT) vymažeme určité bufery na grafické kartě (více v dalších pokračováních seriálu). Zde se vymaže pouze barvový bufer. Příkazem glColor3f(0.0f, 1.0f, 0.0f) specifikujeme barvu pro další vykreslování ve formátu RGB. V tomto případě byla zvolena čistě zelená barva. Příkaz glBegin(GL_TRIANGLES) zahájí vykreslování trojúhelníků, z nichž každý je specifikován třemi vrcholy. Tyto vrcholy se zadávají příkazem glVertex2i(), kterému předáme 2D souřadnice vrcholu trojúhelníka. Ukončení zadávání vrcholů zajistí příkaz glEnd(), který tvoří příkazové závorky spolu s glBegin(). Tyto příkazy tedy vždy musí tvořit pár. Posledním příkazem je glFlush(), který zajistí provedení všech operací na grafické kartě. Bez uvedení tohoto příkazu by se mohlo stát, že některé objekty by nebyly zobrazeny.
15