• Benvenuto in Making Videogames!
  • Dai sfogo alla tua fantasia!
  • Crea il tuo Videogioco!
Benvenuto ospite! Login Registrati




Valutazione discussione:
  • 1 voto(i) - 5 media
  • 1
  • 2
  • 3
  • 4
  • 5
Tutorial 10 - Shaders
#2
Programmazione degli Shader.

Come vago approfondimento diciamo che gli shader sono essenzialmente di due tipi.

I vertex shader sono comandi interpretati direttamente dalle schede grafiche che lavorano sui vertici delle geometrie nelle nostre scene, tipicamente sono usati per modificarne le coordinate, il colore o l'illuminazione. tipici esempi sono gli shader che generano l'ondulazione di una bandiera o di una superficie d'acqua.

I pixel shader sono invece più 'fini' poiché lavorano sui singoli pixel in uscita dal rendering, infatti sono tipicamente usati per effetti come il bump map, il fresnel, la diffrazione o per generare ombre. Per questo sono considerati più potenti ma anche più pesanti.

Introdotti a partire dalle DirectX8 con lo shader level1 bisognava programmarli tramite un linguaggio simile all'Assembler (nel tutorial che è datato infatti viene menzionata questa possibilità).

Si sono susseguite le versione level2 e level3 fino alle DX9, poi con le DX10 è arrivata la level4 e con el DX11 la level5. Grosso modo vengono sempre aumentati il numero di istruzioni compilabili (128.. 512.. dalla level4 sono illimitate) il numero di registri e la complessità delle strutture interne e delle istruzioni per gestirle (quasi delle macro).

OpenGL ha seguito un percorso analogo e parallelo. I pixel shader sono anche detti fragment shader. La numerazione delle versioni agli inizi era meno lineare rispetto alle DirectX, si parte dalla versione 1 con le OpenGL2.0, la versione 1.50 con le OpenGL3.2; poi dalla versione 4 si sono allineati a quella delle OpenGL. Oggi abbiamo gli shader GLSL 4.50 e OpenGL 4.5.

Subito dopo il linguaggio simil-assembly ognuno ha proposto un proprio linguaggio vagamente basato sul C. Per le OpenGL abbiamo il GLSL, per le DirectX abbiamo HLSL. Fino al 2012 Nvidia supportava un proprio linguaggio il Cg che offriva anche tools con la particolarità di generare un output compatibile per i due linguaggi precedenti.

La programmazione degli shader è considerata un'arte a se, spesso si trovano richieste specifiche di programmatori di solo shader.

Un GLSL vertex shader che volesse scalare i vertici sulla x e y potrebbe essere questo:

Codice PHP:
void main(void)
{
   
vec4 a gl_Vertex;
   
a.a.0.5;
   
a.a.0.5;
   
gl_Position gl_ModelViewProjectionMatrix a;


Il trucco sta nella gl_Position che è una struttura 4D che indica la posizione finale del vertex e nel gl_Vertex che invece è l'attributo contenente la posizione attuale del vertex. Lo salviamo un un vettore di 4 elementi (x,y,z,w), scaliamo riducendo della metà le coordinate e le riportiamo con la matrice gl_ModelViewProjectionMatrix che sarebbe la concatenazione del modelview e della matrice di proiezione (comunque è una struttura deprecata, prendete tutto col beneficio d'inventario perché dalla versione 4 del GLSL ha cambiato molte strutture).

Invece se volessimo impostare a verde un pixel con un pixel shader GLSL poco prima che venga renderizzato in 2d basterebbe agire sul valore del gl_FragColor.
Codice PHP:
void main (void)  
{     
   
gl_FragColor vec4(0.01.00.01.0);  


Inutile ripetere che si tratta di un aspetto molto avanzato, i comuni engine offrono già una serie di shader preimpostati (e anche più sicuri) e anche un linguaggio proprietario con cui garantire la portabilità rispetto alla libreria di rendering adottata. Per cimentarsi nella loro programmazione consiglio di essere sempre aggiornatissimi e di leggere parecchi tutorial e le risorse ufficiali di DX e OpenGL, vi garantisco che sarà una esperienza piuttosto snervante. Angel
 
Rispondi
  


Messaggi in questa discussione
Tutorial 10 - Shaders - da Chip - 16-08-2015, 08:34 PM
RE: Tutorial 10 - Shaders - da Chip - 16-08-2015, 09:06 PM
RE: Tutorial 10 - Shaders - da AltairRevenge - 17-08-2015, 06:42 PM

Vai al forum:


Browsing: 1 Ospite(i)