OpenGL: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
"di fatto" -> "de facto"
Etichette: Modifica da mobile Modifica da web per mobile
m Binding: Modificate informazioni riguardo C++ e C#
 
(14 versioni intermedie di 13 utenti non mostrate)
Riga 1:
{{Software
|Nome = OpenGL
|Logo = Opengl-logo.svg
|Screenshot =
|Didascalia = Schema dell'architettura di OpenGL
|Sviluppatore = [[Silicon Graphics]]<br />poi [[Khronos Group]] dal [[2000]]
|PrimaVersione = 1.0
Riga 20 ⟶ 19:
|Lingua =
}}
'''OpenGL''' ('''Open''' '''G'''raphics '''L'''ibrary) è una specifica che definisce una [[Application programming interface|API]] per più linguaggi e per più piattaforme per scrivere applicazioni che producono [[computer grafica]] 3D. L'interfaccia consiste in circa 250 diverse chiamate di funzione che si possono usare per disegnare complesse scene tridimensionali a partire da semplici primitive. Sviluppato nel 1992 dalla [[Silicon Graphics Inc.]], è ampiamente usato nell'industria dei videogiochi (nella quale compete con [[DirectX]] su [[Microsoft Windows]]), per applicazioni di [[Computer-aided design|CAD]], [[realtà virtuale]], e [[Computer-aided engineering|CAE]]. È lo standard [[de facto]] per la computer grafica 3D in ambiente [[Unix]].
 
== Specifica ==
A livello più basso OpenGL è una specifica, ovvero si tratta semplicemente di un documento che descrive un insieme di funzioni ed il comportamento preciso che queste devono avere. Da questa specifica, i produttori di hardware creano implementazioni, ovvero librerie di funzioni create rispettando quanto riportato sulla specifica OpenGL, facendo uso dell'accelerazione hardware ovedove possibile. I produttori devono comunque superare dei test specifici per poter fregiare i loro prodotti della qualifica di implementazioni OpenGL.
 
Esistono implementazioni efficienti di OpenGL (che sfruttano in modo più o meno completo le [[Graphics Processing Unit|GPU]]) per [[Microsoft Windows]], [[Linux]], molte piattaforme [[Unix]], [[PlayStation 3]] e [[Mac OSmacOS]]. Queste implementazioni vengono normalmente fornite dai costruttori di dispositivi video e si affidano pesantemente sull'hardware fornito. Esistono realizzazioni software che portano OpenGL su piattaforme che non hanno il supporto dei costruttori hardware. La più nota è la libreria ''open source'' ''[[Mesa 3D|Mesa]]'', un'API grafica basata solamente su librerie software che è compatibile con OpenGL. Tuttavia, a causa della licenza, può solo sostenere di essere un'API "molto simile".
 
La specifica di OpenGL è stata inizialmente supervisionata dall'OpenGL Architecture Review Board (ARB), formatosi nel [[1992]].
Riga 34 ⟶ 33:
 
== Struttura ==
[[File:Pipeline OpenGL.svg|thumbminiatura|upright=2.3|A Graphics Pipeline Process]]
OpenGL assolve a due compiti fondamentali:
* nascondere la complessità di interfacciamento con acceleratori 3D differenti, offrendo al programmatore una [[Application programming interface|API]] unica ed uniforme;
* nascondere le capacità offerte dai diversi acceleratori 3D, richiedendo che tutte le implementazioni supportino completamente l'insieme di funzioni OpenGL, ricorrendo ad un'emulazione software se necessario.
 
Il compito di OpenGL è quello di ricevere primitive come punti, linee e poligoni, e di convertirli in pixel (''rasterizing'' o [[rasterizzazione]]). Ciò è realizzato attraverso una [[pipeline grafica]] nota come ''OpenGL state machine''<ref>[{{Cita web |url=https://www.opengl.org/documentation/specs/version1.1/state.pdf |titolo=OpenGL state machine] |accesso=3 maggio 2019 |dataarchivio=22 giugno 2018 |urlarchivio=https://web.archive.org/web/20180622232710/https://www.opengl.org/documentation/specs/version1.1/state.pdf |urlmorto=sì }}</ref>. La maggior parte dei comandi OpenGL forniscono primitive alla pipeline grafica o istruiscono la pipeline su come elaborarle. Prima dell'introduzione di OpenGL 2.0, ogni stadio della pipeline realizzava una funzione fissa ed era configurabile solo entro certi limiti, ma dalla versione 2.0 molti stadi sono totalmente programmabili attraverso il linguaggio [[GLSL]].
 
OpenGL è una API procedurale che opera a basso livello, che richiede al programmatore i passi precisi per disegnare una scena. Questo approccio si pone in contrasto con le API descrittive ad alto livello le quali, operando su [[Albero (grafo)|struttura dati ad albero]] (''scene graph''), richiedono al programmatore solo una descrizione generica della scena, occupandosi dei dettagli più complessi del [[rendering]]. La natura di OpenGL obbliga quindi i programmatori ad avere una buona conoscenza della pipeline grafica stessa, ma al contempo lascia una certa libertà per implementare complessi algoritmi di ''rendering''.
Riga 114 ⟶ 113:
OpenGL 2 è stato concepito da [[3Dlabs]] per soddisfare le preoccupazioni che OpenGL fosse stagnante e mancasse di una forte direzione.
3Dlabs ha proposto alcune grosse aggiunte allo standard, la più significativa delle quali fu [[GLSL]] (da ''Open'''GL''' '''S'''hading '''L'''anguage'', cioè il linguaggio di shading di OpenGL). Questo consentirebbe ai programmatori di sostituire il codice prefissato di OpenGL per le pipeline di elaborazione dei vertici e dei frammenti con gli shader scritti in un linguaggio simile al [[Linguaggio C|C]]. GLSL era notevole per il fatto di non adeguarsi all'hardware allora disponibile; questo era un ritorno alla tradizione di OpenGL di porsi degli obiettivi ambiziosi e proiettati al futuro per nuovi acceleratori 3D, invece di limitarsi a inseguire lo stato dell'hardware attualmente disponibile.
La specifica finale di OpenGL 2.0<ref>{{Cita web |url=https://www.opengl.org/documentation/specs/version2.0/glspec20.pdf |titolo=Copia archiviata |accesso=3 maggio 2019 |dataarchivio=11 novembre 2019 |urlarchivio=https://web.archive.org/web/20191111182032/https://www.opengl.org/documentation/specs/version2.0/glspec20.pdf |urlmorto=sì }}</ref> comprendeva il supporto a GLSL, ma ometteva molte delle altre caratteristiche originalmente proposte - queste sono state differite a versioni future di OpenGL, sebbene alcune siano già disponibili come estensioni.
 
==== OpenGL 2.0 ====
Riga 127 ⟶ 126:
Pubblicato il 2 luglio [[2006]].
 
OpenGL 2.1 introduce un supporto per i ''pixel buffer objects'' (PBOs), sRGB textures (gamma-corrected textures), e per matrici ''non-quadre'', oltre alla revisione 1.20 dello ''Shading Language GLSL''<ref>[{{Cita web |url=https://www.opengl.org/documentation/current_version/ |titolo=What's New in the Latest Version of OpenGL<!-- Titolo generato automaticamente -->] |accesso=3 maggio 2019 |dataarchivio=1 luglio 2017 |urlarchivio=https://web.archive.org/web/20170701194824/https://www.opengl.org/documentation/current_version/ |urlmorto=sì }}</ref>.
* Schede: Radeon GD 2350, GeForce FX (dotate di driver 175.19), GeForce 6000 series, GeForce 7000 series, GeForce Go 7000 series, Quadro FX 4000, Quadro FX 350, Quadro FX 550, Quadro FX 560, Quadro FX 1400, Quadro FX 1500, Quadro FX 5500 e successive.
 
Riga 220 ⟶ 219:
In particolare, la libreria OpenGL Performer, sviluppata da SGI e disponibile per [[IRIX]], [[Linux]], e varie versioni di [[Microsoft Windows]], si appoggia a OpenGL per abilitare la creazione di applicazioni di simulazione visuale in [[sistema real-time]].
 
== BindingBindings ==
Al fine di imporre le sue caratteristiche multi-linguaggio e multi-piattaforma, vari [[binding]] e [[porting|port]] sono stati sviluppati per OpenGL in molti linguaggi. Tra i più notevoli, la libreria [[Java 3D]] può appoggiarsi su OpenGL per sfruttare l'accelerazione hardware. Molto recentemente, Sun ha pubblicato le versioni beta del sistema JOGL, che fornisce binding ai comandi OpenGL in [[C (linguaggio)|C]], diversamente da Java 3D che non fornisce tale supporto a basso livello. La pagina OpenGL ufficiale elenca vari bindings per i linguaggi [[Java (linguaggio di programmazione)|Java]], [[Fortran|Fortran 90]], [[Perl]], [[Pike programming language|Pike]], [[Python]], [[Ada (linguaggio)|Ada]], e [[Visual Basic]]. I binding sono disponibili anche per [[C++]] e [[C sharp|C#]].
 
Funziona nativamente con [[C++]] e possiede [[Wrapper|wrappers]] per [[C sharp|C#]].
 
== Funzionalità ad alto livello ==
[[File:Perl OpenGL fob2.jpg|alt=Esempio di OpenGL|miniatura|Esempio di OpenGL]]
OpenGL è stato progettato per essere di solo output: fornisce solamente funzioni di [[rendering]]. L'API di base non contempla la gestione di finestre, l'audio, la stampa, la tastiera, il mouse, né altri dispositivi di input. Per quanto questo possa sembrare restrittivo, permette al codice di rendering di essere completamente indipendente dal [[sistema operativo]] su cui funziona, permettendo lo sviluppo di codice indipendente dalla piattaforma.
Tuttavia, per consentire un'interazione con il sistema ospitante, è necessario integrare il software con il sistema a finestre nativo.
Riga 234 ⟶ 236:
 
== Esempio di codice sorgente ==
Di seguito un semplice programma in [[Linguaggio C|C]] che disegna un triangolo utilizzando le primitive OpenGL un triangolo. Si noti che questo programma fa uso di funzionalità deprecate a partire da OpenGL 3.0.
 
<sourcesyntaxhighlight lang="c">
/*************************************************************
* Per compilare con gcc su Linux: *
Riga 301 ⟶ 303:
return (1);
}
</syntaxhighlight>
</source>
 
== Il futuro in Microsoft Windows ==
Riga 317 ⟶ 319:
Sarebbe tecnicamente immediato fornire un ICD OpenGL (''installable client driver'', cioè un driver specifico per OpenGL) all'interno dell'intera esperienza Aeroglass senza compromettere la stabilità o la sicurezza del sistema operativo. Appoggiare OpenGL su Direct3D è una decisione più strategica che tecnica.}}
 
Allora, il futuro di OpenGL come libreria principale per i video giochivideogiochi sembrava precario. Microsoft aveva preso la decisione di non pubblicare le informazioni necessarie per permettere a terze parti (come [[NVIDIA Corporation|NVIDIA]], [[ATI Technologies|ATI]] o gli altri grandi costruttori di schede) di sviluppare i driver di sostituzione, non lasciando modo di evitare il calo di velocità del 50%.
 
Forse proprio a seguito delle pressioni che giungevano dal mondo dell'industria del software e dagli stessi produttori hardware, Microsoft ha in seguito rivisto questa politica e sono oggi disponibili ICD in grado di funzionare senza problemi in unione al sottosistema Aeroglass, senza calo di prestazioni. Si veda a tal proposito la presentazione relativa ad OpenGL su Windows Vista pubblicata da NVIDIA al SIGGRAPH 2006<ref>[https://www.khronos.org/developers/library/siggraph2006/OpenGL_BOF/NVIDIA_-_OpenGL_on_Vista.ppt Khronos Developer Presentations Library<!-- Titolo generato automaticamente -->]</ref>.
Riga 345 ⟶ 347:
 
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* {{cita web|https://www.opengl.org/|Sito Web ufficiale|lingua=en}}
* {{en}} [https://www.opengl.org/registry/ OpenGL Registry] - tutte le specifiche, gli header, le estensioni e la documentazione collegata