recente ho iniziato a programmare con OpenGL. Ho fatto codice creando primitive di base e ho usato shader in webGL. Ho cercato ampiamente l'argomento, ma non è ancora chiaro per me. Fondamentalmente, ecco quello che voglio sapere. C'è qualcosa che può essere fatto in GLSL che non può essere fatto in pianura openGL, o fa GLSL solo fare le cose in modo più efficiente?Qual è la differenza tra opengl e GLSL?
risposta
La versione breve è: OpenGL è un'API per il rendering di grafica, mentre GLSL (che sta per GL shading language) è un linguaggio che offre ai programmatori la possibilità di modificare gli shader della pipeline. Per dirla in altro modo, GLSL è una (piccola) parte dell'intero framework OpenGL.
per capire dove GLSL si inserisce nel quadro generale, si consideri un pipeline grafica molto semplificata.
Vertici specificati --- (vertex shader) ---> vertici trasformati --- (assemblaggio primitivo) ---> primitivi --- (rasterizzazione) ---> frammenti --- (framment shader) - -> pixel di output
gli shaders (qui, solo i vertex e frammenti shaders) sono programmabili. Puoi fare ogni sorta di cose con loro. Si potrebbe semplicemente scambiare i canali rosso e verde, o si potrebbe implementare un bump mapping per rendere le vostre superfici appaiono molto più dettagliata. Scrivere questi shader è una parte importante della programmazione grafica. Ecco un link con alcuni bei esempi che dovrebbero aiutare a vedere cosa si può realizzare con shaders personalizzati: http://docs.unity3d.com/Documentation/Components/SL-SurfaceShaderExamples.html.
In un passato non troppo lontano, l'unico modo per programmare loro era di usare GPU assembler. Nel caso di OpenGL, il linguaggio è noto come assemblatore ARB. A causa della difficoltà di questo, le persone OpenGL ci hanno dato GLSL. GLSL è un linguaggio di livello superiore che può essere compilato ed eseguito su hardware grafico. Quindi, per riassumere tutto, gli shader programmabili sono parte integrante del framework OpenGL (o qualsiasi API grafica moderna), e GLSL rende molto più facile programmarli.
Come anche coperto da Mattsills risposta GL Shader Language o GLSL è una parte di OpenGL che consente la creazione di algoritmi chiamati shaders in/per OpenGL. Gli shader vengono eseguiti sulla GPU.
Shaders prendere decisioni su fattori come il colore di parti di superfici, e le superfici modo in cui condividere le informazioni come la luce riflessa. Vertex Shaders, Geometry Shaders, Tesselation Shaders e Pixel Shaders sono tipi di shader che possono essere scritti in GLSL.
Q1:
C'è qualcosa che può essere fatto in GLSL che non può essere fatto in OpenGL pianura?
A:
Si può essere in grado di utilizzare solo OpenGL senza le parti GLSL, ma se si desidera che il proprio proprietà di superficie, probabilmente si vorrà uno shader rendono questo ragionevolmente semplice e performante, creato in qualcosa come GLSL.Ecco alcuni esempi:
Q2:
O fa GLSL solo fare le cose in modo più efficiente?
A:
pixel shader specificamente sono molto parallelo, calcolando valori indipendentemente per ogni cella di una griglia 2D, mentre anche contenente avvertimenti significativi, come non essere in grado di gestire "if" come condizioni molto performantly , quindi è un caso di usare diversi tipi di shader per i punti di forza, sulle superfici descritte e trattate nel resto di OpenGL.
Q3:
ho il sospetto che si desidera sapere se usando solo GLSL è un'opzione, e posso solo rispondere questo con la mia conoscenza di un tipo di shader Pixel Shader. Il resto di questa risposta riguarda "solo" con GLSL come una possibile opzione:
A:
Mentre GLSL è una parte di OpenGL, è possibile utilizzare il resto delle OpenGL per impostare l'ambiente e scrivere il programma quasi interamente come pixel shader, in cui ogni elemento del pixel shader colora un pixel dell'intero schermo.
Ad esempio:
(Si noti che WebGL ha la tendenza a CPU hog fino al punto di stallo l'intero sistema, e Windows 8.1 lo lascia farlo, Chrome sembra meglio a guardare questi collegamenti rispetto a Firefox .)
No, questo non è un video clip di acqua vera:
https://www.shadertoy.com/view/Ms2SD1
Le uniche risorse esterne alimentate a questa lumaca alcune texture facilmente generatable:
https://www.shadertoy.com/view/ld3Gz2
rendering utilizzando un rumoroso frattale nuvole di punti:
https://www.shadertoy.com/view/Xtc3RS
https://www.shadertoy.com/view/MsdGzl
Una sfera perfetta: 1 poligono, 1 superficie, senza spigoli o vertici:
https://www.shadertoy.com/view/ldS3DW
Un sistema particellare come la simulazione con auto su una pista, utilizzando una seconda stretta ma lunga pixel Shader come tabella di dati sulle posizioni macchina:
https://www.shadertoy.com/view/Md3Szj
valori casuali sono piuttosto semplici:
fract(sin(p)*10000.)
ho trovato il linguaggio per certi versi ad essere difficile da lavorare e che può o non può essere particolarmente pratico da usare GLSL in questo modo per un grande progetto come un gioco o una simulazione, tuttavia come dimostrano queste dimostrazioni, un gioco per computer non deve sembrare un gioco per computer e questo tipo di approccio dovrebbe essere un'opzione, forse utilizzata con contenuti generati e/o dati esterni.
quanto ho capito di eseguire Shaders ragionevolmente Pixel in OpenGL:
- devono essere caricati in un piccolo pezzo di memoria.
- Non supportato:
- "se" istruzioni come condizioni.
- ricorsione o controllo di flusso come ad anello.
- Sono limitati a un piccolo gruppo di istruzioni e tipi di dati validi.
- Compreso "peccato", mod, vettore moltiplicazione, galleggianti e galleggianti mezzo precisione.
- Mancano funzioni di alto livello come oggetti o lambda.
- E calcola efficacemente tutti i valori contemporaneamente in parallelo.
Una conseguenza di tutto questo è che il codice assomiglia più a linee di equazioni a forma chiusa e manca di algoritmi o strutture di livello superiore, utilizzando l'aritmetica modulare per qualcosa di simile alle condizioni.
Cosa c'entra tutto questo con la risposta alla domanda? –
Rispondendo a GLSL vs GL, ed è davvero una parte della relazione invece di essere un'alternativa, che regge le domande "cosa si può fare in uno ma non nell'altro". Oltre a mostrare cosa si può fare con "just" GLSL, anche se solo la parte di cui so alcune cose, e che cosa è efficace in GLSL e cosa no. Non è una risposta completa, mi dà solo un sacco di informazioni su cose che so che possono aiutare con la domanda. È l'unica risposta finora per coprire solo l'uso di GLSL, e se ciò fosse più efficace, anche con esempi di codice in tempo reale. – alan2here
@NicolBolas non era chiaro cosa stesse rispondendo a quale parte della domanda, ho riorganizzato del testo e segnalato per rendere le cose più chiare. – alan2here