OpenGL 2. Sisältö. Tietokonegrafiikka / perusteet T /301 4 ov / 2 ov

Samankaltaiset tiedostot
Sisällys. OpenGL 2. Display-listat. Display-Listat. Display-listat. Display-listat. Tietokonegrafiikka / perusteet Ako/T /301 4 ov / 2 ov

OpenGL:n perusteet Osa 3: Teksturointi

T Tietokonegrafiikan perusteet. OpenGL-ohjelmointi

Sisällys. T Tietokonegrafiikan perusteet. OpenGL-ohjelmointi 11/2007. Mikä on OpenGL?

Esimerkkejä. OpenGL ohjelma. OpenGL tilakone. Geometriset primitiivit. Hyvät ja huonot polygonit. OpenGL Pipeline. Rasterointi

OpenGL:n perusteet - Osa 2: 3D grafiikka

Luento 6: Piilopinnat ja Näkyvyys

Jypelin käyttöohjeet» Ruutukentän luominen

T Vuorovaikutteinen tietokonegrafiikka Tentti

T Johdatus tietoliikenteeseen ja multimediatekniikkaan Tietokonegrafiikka

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Demokoodaus Linuxilla, tapaus Eternity

Luento 2: Tulostusprimitiivit

Tietokonegrafiikka. Jyry Suvilehto T Johdatus tietoliikenteeseen ja multimediatekniikkaan kevät 2014

Toinen harjoitustyö. ASCII-grafiikkaa

Luento 4: Näkyvyystarkastelut ja varjot

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

KÄYTTÖÖN. Koulukirjat tietokoneelle PIKAOHJEET PAPERPORT -OHJELMAN. Sisällysluettelo

IDL - datan sovitus. ATK tähtitieteessä. IDL - esimerkiksi linfit. IDL - esimerkiksi linfit

OpenGL:n perusteet Osa 4: Valot ja varjot

Ohjelmoinnin jatkokurssi, kurssikoe

Lyhyt kertaus osoittimista

Tilanhallintatekniikat

Action Request System

Luento 10: Näkyvyystarkastelut ja varjot. Sisältö

Muita kuvankäsittelyohjelmia on mm. Paint Shop Pro, Photoshop Elements, Microsoft Office Picture Manager

ATK tähtitieteessä. Osa 5 - IDL datan sovitusta ja muita ominaisuuksia. 25. syyskuuta 2014

Tampereen yliopisto Tietokonegrafiikka 2013 Tietojenkäsittelytiede Harjoitus

Tietorakenteet ja algoritmit

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla

JAVA on ohjelmointikieli, mikä on kieliopiltaan hyvin samankaltainen, jopa identtinen mm. C++

Esityksen sisältö. Peruskäsitteitä. 3D Grafiikka tietokonepeleissä. Piirto- ja taustapuskuri

ATK tähtitieteessä. Osa 5 - IDL datan sovitusta ja muita ominaisuuksia. 25. syyskuuta 2014

Toinen harjoitustyö. ASCII-grafiikkaa 2017

Algoritmit 2. Luento 7 Ti Timo Männikkö

Luento 6: Geometrinen mallinnus

Monipuolinen esimerkki

Taulukot. Jukka Harju, Jukka Juslin

Luento 6: Tulostusprimitiivien toteutus

Tietorakenteet ja algoritmit

Luku 6: Grafiikka. 2D-grafiikka 3D-liukuhihna Epäsuora valaistus Laskostuminen Mobiililaitteet Sisätilat Ulkotilat

Funktionaalista grafiikkaa

Tehtävä 3 ja aikakausilehden kansi pastissi 4. runokirjan kansi

Tampereen yliopisto Tietokonegrafiikka 2013 Tietojenkäsittelytiede Harjoitus

Ohjelmoinnin perusteet Y Python

Sukupuu -ohjelma. Ossi Väre ( ) Joni Virtanen ( )

Dynaaminen muisti. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät 2017.

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

Tietueet. Tietueiden määrittely

GeoGebra-harjoituksia malu-opettajille

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Sisältö. Luento 6: Piilopinnat. Peruskäsitteet (jatkuu) Peruskäsitteitä. Yksinkertaisia tapauksia. Yksinkertaiset tapaukset jatkuu

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Videon tallentaminen Virtual Mapista

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Osoittimet ja taulukot

Harjoitus Morphing. Ilmeiden luonti

Ohjelmoinnin perusteet Y Python

Tieto- ja tallennusrakenteet

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2

XNA grafiikka laajennus opas. Paavo Räisänen. Tämän oppaan lähdekoodit ovat ladattavissa näiden sivujen Ladattavat osiossa.

6. Harjoitusjakso II. Vinkkejä ja ohjeita

Ohjelmoinnin peruskurssien laaja oppimäärä

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Sukelluskeräily, Pelihahmon liikuttaminen. Tee uusi hahmo: Pelihahmo. Nimeä se. Testaa ikuisesti -silmukassa peräkkäisinä testeinä (jos) onko jokin

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

Tapio Takala / Lauri Savioja Teknillinen korkeakoulu Tietoliikenneohjelmistojen ja multimedian laboratorio

Ohjelmoinnin peruskurssien laaja oppimäärä

TIEA341 Funktio-ohjelmointi 1, kevät 2008

7/20: Paketti kasassa ensimmäistä kertaa

OpenGL:n perusteet - Osa 1: Ikkunan luominen

Sisältö. 22. Taulukot. Yleistä. Yleistä

Hakemistojen sisällöt säilötään linkitetyille listalle.

Ohjelmoinnin peruskurssien laaja oppimäärä

Fixcom Webmail ohje. Allekirjoitus. Voit lisätä yhden tai useamman allekirjoituksen.

Public Account-tili on pysyvä, joten kannattaa käyttää mieluummin sitä kuin kaupallisen tilin kokeiluversiota.

Ohjelmoinnin peruskurssien laaja oppimäärä

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

1. OHJAAMATON OPPIMINEN JA KLUSTEROINTI

Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

LIITE 1 1. Tehtävänä on mallintaa kitara ohjeiden mukaan käyttäen Edit Poly-tekniikkaa.

Taulukot, taulukkoryhmät Sisällysluettelo

TYYLIT. Word Tyylit

A TIETORAKENTEET JA ALGORITMIT

Tietorakenteet ja algoritmit

Tietorakenteet, laskuharjoitus 3, ratkaisuja

Hannu Mäkiö. kertolasku * jakolasku / potenssiin korotus ^ Syöte Geogebran vastaus

ITKP102 Ohjelmointi 1 (6 op)

QT tyylit. Juha Järvensivu 2008

ITKP102 Ohjelmointi 1 (6 op)

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Vapo: Turveauman laskenta 1. Asennusohje

Miten siirrän omat työni Office 365:stä Peda.nettiin sekä jaan sen siellä muille Eija Arvola

TEKSTINKÄSITTELYTEHTÄVIÄ, OSA 1

A TIETORAKENTEET JA ALGORITMIT

2. Olio-ohjelmoinista lyhyesti 2.1

Rakenteiset tietotyypit Moniulotteiset taulukot

58131 Tietorakenteet ja algoritmit (syksy 2015)

Transkriptio:

Tietokonegrafiikka / perusteet T-111.300/301 4 ov / 2 ov OpenGL 2 Iikka Olli OpenGL / 1 GLUT Display listat Teksturointi Sumu Blendaus Antialiasointi Picking Optimointi Sisältö OpenGL / 2 1

GLUT = OpenGL Utility Toolkit Author: Mark J. Kilgard GLUT Järjestelmä riippumaton OpenGL API (C kielellä) Tapahtuma käsitty takaisin kutsuina Useita ikkunoita Idle loop Syötelaitteet Popup menut 3D primitiivejä, torus, pallo, kartio, teepannu... Overlays Kirjasimet (fontit) Sekalaisia apufunktiota http://www.opengl.org/resources/libraries/glut.html OpenGL / 3 GLUTin käyttö Alustus: glutinit(&argc, argv); glutinitdisplaymode(glut_double GLUT_RGB GLUT_DEPTH); Takaisin kutsujen rekisteröinti: glutdisplayfunc(display); glutmousefunc(mouse); glutkeyboardfunc(keypress); glutidlefunc(rotate_me); Tapahtumasilmukka: glutmainloop(); 3D primitiivit: glutsolidsphere, Cube, Cone, Torus, Teapot, Dodeca/Octa/Tetra/Icosaherdon glutwiresphere, Cube... Sekalaista: glutswapbuffers, glutestablishoverlay, glutcreatemenu, glutfullscreen... OpenGL / 4 2

GLUT takaisin kutsut void glutdisplayfunc(void (*func)(void)); void glutreshapefunc(void (*func)(int w, int h); void glutkeyboardfunc(void (*func)(unsigned char key, int x, int y)); void glutspecialfunc(void (*func)(int key, int x, int y)); GLUT_KEY_F1..F12, GLUT_KEY_LEFT, GLUT_KEY_UP, GLUT_KEY_DOWN, GLUT_KEY_RIGHT, GLUT_KEY_PAGE_UP, GLUT_KEY_PAGE_DOWN, GLUT_KEY_HOME, GLUT_KEY_INSERT void glutmousefunc(void (*func)(int button, int state, int x, int y)); GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, GLUT_RIGHT_BUTTON GLUT_UP, GLUT_DOWN void glutidlefunc(void (*func)(void)); void gluttimerfunc(unsigned int msecs, void (*func)(int value), value); glutspaceballmotionfunc(), glutspaceballrotatefunc(), glutspaceballbuttonfunc(), glutbuttonboxfunc(), glutdialsfunc(), gluttabletmotionfunc(), gluttabletbuttonfunc()... Takaisin kutsu disabloidaan NULL argumentilla OpenGL / 5 GLUT kirjasimet Stroke kirjasimet geometria viivoina skaalautuvia void glutstrokecharacter(void *font, int character); GLUT_STROKE_ROMAN, GLUT_STROKE_MONO_ROMAN void *font = GLUT_STROKE_ROMAN; char message[] = GLUT means OpenGL. ;... glenable(gl_line_smooth); glenable(gl_blend); glblendfunc(gl_src_alpha, GL_ONE_MINUS_SRC_ALPHA); gllinewidth(3.0);... glrotatef(4.0, 0.0,0.0,1.0); for(i=0 ; i<len ; i++) glutstrokecharacter(font, message[i]); OpenGL / 6 3

GLUT kirjasimet Bittikartta kirjasimet Rasterimatriisi, yksi bittisiä kuvia Nopeita Vakio kokoisia (ei skaalautuvia) void glutbitmapcharacter(void *font, int character); GLUT_BITMAP_8_BY_13, GLUT_BITMAP_9_BY_15 GLUT_BITMAP_TIMES_ROMAN_10, 24 GLUT_BITMAP_HELVETICA_10, 12, 18 OpenGL / 7 Display listat Välimuisti OpenGL kutsuille Hyvä paikka objektien säilyttämiselle (geometria ja attribuutit) Käytä harkiten: Ei yksittäisiä kolmioita! Yleisesti tehokkaampia kuin yksittäiset kutsut Rakenna monimutkaiset objektit (esim robotti) käyttäen hierarkisia display listoja Ei sovellu erittäin suuriin malleihin käytä suuriin malleihin mieluummin fiksuja algoritmeja esim BSP Luotua listaa ei voi muuttaa käytännössä lista voidaan muuttaa poistamalla se ja luomalla uudelleen uusilla parametreilla Display lista luodaan laittamalla OpenGL komentoja glnewlist ja glendlist komentojen väliin Jokaisella display listalla on oma id Uuden id:n saat glgenlists() funktiolla Display lista voi sisältää kutsuja toisiin display listoihin OpenGL / 8 4

B5_world = glgenlists(1); Display listat glnewlist(b5_world, GL_COMPILE); glcalllist(station); glcalllist(planet); glcalllist(stars); glendlist(); glcalllist(b5_world); Voit kysyä OpenGL:ltä onko jokin display lista olemassa glislist() funktiolla Display listan voi tuhota gldeletelists() funktiolla void check_and_destroy(gluint list) { if(glislist(list)) gldeletelists(list,1); } OpenGL / 9 Display listat Display listoja rakennettaessa voidaan käyttää mitä tahansa laskuja ja algoritmeja Vain OpenGL komennot tallennetaan display listaan void buildcircle(int circle_list) { GLint i; GLfloat x,y; } glnewlist(circle_list, GL_COMPILE); glbegin(gl_line_loop); for(i=0 ; i<8 ; i++) { x=cos(i*2*m_pi/8.0); y=sin(i*2*m_pi/8.0); } glend(); glendlist(); OpenGL / 10 5

Display listat Display listat muuttavat OpenGL:n tilaa (matriiseja ja attribuutteja) aivan kuten mitkä tahansa OpenGL komennot Matriisit ja attribuutit voidaan tallettaa pinoon glnewlist(list, GL_COMPILE); glpushmatrix(); glpushattrib(gl_current_bit); gltranslatef(1.5, 0.0, 0.0); glcolor3f(1.0, 0.0, 0.0); glbegin(gl_triangles); glvertex2f(0.0, 0.0); glvertex2f(1.0, 0.0); glvertex2f(0.0, 1.0); glend(); glpopattrib(); glpopmatrix(); glendlist(); OpenGL sisältää yli 20 eri attribuuttiryhmää. Nämä käsittelevät mm. tämän hetkistä tilaa, puskureita, valoja, sumua jne. GL_CURRENT_BIT = color, normal, texture coords, edge_flag, rasterization info OpenGL / 11 Tekstuurit Tapa liittää kuva pinnalle Käytännöllinen yksityiskohtien toteuttamiseksi Samaa kuvaa voidaan kopioida useaan kertaa (esimerkiksi tiiliseinä) Mapping: yhdistetään tekstuurikoordinaatit (s,t) solmuun OpenGL / 12 6

Tekstuurit Tekstuurien koko aina 2 potensseja 16x16, 32x32, 64x64... On kaksi tapaa tehdä tekstuureja 1) Luetaan tekstuuri tiedostosta Kurssi tarjoaa kirjaston rgb kuvien lukemiseen Käytä xv tai gimpiä konvertoimaan jpg tms rgb(a) muotoon GLubyte *LoadRGBImage(const char *imagefile, GLint *w, GLint *h, GLenum *format); GLubyte *Image = NULL; Image = LoadRGBImage( foo.rgb, &ImgWidth, &ImgHeight, &ImgFormat); 2) Käytetään kivaa algoritmia tekemään kuva suoraan muistiin Hyvä yksikertaisiin kuviin kuten shakkilauta OpenGL / 13 Tekstuurit Tekstuuri ja sen parametrit voidaan määrittää nimetyksi tekstuuri objektiksi a) Luo tekstuureille nimet b) Yhdista tekstuuri data (kuva ja parametrit) nimeen c) Priorisoi jos tarpeen d) Käytä tekstuurikoordinaatteja solmuille e) Poista GLuint texnames[2]; GLubyte *myimage=null;... glgentextures(2, texnames); glbindtexture(gl_texture_2d, texnames[0]); gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_S, GL_CLAMP); gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_T, GL_CLAMP); glteximage2d(gl_texture_2d, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, myimage);... glbindtexture(gl_texture_2d, texnames[0]);... gldeletetextures(2, texnames); OpenGL / 14 7

Tekstuurien parametrit Muistiin tallennus muoto: glpixelstorei(gl_unpack_alignment,1); Tekstuurien kääriytyminen (wrapping): gltexparameterf(gl_texture_2d, GL_TEXTURE_WRAP_S, GL_WRAP); gltexparameterf(gl_texture_2d, GL_TEXTURE_WRAP_T, GL_CLAMP); Teksturointi metodi: gltexenvf(gl_texture_env, GL_TEXTURE_ENV_MODE, GL_DECAL); GL_DECAL, GL_MODULATE, GL_BLEND Muista laittaa teksturointi päälle! glenable(gl_texture_2d); OpenGL / 15 Tekstuurin sormenjälki: a) kohdetyyppi b) mipmap taso c) sisäinen muoto d) leveys ja korkeus e) kehys f) kuvan muoto g) kuvan data Tekstuurin määrittely glteximage2d(gl_texture_2d, 0, GL_RGB, ImgWidth, ImgHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, ImgData); OpenGL / 16 8

Aseta tekstuuri koordinaatit jokaiselle solmulle! Tekstuuri koordinaatit void display(void) { glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); glbegin(gl_quads); gltexcoord2f(0.0, 0.0); glvertex3f(-2.0, -1.0, 0.0); gltexcoord2f(0.0, 1.0); glvertex3f(-2.0, 1.0, 0.0); gltexcoord2f(1.0, 1.0); glvertex3f(0.0, 1.0, 0.0); gltexcoord2f(1.0, 0.0); glvertex3f(0.0, -1.0, 0.0); } gltexcoord2f(0.0, 0.0); glvertex3f(1.0, -1.0, 0.0); gltexcoord2f(0.0, 1.0); glvertex3f(1.0, 1.0, 0.0); gltexcoord2f(1.0, 1.0); glvertex3f(2.4, 1.0, -1.4); gltexcoord2f(1.0, 0.0); glvertex3f(2.4, -1.0, -1.4); glend(); glflush(); OpenGL / 17 Teksturointi funktiot Tekstuuri voidaan laittaa suoraan pinnalle tai sitten se voi muokata puskurissa olevaa väriä gltexenvi(gl_texture_envm GL_TEXTURE_ENV_MODE, GL_DECAL); gltexenvi(gl_texture_envm GL_TEXTURE_ENV_MODE, GL_MODULATE); OpenGL / 18 9

Mipmap Tarkkuustason säätö Optimointia: käytetään pienempää tekstuuria pienemmälle polygonille Täysi tarkkuus ainoastaan läheltä katsottaessa Esisuodatus gltexparameteri(gl_texture_2d, GL_TEXTURE_MIN_FILTER, GL_NEAREST); GL_NEAREST_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_LINEAR OpenGL / 19 Environment mapping Tekstuurin osoitus pinnan normaalin ja katsomissuunnan funktiona gltexgeni(gl_s, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); gltexgeni(gl_t, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glenable(gl_texture_gen_s); glenable(gl_texture_gen_t); OpenGL / 20 10

Sekoittaminen (Blending) Värin sekoittamista käyttäen alpha arvoja Läpinäkyvyys Muista aina disabloida syvyystestaus ja enabloida blendaus gldisable(gl_depth_test); glenable(gl_blend); Sekoitus funktioon voidaan vaikuttaa pixel = f(source, target) f = glblendfunc(sfactor, dfactor) Tyypillinen käyttö piirrä ensimmäinen objekti arvoilla sfactor=gl_one dfactor=gl_zero piirrä toinen objekti puoliksi läpinäkyvänä glcolor(0,1,0,0.5); sfactor=gl_src_alpha dfactor=gl_one_minus_src_alpha OpenGL / 21 Poistaa kulmikkuuden joka johtuu heikosta näytteenottotaajuudesta Alpha voidaan käyttää apuna Käytännössä sekoitetaan naapuripikseleitä Suhteellisen helppoa viivoille ja pisteille glenable(gl_line_smooth); glenable(gl_blend); glblendfunc(gl_src_alpha, GL_ONE_MINUS_SRC_ALPHA); glhint(gl_line_smooth_hint, GL_DONT_CARE); gllinewidth(1.5); Polygonit toimivat hieman toisin Antialiasointi OpenGL / 22 11

Antialiasointi Eräs tapa polygonien antialiasointiin: a) Aseta pieni alpha arvo polygonin reunapisteille glenable(gl_polygon_smooth); b) Disabloin syvyystesti gldisable(gl_depth_test); c) Valitse sekoitusfunktio reunapisteille glblendfunc(gl_src_alpha_saturate, GL_ONE); d) Piirrä syvyys järjestyksessä (painter s algorithm) Nykyisin antialiasointia myös raudalla Accumulation bufferia voidaan käyttää myös antialiasoinnin toteutukseen OpenGL / 23 Kaukana olevat objektit häviävät Toteutettu käyttäen syvyysarvoja Sumun parametrejä voidaan säätää Sumu glfog{if}{v}(glenum pname, TYPE param); pname: GL_FOG_MODE GL_FOG_COLOR GL_FOG_DENSITY GL_FOG_START GL_FOG_END param: GL_EXP, GL_EXP2, GL_LINEAR RGBA arvot sumun tiheys (EXP) sumun aloitus etäisyys (LINEAR) sumun lopetus etäisyys (LINEAR) glenable(gl_fog); OpenGL / 24 12

Picking Valitseminen on usein riippuvainen tapahtumista kuten hiiren nappulan painaminen OpenGL tarjoaa karkean tavan toteuttaa valitseminen a) Tee taulukko osumille tai valinta puskuri b) Alusta nimi pino c) Rajoita piirtoalue lähelle osoitinta (glupickmatrix() + projektio matriisi) d) Piirrä piirto moodina GL_SELECT. Piirron aikana liitä jokaiseen objektiin nimi e) Palaa GL_RENDER piirto moodiin f) Hae lähimmän objektin nimi osuma taulukosta. Taulukossa on osuman 1) indeksi 2) minz 3) maxz 4) objektin nimi OpenGL / 25 Picking esimerkki int selectpiece(int mousex, int mousey) { long hits; GLuint selectbuf[1024], closest, dist; } glselectbuffer(1024, selectbuf); glrendermode(gl_select); glinitnames(); glpushname(-1); glmatrixmode(gl_projection); glloadidentity(); glupickmatrix(mousex, H-mousey, 4, 4, viewport); gluperspective(45, 1,0.1, 100.0); drawall(); hits = glrendermode(gl_render); if(hits<=0) return 0; closest = 0; dist = 4294967295; while(hits) { if(selectbuf[(hits-1)*4+1]<dist) { dist= selectbuf[(hits-1)*4+1]; closest = selectbuf[(hits-1)*4+3]; } hits--; } return closest; OpenGL / 26 13

Optimointi Käytä mitä tahansa menetelmiä kohottamaan frameratea Yleisesti: Älä piirrä mitään mitä ei voida nähdä Kaikki on sallittua niin kauan kun se näyttää hyvältä Kerää yleisesti käytetyt objektit ja tila display listoihin Käytä yksipuoleista valaistusta Käytä vain yhtä tai kahta valonlähdettä Määritä katseija äärettömän kauaksi valaistusta laskettaessa Käytä back face cullingia Käytä natiivia kääntäjää (SGI cc tai CC) glcullface(gl_back); gllightmodelf(gl_light_model_two_side, GL_FALSE); gllightmodelf(gl_light_model_local_viewer, GL_FALSE); OpenGL / 27 Lisää optimointia Minimoi geometria ja käytä tekstuureja Käytä GL_TRIANGLE_STRIPia kaikkeen geometriaan, se on nopein Vältä yksittäisiä polygoneja Käytä solmutaulukoita (vertex array, RTFM) Vältä turhia moodin vaihtoja Ryhmittele objektit piirtoa varten materiaalin tekstuurin tai värin mukaan jos mahdollista Käytä vain nimettyjä tekstuureja OpenGL / 28 14

Aloittelijoille Ymmärsitlö siirto/pyöritys järjestyksen? Muistitko tyhjentää syvyyspuskurin? Missä objektisi ovat? Ovatko ne projektio frustumissa? Near/Far planes... Käytitkö materiaaleja? Laitapa ne valot päälle. Käytätkö tupla puskurointi? Muista joskus myös vaihtaa puskurit OpenGL komennot menevät putkeen. Jos haluat että komennot suoritetaan välittömästi huuhtele putki glflush():lla Aloita muokkaamaa jo toimivaa pohja sovellusta. OpenGL / 29 15