
Valitettavasti[citation needed] rikkominen jäi puolitiehen, kun vanhojen ominaisuuksien poistamisen sijasta käytännössä koko OpenGL 2 vaan deprekoitiin, ja lopulta OpenGL 3.2:een lisättiin kaksi eri profiilia, compatibility vanhojen juttujen muistelua varten, sekä uudenkankea core-profiili oikeaa tekemistä varten. Vanha rajapinta siis vähän tilanteesta riippuen toimii edelleen Compatibility-profiilissa, mutta käsittelen tässä kirjoituksessa nyt lähinnä Core-profiilista.
Punaisen pallon tarina
Deprekoituneita tai poistettuja ominaisuuksia on valtavasti. Otan niistä esille tähän joitain mielestäni tutuimpia.Oleellisin muutos on koko fixed-pipeline:n poistuminen, eli ei enää matriisipinoa, verteksi kerrallaan piirrettäviä objekteja tai oletusshadereita. Piirtääkseen ruudulle punaisen pehmeästi varjostetun pallon, täytyy aluksi itse laskeskella kaikki kameran matriisit – jos siis haluaa ylipäätään toteuttaa objektien ja kameran transformaatioita matriiseilla – ja syöttää lopulta nämä tiedot ja pallon verteksit, normaalit yms. taulukkona omatekoisten shadereiden attribuutteihin. Lopulta täytyy toteuttaa esim. Phong-varjostus, jotta ruudulle piirtyy jotain. Toki pallo onkin varmaan helpompaa vain generoida uudella geometria-shaderilla.
Väittäisin, että vanhalla kunnon gluPerspective + gluLookAt + glColor + glVertex + glNormal + glShadeModel(GL_SMOOTH) -yhdistelmällä pallon saa ruudulle paria aikayksikköä vähemmällä työllä.
Mitä siis poistui?
Funktiot glBegin, glEnd, glColor, glNormal, glVertex ja glTexCoord ja kaikki näihin liittyvät tilat ovat poistettu. Jos haluat piirtää ruudulle vaikka kolmion, täytyy siitä rakentaa verteksitaulukko ja koko roska siirtää kerralla näytönohjaimelle.Em. verteksitaulukkoa ei voi rakentaa käyttäen ClientState -palikkaa, jota ei enää ole olemassa. Vanhat funktiot glColorPointer, glIndexPointer, glNormalPointer, glVertexPointer ja kumppanit ovat siis poistuneet. Verteksit kuuluu laittaa Vertex Buffer Objectiin (VBO), joita voidaan sitten bindailla GLSL-shadereiden in-attribuutteihin. Näitä käytetään shadereissa sitten samaan tapaan kuin vanhoja gl_Vertex, gl_Normal ja muita gl_-sisäänrakennettuja muuttujia.
Matriisipinoa ei enää ole OpenGL:n puolesta. Ei glFrustum, glOrtho, glLoadIdentify, glLoadMatrix, glMatrixMode, glMultMatrix tai edes glPush/popMatrix tai glRotate/Scale/Translate -funktioita tai mitään muuta vanhaan sisäänrakennetun matriisipinon toimintaan liittyvää.
Kaikki valoihin ja materiaaleihin liittyvät asiat ovat lähteneet, koska ei ole enää mitään oletusrenderöintitapaa, ainoastaan itse rakennettuja shadereita. Toisin sanoen glMaterial/glLight ja vastaavat toiminnallisuudet täytyy toteuttaa itse jollain uniform-muuttujilla tai miten tahtookaan.
Display listejä ei ole enää olemassa, eikä Quadeja tai mitään muitakaan polygoneja kuin vain kolmioita.Tekstuuritkin saivat oman osuutensa raivosta, mipmappeja ei generoida automaattisesti (tosin ne voi edelleen luoda helposti), formaatteja vähennettin ja CLAMP -wraptyyli sekä tekstuurien reunat poistettiin.
Lisäksi loppuun lajitelma satunnaisista tutuista asioista, joita ei enää voi käyttää. glFog, glAlpha/glAlphaTest ja glCopyPixels lähtivät. Accumulation bufferit, evaluaattorit ja glRasterPos ovat historiaa, kuten myös glCopyPixels, glClipPlane, sekä attribuuttipinot (glPushAttrib jne).
Pienenä yksityiskohtana mainittakoon, että viivojen paksuutta ei voi enää määritellä yhtä pikseliä paksummaksi!
OpenGL 4
Poistamisen sijasta OpenGL 4:ssa tuli sitten kaikkea kivaa uutta, eikä enempää vanhaa tavaraa poistettu. Onkin vaikeaa nähdä enää mitään yhteistä vanhojen OpenGL 2.0/1.x -rajapintojen kanssa.
Ja kuka opetti herroille versionumeroiden käyttöä, Patrick Volkerding ehkä? Tässäpä lista OpenGL-versioiden ja vastaavien GLSL-versioiden yhteydestä.
| OpenGL | GLSL |
|---|---|
| 2.0 | 1.10 |
| 2.1 | 1.20 |
| 3.0 | 1.30 |
| 3.1 | 1.40 |
| 3.2 | 1.50 |
| 3.3 | 3.30 |
| 4.0 | 4.00 |
Onneksi hypättiin GLSL 2 kokonaan yli, silti (GLSL) 4.00 < (Shader Model) 5.0 ja (OpenGL) 4.0 < (DirectX) 11, vielä pitää hyppiä lisää!




