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
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:
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:
- ingresso: posizione dei punti nello spazio 3D
- uscita: proiezione 2D dei punti (utilizzando 4D moltiplicazione matrice).Vedi: https://stackoverflow.com/a/36046924/895245
- 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
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:
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.
- 1. Cosa sono ALL_BUILD e ZERO_CHECK e ne ho bisogno?
- 2. Marshalling: cos'è e perché ne abbiamo bisogno?
- 3. Cosa fa GLEW e perché ne ho bisogno?
- 4. Cosa sono i campionatori di ombre in OpenGL e quali sono gli usi possibili per loro?
- 5. PHP: quali sono i costrutti del linguaggio e perché ne abbiamo bisogno?
- 6. Shader compatibili OpenGL ES e OpenGL
- 7. Cosa sono gli oggetti impliciti? Cosa significa?
- 8. Che cosa sono gli script @section e a cosa serve
- 9. Cosa sono TestExecutionListeners e cosa fanno?
- 10. Cosa sono gli ombreggiatori Vertex e Pixel?
- 11. Cosa sono gli operatori sollevati?
- 12. Cosa sono gli oggetti immutabili?
- 13. Cosa sono gli oggetti differiti?
- 14. Cosa sono usati session_id, session_regenerate_id e session_name?
- 15. Che cosa passa i parametri a SQL e perché ne ho bisogno?
- 16. Cosa sono gli oggetti vista dizionario?
- 17. Cosa sono gli oggetti mock in Java?
- 18. Cosa sono aspnet50 e aspnetcore50?
- 19. Shader in WebGL vs openGL?
- 20. Cosa sono [e] in C#?
- 21. Shader per Android OpenGL ES
- 22. Cosa sono `+:` e `-:`?
- 23. Cosa ne pensi di ?? = operator in C#?
- 24. Come si analizzano gli shader OpenGL scritti in GLSL?
- 25. abbiamo bisogno di "unset" variabili in TCL?
- 26. Eventi .NET - Cosa sono gli oggetti mittente e EventArgs e?
- 27. OpenGL Shader vs CUDA
- 28. Cosa sono oaidl.idl e ocidl.idl?
- 29. perché abbiamo bisogno dell'interfaccia invece della classe e cosa stiamo ottenendo dall'interfaccia
- 30. OpenGL Compiled Shader era corrotto
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
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
Che cos'è Pixel Shader? È sinonimo di Vertex Shader? – anonymous