2013-07-22 17 views
11

Non sono madrelingua inglese e quando cerco di utilizzare il wiki e le esercitazioni openGL su www.learnopengl.com, non è mai comprensibile dall'intuizione di come funziona l'intero concetto. Qualcuno può forse spiegarmi in modo più astratto come funziona? Cosa sono vertex shader e fragment shader e per cosa li usiamo?Cosa sono gli shader in openGL e per cosa ne abbiamo bisogno?

risposta

12

Il OpenGL wiki dà una buona definizione:

Uno Shader è un programma definito dall'utente progettato per funzionare su un certo punto di un processore grafico.

In passato, schede grafiche erano pezzi non programmabili di silicio che ha eseguito una serie di algoritmi fissi: punti/colori/luci si in, e un'immagine 2D uscito utilizzando un algoritmo fissa (tipicamente lungo https://en.wikipedia.org/wiki/Phong_reflection_model) .

Ma questo era troppo restrittivo per i programmatori che volevano creare molti effetti visivi diversi.

Così come la tecnologia avanzata, i fornitori di GPU ha iniziato permettendo alcune parti della pipeline di rendering per essere programmati linguaggi di programmazione come il GLSL.

Queste lingue vengono poi convertiti in semi-undocumented instruction sets che gira su piccoli "CPU" built-in quelle più recenti GPU.

Fino a non molto tempo fa, le lingue degli shader were not even Turing complete.

Il termine GPU per uso generico (GPGPU) fa riferimento a questa maggiore programmabilità delle GPU moderne.

Nel modello OpenGL, solo le fasi cristalline del seguente schema sono programmabili:

enter image description here

Image source.

Shaders prendono l'input dalla fase precedente tubazione (posizioni di vertice per esempio, i colori, e pixel rasterizzati) e personalizzare l'uscita alla fase successiva.

I due più importanti sono:

  • vertex:
  • frammento Shader:
    • ingresso: posizione 2D di tutti i pixel di un triangolo + (colore dei bordi o un'immagine texture) + lightining Parametri
    • uscita: il colore di ogni pixel del triangolo (se non è occlusa da un altro triangolo più vicino), solitamente interpolati tra vertici

il nome sha der non è molto descrittivo per le attuali architetture: "shader" in GLSL gestiscono anche posizioni di vertici, per non parlare di OpenGL 4.3 GL_COMPUTE_SHADER, che consente calcoli arbitrari completamente estranei al rendering, proprio come OpenCL.

TODO potrebbe OpenGL essere implementato in modo efficiente con OpenCL da solo, cioè rendendo tutti gli stadi programmabili? Naturalmente, ci deve essere un compromesso tra prestazioni e flessibilità.

Le prime GPU con shader hanno utilizzato hardware specializzato diverso per ombreggiatura di vertici e frammenti, poiché hanno carichi di lavoro molto diversi. Le architetture correnti tuttavia utilizzano un singolo tipo di hardware (fondamentalmente piccole CPU) per tutti gli shader, il che consente di risparmiare alcune duplicazioni hardware. Questo concetto è noto come: https://en.wikipedia.org/wiki/Unified_shader_model

enter image description here

Image source.

Per capire veramente gli shader e tutto quello che possono fare, devi guardare molti esempi e imparare le API. https://github.com/JoeyDeVries/LearnOpenGL per esempio è una buona fonte.

Nel moderno OpenGL 4, anche i programmi Hello World Hello utilizzano shader super semplici, invece delle vecchie API immediate deprecate come glBegin e glColor. Ecco un esempio: https://stackoverflow.com/a/36166310/895245

Una classica applicazione fresco di uno shader non banale sono ombre dinamiche:

Image source.

15

Shaders fondamentalmente si danno la corretta colorazione dell'oggetto che si desidera rendere, sulla base di diverse equazioni di luce. Quindi se hai una sfera, una luce e una macchina fotografica, la fotocamera dovrebbe vedere alcune ombre, alcune parti lucide, ecc., Anche se la sfera ha un solo colore. Gli shader eseguono i calcoli dell'equazione della luce per darti questi effetti.

Il vertex shader trasforma posizione 3D di ogni vertice nello spazio virtuale (il vostro modello 3d) al 2D coordinare in cui appare sullo schermo.

Lo shader frammento fondamentalmente si dà la colorazione di ogni pixel per effettuare i calcoli di luce.

+3

Quindi, ogni oggetto che stiamo per disegnare sullo schermo sta attraversando la cosiddetta "Pipeline di rendering" che consiste prima del vertice e poi dello shader di frammenti che con il calcolo rendono l'immagine generale. Ho ragione? – Tommz

+3

Sì, il vertex shader funziona per primo e lo shader del frammento funziona in un secondo momento. La pipeline di rendering ha diversi altri passaggi, come ritaglio, rasterizzazione, ecc. Http://www.opengl.org/wiki/Rendering_Pipeline_Overview – jh314

+0

Che cos'è Pixel Shader? È sinonimo di Vertex Shader? – anonymous