OpenGL

OpenGL
programvare
OpenGL-arkitekturskjema
SjangerProgramvarebibliotek  (ikke  oppført )
Datagrafikk
UtviklerSilicon Graphics
deretter Khronos Group siden 2000
Dato for første versjonjanuar 1992
Siste versjon4.6 (31. juli 2017)
OperativsystemMultiplattform
SpråkC
GLSL
TillatelseFlerlisens
( gratis lisens )
Nettstedwww.opengl.org/

OpenGL ( Open G raphics Bibliotek ) er en spesifikasjon som definerer et flerspråklig multiplattform- API for å skrive applikasjoner som produserer 3D -datagrafikk . Grensesnittet består av rundt 250 forskjellige funksjonskall som kan brukes til å tegne komplekse tredimensjonale scener fra enkle primitiver. Utviklet i 1992 av Silicon Graphics Inc. , er det mye brukt i videospillindustrien (hvor det konkurrerer med DirectXMicrosoft Windows ), for CAD , virtuell virkelighet og CAE -applikasjoner . Det er standardende facto for 3D datagrafikk i Unix -miljø .

Spesifiser

På det laveste nivået er OpenGL en spesifikasjon, det vil si at det ganske enkelt er et dokument som beskriver et sett med funksjoner og den nøyaktige oppførselen de må ha. Fra denne spesifikasjonen lager maskinvareprodusenter implementeringer, det vil si funksjonsbiblioteker opprettet i henhold til OpenGL-spesifikasjonen, og bruker maskinvareakselerasjon der det er mulig. Imidlertid må produsenter bestå spesifikke tester for å kvalifisere produktene sine som OpenGL-implementeringer.

Det finnes effektive implementeringer av OpenGL (som gjør mer eller mindre full bruk av GPUer ) for Microsoft Windows , Linux , mange Unix -plattformer , PlayStation 3 og macOS . Disse implementeringene leveres vanligvis av produsenter av videoenheter og er avhengige av maskinvaren som leveres. Det finnes programvareimplementeringer som bringer OpenGL til plattformer som ikke har støtte fra maskinvareprodusenter. Det mest kjente er Mesa -biblioteket med åpen kildekode , et grafisk API basert utelukkende på programvarebiblioteker som er kompatibelt med OpenGL. På grunn av lisensen kan den imidlertid bare hevde å være en "svært lik" API.

OpenGL-spesifikasjonen ble opprinnelig overvåket av OpenGL Architecture Review Board (ARB), dannet i 1992 . ARB besto av en gruppe selskaper som var interessert i å lage en konsistent og allment tilgjengelig API. Grunnleggerne av ARB inkluderte slike som 3Dlabs , Apple , ATI Technologies , Dell , IBM , Intel , NVIDIA , SGI , Sun Microsystems og Microsoft , men det forlot gruppen i mars 2003. Engasjementet til så mange selskaper med svært forskjellige interesser, har det ført til at OpenGL over tid har blitt en generell API med et bredt spekter av muligheter.

Kontrollen av OpenGL ble tidlig i 2007 overført til Khronos Group-konsortiet, i et forsøk på å forbedre markedsføringen og fjerne barrierene mellom utviklingen av OpenGL og OpenGL ES [1]

Struktur

OpenGL utfører to grunnleggende oppgaver:

Oppgaven til OpenGL er å motta primitiver som punkter, linjer og polygoner, og konvertere dem til piksler ( rastering eller rasterisering ). Dette oppnås gjennom en grafisk pipeline kjent som OpenGL state machine [2] . De fleste OpenGL-kommandoer gir enten primitiver til grafikkrørledningen eller instruerer rørledningen om hvordan de skal behandles. Før introduksjonen av OpenGL 2.0 hadde hvert trinn i rørledningen en fast funksjon og var kun konfigurerbar innenfor visse grenser, men siden versjon 2.0 er mange trinn fullt programmerbare gjennom GLSL -språket .

OpenGL er et prosedyre-API på lavt nivå, som krever at programmereren har de nøyaktige trinnene for å tegne en scene. Denne tilnærmingen står i kontrast til den beskrivende API-en på høyt nivå som, som opererer på en tredatastruktur ( scenegraf ), krever at programmereren kun har en generisk beskrivelse av scenen, som tar for seg de mer komplekse detaljene i gjengivelsen . Naturen til OpenGL forplikter derfor programmerere til å ha en god forståelse av selve grafikkpipelinen, men gir samtidig en viss frihet til å implementere komplekse gjengivelsesalgoritmer .

Historisk sett har OpenGL hatt en betydelig innflytelse på utviklingen av 3D-akseleratorer, og fremmet et grunnleggende funksjonalitetsnivå som nå er vanlig i skjermkort rettet mot allmennheten:

En av de mest verdsatte funksjonene i det profesjonelle feltet er bakoverkompatibiliteten mellom de forskjellige versjonene av OpenGL: programmer skrevet for versjon 1.0 av biblioteket må fungere uten endringer på implementeringer som følger versjon 2.1.

Versjoner

Revisjon 1

OpenGL 1 er en utvikling av (og har en veldig lik stil som) IRIS GL , 3D-grensesnittet til SGI. En av begrensningene til IRIS GL var at den bare ga tilgang til funksjoner som støttes av den underliggende maskinvaren. Hvis grafikkmaskinvaren ikke støttet en funksjon, kunne ikke applikasjonen bruke den. OpenGL har overvunnet dette problemet ved å tilby programvarestøtte for funksjoner som ikke støttes av maskinvare, slik at applikasjoner kan bruke avansert grafikk på systemer med relativt lavt strømforbruk. Fahrenheit-prosjektet var en felles innsats mellom Microsoft, SGI og Hewlett-Packard med mål om å forene OpenGL- og Direct3D-grensesnittene. Den viste først et løfte om å bringe orden i verden av interaktive 3D-datagrafikk-APIer, men på grunn av økonomiske begrensninger hos SGI og den generelle mangelen på støtte i bransjen, ble den til slutt forlatt.

OpenGL 1.0

Utgitt i 1992 .

Den første OpenGL-spesifikasjonen ble publisert av Mark Segal og Kurt Akeley.

OpenGL 1.1

Utgitt i januar 1997 .

OpenGL 1.1 har som mål å støtte teksturfunksjoner og teksturformater på maskinvare-GPUer.

OpenGL 1.2

Publisert 16. mars 1998 .

OpenGL 1.2 har som mål å støtte volumteksturer , pakkede piksler , normal skalering , sampling av klemte/kanttekstur og bildebehandlingsfunksjoner .

OpenGL 1.2.1

Publisert 14. oktober 1998 .

OpenGL 1.2.1 er en mellompublikasjon som legger til funksjoner med flere teksturer, eller til og med teksturenheter, til gjengivelsesrørledningen. Dette lar deg blande flere pikselbaserte teksturer under rasterisering.

OpenGL 1.3

Publisert 14. august 2001 .

OpenGL 1.3 legger til støtte for kubekart-teksturfunksjoner, multi-teksturering, multi-sampling og teksturenhetskombinasjonsfunksjoner (som: add, combine, dot3 og border clamp).

OpenGL 1.4

Publisert 24. juli 2002 .

OpenGL 1.4 introduserer maskinvarestøtte for skyggefunksjoner, tåkekoordinater, automatisk generering av mipmap og ekstra teksturfunksjoner.

OpenGL 1.5

Publisert 29. juli 2003 .

OpenGL 1.5 legger til støtte for: toppunktbufferobjekter (VBO), okklusjonsspørringer og utvidet skyggelegging.

Revisjon 2

Kort utgitt med OpenGL 2.0 er de første som tilbyr programmerbare shaders.

OpenGL 2 ble unnfanget av 3Dlabs for å adressere bekymringer om at OpenGL var stillestående og manglet sterk retning. 3Dlabs foreslo noen store tillegg til standarden, hvorav den mest betydningsfulle var GLSL (fra Open GL S hading L anguage , dvs. skyggespråket til OpenGL). Dette vil tillate programmerere å erstatte den forhåndsinnstilte OpenGL-koden for toppunkt- og fragmentbehandlingsrørledninger med shaders skrevet på et C -lignende språk . GLSL var kjent for ikke samsvarende maskinvare som da var tilgjengelig; dette var en retur til OpenGL-tradisjonen med å sette ambisiøse, fremtidsrettede mål for nye 3D-akseleratorer, i stedet for bare å jage etter tilstanden til tilgjengelig maskinvare. Den endelige OpenGL 2.0-spesifikasjonen [3] inkluderte støtte for GLSL, men utelot mange av de andre funksjonene som opprinnelig ble foreslått - disse har blitt utsatt til fremtidige versjoner av OpenGL, selv om noen allerede er tilgjengelige som utvidelser.

OpenGL 2.0

Publisert 7. september 2004 .

OpenGL 2.0 legger til støtte for et ekte GPU -basert assembly-språk kalt ARB (fordi det ble designet av Architecture Review Board ), som tar sikte på å bli standarden for alle funksjoner til vertex og fragment shaders .

OpenGL 2.1

Publisert 2. juli 2006 .

OpenGL 2.1 introduserer støtte for pikselbufferobjekter (PBO), sRGB-teksturer (gamma-korrigerte teksturer) og ikke-kvadratmatriser , samt revisjon 1.20 av GLSL Shading Language [4] .

Revisjon 3

OpenGL 3.0 legger til en forenklingsmekanisme for API for fremtidige revisjoner.

OpenGL 3.0

Publisert 11. juli 2008 .

OpenGL 3.0 introduserer støtte for geometriskyggelegging, rammebufferobjekter, maskinvareinstansering, vertex array-objekter (VAO-er) og sRGB-rammebuffere (gamma 2.2)-funksjoner [5] .

OpenGL 3.1

Publisert 28. mai 2009 .

OpenGL 3.1 legger til en rekke funksjoner for å gjøre API mer praktisk å bruke, samt et spekter av ytelsesorienterte funksjoner [6] ; introduserer også en 1.40-revisjon av OpenGL Shading Language .

Med utgivelsen av OpenGL 3.1 ble en kompatibilitetsutvidelse introdusert som lar utviklere få tilgang til de utdaterte funksjonene til OpenGL 1.X / 2.X og fjernet i OpenGL 3.1.

Utdaterte og fjernede funksjoner i kjerneprofilen inkluderer:

OpenGL 3.2

Publisert 3. august 2009 og oppdatert 7. desember 2009 .

OpenGL 3.3

Publisert 11. mars 2010 .

Denne utgivelsen er ment å la tidligere generasjons GPUer dra nytte av noen av funksjonene til OpenGL 4.0. Også designet med tanke på å utvikle OpenGL ES (API dedikert til mobile enheter som de som er basert på Android , webOS og iPhone OS ). [7]

Introduserer revisjon 3.30 av OpenGL Shading Language.

Revisjon 4

OpenGL 4.0

Publisert 11. mars 2010 .

Denne utgivelsen inkluderer støtte for tessellasjon og dobbelpresisjon 64- bit flytepunkt ( for å forbedre kvaliteten) for shaders . Det forbedrer også støtten for OpenCL -standarden , dedikert til GPGPU , som er muligheten for å utnytte GPUen for en større type bruk. [7]

OpenGL 4.1

Publisert 26. juli 2010 .

Denne utgivelsen forbedrer interoperabilitet med OpenCL og introduserer kompatibilitet med OpenGL ES 2.0.

OpenGL 4.2

Publisert 8. august 2011 . [8]

OpenGL 4.3

Publisert 6. august 2012 . [9]

Denne utgivelsen introduserer blant annet versjon 4.30 av GLSL-skyggespråket, den nye ETC2 / EAC-teksturkomprimeringsmetoden, teksturvisninger og full kompatibilitet med OpenGL ES 3.0 .

OpenGL 4.4

Publisert 22. juli 2013 .

OpenGL 4.5

Publisert 11. august 2014 introduseres Flush Control som tillater større ytelse i flertrådede applikasjoner, DSA (Direct State Access) tillater uavhengig kontroll av ulike objekter, og WebGL-gjengivelsesmotoren [10] er også optimalisert .

OpenGL 4.6

Utgitt 31. juli 2017, i tillegg til mange utvidelser og optimaliseringer, introduserer den støtte for SPIR-V .

Utvidelser

OpenGL-standarden lar individuelle produsenter tilby tilleggsfunksjonalitet gjennom utvidelser etter hvert som nye teknologier skapes. En utvidelse distribueres deretter i to deler: som en overskriftsfil som inneholder prototypene for utvidelsesfunksjonen, og som en produsentdriver . Hver produsent har en alfabetisk forkortelse som brukes til å navngi deres nye funksjoner og konstanter. For eksempel brukes forkortelsen av NVIDIA ( NV ) for å definere deres proprietære funksjon glCombinerParameterfvNV()og konstant GL_NORMAL_MAP_NV. Det kan hende at flere produsenter blir enige om å implementere den samme utvidede funksjonaliteten.

I dette tilfellet brukes forkortelsen EXT . Det kan også skje at ARB godkjenner forlengelsen. Da blir det kjent som en standard utvidelse , og forkortelsen ARB brukes . Den første ARB-utvidelsen var GL_ARB_multitexture. Etter å ha fulgt kampanjeveien for offisielle utvidelser, er multitexture ikke lenger en valgfritt implementert ARB-utvidelse, men har blitt integrert i kjernen OpenGL API siden versjon 1.4. Spesifikasjoner for nesten alle utvidelser finnes i det offisielle utvidelsesarkivet [11] .

Ulike biblioteker er bygget på toppen av OpenGL for å gi funksjonalitet som ikke er tilgjengelig i OpenGL selv:

Spesielt OpenGL Performer-biblioteket, utviklet av SGI og tilgjengelig for IRIX , Linux og forskjellige versjoner av Microsoft Windows , er avhengig av OpenGL for å muliggjøre opprettelsen av visuelle simuleringsapplikasjoner i sanntidssystemer .

Binding

For å påtvinge funksjonene på flere språk og flere plattformer, har ulike bindinger og porter blitt utviklet for OpenGL på mange språk. Blant de mest bemerkelsesverdige kan Java 3D -biblioteket stole på OpenGL for å dra nytte av maskinvareakselerasjon. Senest lanserte Sun betaversjoner av JOGL-systemet, som gir binding til OpenGL-kommandoer i C , i motsetning til Java 3D som ikke gir så lavt nivåstøtte. Den offisielle OpenGL-siden viser ulike bindinger for språkene Java , Fortran 90 , Perl , Pike , Python , Ada og Visual Basic . Bindinger er også tilgjengelig for C ++ og C # .

Høynivåfunksjonalitet

OpenGL ble designet for kun å sendes ut: den gir bare gjengivelsesfunksjoner . Kjerne-APIet dekker ikke vindusadministrasjon, lyd, utskrift, tastatur, mus eller andre inndataenheter. Så restriktivt som dette kan virke, lar det gjengivelse av kode være helt uavhengig av operativsystemet den kjører på, noe som muliggjør plattformuavhengig kodeutvikling. For å tillate interaksjon med vertssystemet, er det imidlertid nødvendig å integrere programvaren med det opprinnelige vindussystemet. Dette gjøres gjennom følgende ekstra APIer:

I tillegg gir GLUT- og SDL - bibliotekene funksjonalitet for elementær vindusadministrasjon med OpenGL, på en bærbar måte. macOS har tre API-er for å få OpenGL-støtte: AGL for Carbon , NSOpenGL for Cocoa og Core OpenGL (CGL) for direkte tilgang.

Kildekodeeksempel

Her er et enkelt C -program som tegner en trekant ved hjelp av OpenGL-primitiver. Merk at dette programmet bruker utdaterte funksjoner som starter med OpenGL 3.0.

/ ************************************************** ************* * For å kompilere med gcc på Linux: * * gcc file.c -lglut * * eller: * * gcc file.c -L / usr / X11R6 / lib -lglut -lXmu -lGL -lGLU -lXi * ************************************************** ****************** / #include <GL / gl.h> // Overskriftsfil for OpenGL-biblioteket #include <GL / glut.h> // Header-fil for GLUT-biblioteket #include <stdlib.h> // Filoverskrift for å bruke 'exit ()' / * Funksjon som aktiveres når vinduet endres (selv når det opprettes) * / tomrom endre størrelse ( int bredde , int høyde ) { glViewport ( 0 , 0 , bredde , høyde ); // Vi bruker all window glMatrixMode ( GL_PROJECTION ); // Velg å bruke 'PROJECTION'- arrayen glLoadIdentity (); // Tilbakestill 'PROJEKSJON'-matrisen glMatrixMode ( GL_MODELVIEW ); // Velg for å bruke 'MODELVIEW'-arrayen glLoadIdentity (); // Tilbakestill 'MODELVISNING'-matrisen } / * Tegnefunksjon * / tomrom tegne () { glClearColor ( 0.0f , 0.0f , 0.0f , 0.0f ); // Svart bakgrunn glClear ( GL_COLOR_BUFFER_BIT ); // Slett scenen glBegin ( GL_TRIANGLES ); // Tegn en trekant glColor3f ( 1.0f , 0.0f , 0.0f ); // Vi setter rødfargen glVertex3f ( 0.0f , 0.5f , 0.0f ); // Øverste hjørne glColor3f ( 0.0f , 1.0f , 0.0f ); // Sett fargen grønn glVertex3f ( -0.5f , -0.5f , 0.0f ); // Nedre venstre hjørne glColor3f ( 0.0f , 0.0f , 1.0f ); // Sett den blå fargen glVertex3f ( 0.5f , -0.5f , 0.0f ); // Nedre høyre hjørne glEnd (); // Slutt på trekant glutSwapBuffere (); // Tegn! } / * Funksjon påkalles hver gang en tast trykkes * / tomrom keyPressed ( usignert tegntast , int x , int y ) { _ if ( tast == 'q' ) // Hvis tasten som trykkes er q, avslutt ( 0 ); // exit } / * Hoved * / int main ( int argc , char ** argv ) { glutInit ( & argc , argv ); // Initialiser GLUT-biblioteket glutInitDisplayMode ( GLUT_RGB | GLUT_DOUBLE ); // Velg visningsmodus: bruk RGB og dobbel buffer glutInitWindowSize ( 640 , 480 ); // Sett vindusstørrelsen til 640x480 glutInitWindowPosition ( 0 , 0 ); // Sett posisjonen til øvre venstre hjørne av vinduet glutCreateWindow ( "Eksempel bruk OpenGL" ); // Lag vinduet glutDisplayFunc ( draw ); // Sett tegnefunksjonen glutReshapeFunc ( resize ); // Angi skaleringsfunksjonen glutKeyboardFunc ( tastetrykk ); // Sett tastaturhendelsesfunksjonen glutMainLoop (); // Start retur ( 1 ); }

Fremtiden i Microsoft Windows

Den 6. august 2005 ble Microsofts opprinnelige intensjoner angående OpenGL-støtte i Windows Vista avslørt i en nyhetskunngjøring på Opengl.org [12] .

«Microsofts nåværende planer for OpenGL på Windows Vista er å støtte OpenGL på toppen av Direct3D for å bruke OpenGL på et sammensatt skrivebord for å oppnå Aeroglass-opplevelsen. Hvis du kjører en OpenGL ICD - stasjonær kompositor vil slå seg av - noe som reduserer brukeropplevelsen betydelig.

I praksis betyr dette for OpenGL under Aeroglass:

Ytelsen til OpenGL vil bli betydelig redusert – kanskje opptil 50 %.

OpenGL på Windows vil bli overført til en basisversjon av OpenGL 1.4.

Ingen utvidelse vil være mulig for å vise fremtidige maskinvareinnovasjoner. Det ville være teknisk enkelt å tilby en OpenGL ICD ( installerbar klientdriver , dvs. en OpenGL-spesifikk driver) innenfor hele Aeroglass-opplevelsen uten å kompromittere stabiliteten eller sikkerheten til operativsystemet. Å sette OpenGL på Direct3D er en mer strategisk beslutning enn en teknisk."

Den gang virket fremtiden til OpenGL som et primært videospillbibliotek usikker. Microsoft hadde tatt beslutningen om ikke å publisere informasjonen som er nødvendig for å la tredjeparter (som NVIDIA , ATI eller andre store kortprodusenter) utvikle erstatningsdrivere, og det er ingen mulighet for å unngå hastighetsfallet på 50 %.

Kanskje på grunn av presset som kom fra verden av programvareindustrien og fra maskinvareprodusentene selv, reviderte Microsoft senere denne policyen, og ICD-er er nå tilgjengelige som kan fungere uten problemer i forbindelse med Aeroglass-delsystemet, uten tap av ytelse. I denne forbindelse, se presentasjonen om OpenGL på Windows Vista publisert av NVIDIA på SIGGRAPH 2006 [13] .

Som med Windows XP -forgjengeren, inkluderer ikke installasjons-CDen for Windows Vista noen ICD (Installable Client Driver), som må installeres av brukeren. I mangel av en ICD, tilbyr Vista fortsatt OpenGL 1.4-funksjonalitet uten utvidelser, gjennom et Direct3D-basert emuleringslag.

Fremtiden til OpenGL på videospillfeltet er derfor nå i hendene på videospillprodusenter, som uansett ikke virker veldig tilbøyelige til å bruke denne API-en, som en avgjørelse fra en av de mest berømte støttespillerne på dette feltet, John Carmack , også vil demonstrere av id Software . Sistnevnte uttalte faktisk [14]QuakeCon 2005 at dens viktigste utviklingsplattform vil være Xbox 360 , som faktisk er avhengig av DirectX .

Merknader

  1. ^ OpenGL ARB gir kontrollen over OpenGL-spesifikasjonen til Khronos Group Arkivert 3. mai 2008 på Internet Archive .
  2. ^ OpenGL tilstandsmaskin
  3. ^ https://www.opengl.org/documentation/specs/version2.0/glspec20.pdf
  4. ^ Hva er nytt i den nyeste versjonen av OpenGL , på opengl.org . Hentet 3. mai 2019 (Arkiveret fra originalen 1. juli 2017) .
  5. ^ https://www.opengl.org/registry/doc/glspec30.20080811.pdf
  6. ^ Khronos Group prioriterer Kinas deltakelse i etableringen av nøkkel internasjonal teknologistandard - Pressemelding fra Khronos Group , på khronos.org . Hentet 3. mai 2019 (arkivert fra originalen 27. mars 2016) .
  7. ^ a b OpenGL 4-utfordring DirectX 11 på Punto informatico.it , på punto-informatico.it . Hentet 13. mars 2010 .
  8. ^ Khronos beriker 3D-grafikk på tvers av plattformer med utgivelsen av OpenGL 4.2-spesifikasjonen
  9. ^ Khronos slipper OpenGL 4.3-spesifikasjonen med store forbedringer
  10. ^ OpenGL 4.5-forbedringer for flertrådsapplikasjoner kommer
  11. ^ Register (viderekobling) , på oss.sgi.com . Hentet 11. august 2005 (arkivert fra originalen 5. februar 2008) .
  12. ^ [1]
  13. ^ Khronos utviklerpresentasjonsbibliotek
  14. ^ Link , på techreport.com . Arkivert fra originalen 15. august 2007 .

Bibliografi

  • OpenGL Architecture Review Board; Dave Shreiner. OpenGL Reference Manual: The Official Reference Document to OpenGL, Version 1.4 (4th Edition) , Addison-Wesley Professional, 2004. ISBN 0-321-17383-X
  • OpenGL Architecture Review Board; Dave Shreiner; Mason Woo; Jackie Neider; Tom Davis. OpenGL-programmeringsveiledning: Den offisielle veiledningen for å lære OpenGL, versjon 2 (5. utgave) . Addison-Wesley Professional, 2005. ISBN 0-321-33573-2
  • Randi J. Rost. OpenGL Shading Language , Addison-Wesley Professional, 2004. ISBN 0-321-19789-5

Relaterte elementer

Andre prosjekter

Eksterne lenker

  • ( EN ) Offisiell nettside , på opengl.org .
  • OpenGL Registry - alle spesifikasjoner, overskrifter, utvidelser og relatert dokumentasjon

Ressurser for programmerere

  • ( NO ) OpenGL Wiki - Offisiell OpenGL Wiki
  • ( NO ) NeHe Productions - Veiledning for programmering med OpenGL
  • CodeSampler.com - Kodeeksempler og veiledninger for programmering av spill i OpenGL 1.2-2.0
  • Grunnleggende belysning med OpenGL - En forklaring av standard OpenGL 1.X-2.X belysning
  • ( NO ) OpenGL Tutorial - Veiledning for programmering med OpenGL
  • ( NO ) OpenGL SuperBible , på starstonesoftware.com . Hentet 8. februar 2008 (arkivert fra originalen 10. januar 2008) .