Upload
others
View
7
Download
0
Embed Size (px)
Citation preview
Real Time Shading
Real Time Shading
SommarioSommario
� dal software all'hardware e ritorno
– cenni storici
� la “pipeline” grafica
– com'era: la pipeline “fissa”
– com'è: la pipeline programmabile
� GLSL
– panoramica
– esempi
– integrazione in XVR
Real Time Shading
Software e hardware ISoftware e hardware I
Dal software all'hardware
� pro
– performance
� contro
– flessibilità
� requisiti:
– algoritmo maturo
– notevoli vantaggi computazionali
– rapporto costi/benefici
SW
HW
Real Time Shading
Software e hardware IISoftware e hardware II
Dall'hardware al software
� N.B.: programmabilità
di hardware specializzato
� pro
– flessibilità
� contro
– complessità
HW
SW
Real Time Shading
La discesa verso l'hardware ILa discesa verso l'hardware I
� struttura molto simile dei programmi 3d
� collo di bottiglia della rasterizzazione
– es. disegno di triangoli “pieni” a schermo
– texture mapping
� prima generazione (Voodoo 3dfx, TNT)
– supporto rasterizzazione in hardware
– 2 texture per poligono
Real Time Shading
La discesa verso l'hardware ILa discesa verso l'hardware I
WolfensteinWolfenstein 3D3D
QuakeQuake
Real Time Shading
La discesa verso l'hardware IILa discesa verso l'hardware II
� nuovi colli di bottiglia
– trasformazione dei vertici
– calcoli di illuminazione
� seconda generazione (GeForce2)
– salto di qualità:
supporto Transform & Lighting
Real Time Shading
La discesa verso l'hardware IILa discesa verso l'hardware II
QuakeQuake
QuakeQuake 33
Real Time Shading
Analisi del successoAnalisi del successo
� in entrambi i casi:
– algoritmi molto maturi
– vantaggio computazionale notevole
� parallelismo vincente:grandi quantità di operazioni similisu dati altamente indipendenti
– costi/benefici
� l'utente paga una scheda in piùma può finalmente avere grafica 3D sul serio
Real Time Shading
Come migliorare la qualitCome migliorare la qualitàà visiva?visiva?
� modelli di illuminazione più accurati?
– modello OpenGL di default troppo semplicistico
– ma non sempre interessa il realismo
� supporto a più modelli di illuminazione?
– ma quali? e quanti?
� supporto a tecniche ad hoc?
– strada seguita inizialmente
Real Time Shading
La crescente importanza delle textureLa crescente importanza delle texture
� non solo colori:
– environment mapping
– bump mapping
– normal mapping
– ecc.
� multitexturing
– combinare più texture su un oggetto
– laborioso combinarle in maniera “rigida”
Real Time Shading
ProgrammabilitProgrammabilitàà delle GPUdelle GPU
� vera soluzione: programmabilità
– lasciamo che siano i programmatori
a decidere cosa fare e come
� nascono le GPU (Graphics Processing Unit)
� vertici
� normali
� texture
coords
� textures
� ecc.
programma
Real Time Shading
Lo shadingLo shading
� to shade, ovvero “ombreggiare”:assegnare un colore
ai punti di una superficie
– a prescindere dal criterio
con cui viene operata questa scelta
� shading procedurale:shading mediante una funzione “di codice”
� shader:programma che implementaun particolare shading
Real Time Shading
Nel mondo Nel mondo ““offlineoffline””
� Il dominio di RenderMan
– standard messo a punto dalla Pixar
– shading molto potente
(non solo “illuminazione”)
Real Time Shading
La risalita verso il softwareLa risalita verso il software
� terza generazione
– programmabilità molto limitata
� linguaggio assembler
� limite di istruzioni
� molti altri limiti (accessi alle texture, etc.)
� quarta generazione
– programmabilità più flessibile
� linguaggi di alto livello
� limiti accettabili (ma diversi di GPU in GPU)
� e via dicendo: non si torna più indietro
Real Time Shading
La La risalitarisalita verso verso ilil softwaresoftware
QuakeQuake 33
DoomDoom 33
Real Time Shading
La GPU oltre la graficaLa GPU oltre la grafica
� mostruosa potenza delle GPU
� programmabilità dell'hardware
� usare la GPU al di fuori della grafica
– GPGPU – General-Purpose computing on GPU
� in realtà non tanto “general”
– particolarmente efficace solo in una ristretta
ma importante categoria di calcoli
� in futuro supporto esplicito nelle schede
Real Time Shading
La pipeline: com'era e com'è
Real Time Shading
Pipeline fissa (non programmabile)Pipeline fissa (non programmabile)
Nota: gli stadi sono in serie ma insiemi diversi di dati vi possono
passare in parallelo
Real Time Shading
1. Geometria1. Geometria
� punti, linee, poligoni
� specificabili in vari modi
– immediate mode (un vertice alla volta)
– vertex arrays
– display lists
– vertex buffers (in memoria video)
Real Time Shading
2. Operazioni sui vertici2. Operazioni sui vertici
� il famoso Transform & Lighting
– trasformazioni
� vertici: modelview e projection
� normali: rotazione
� texture coordinates: texture matrix
– illuminazione
� stabilito il colore (materiali, luci, ecc.)
� ogni vertice è indipendente in questo stadio
Real Time Shading
3. Montaggio delle primitive3. Montaggio delle primitive
� raggruppamento dei vertici richiestidalla primitiva corrente
– point: 1 vertice
– line: 2 vertici
– triangle: 3 vertici o 1 (fan e strip)
– quadriangle: 4 vertici o 2 (strips)
Real Time Shading
4. Elaborazione delle primitive4. Elaborazione delle primitive
� clipping
– sia clipping planes che view frustum
� possibile eliminazione primitive
� proiezione prospettica
� viewport transform
– ottengo le window coordinates
� backface culling
� altra possibile eliminazione
Real Time Shading
5. Rasterizzazione5. Rasterizzazione
� generazione di fragments
� N.B.: fragment != pixel
– un pixel può essere il risultato
di un'operazione fra più fragment
– un fragment può essere scartato
n vertici m fragments
Real Time Shading
6. Elaborazione dei 6. Elaborazione dei fragmentfragment
� texturing
– applicazione delle texture
� tantissime possibilità
– nebbia
Real Time Shading
7. Operazioni sui fragment7. Operazioni sui fragment
� scissor test
– si può scrivere in quest'area dello schermo?
� alpha test
– il fragment ha alpha > 0?
� stencil test
– simile allo scissor ma con maschera a piacere
� depth test
– il fragment è “davanti” alla destinazione?
� blending
– come combino il colore con ciò che è presente?
Real Time Shading
8. Operazioni sul framebuffer8. Operazioni sul framebuffer
� cosa vado effettivamente a scrivere?
– colore
� con colormask
– profondità
� con depthmask
– stencil
� con stencilmask
Real Time Shading
Pipeline fissa (non programmabile)Pipeline fissa (non programmabile)
Real Time Shading
Pipeline programmabilePipeline programmabile
� NB: texture memory accessibile dal vp!
Real Time Shading
Nuove possibilitNuove possibilitàà di rilievodi rilievo
� texture fetch dal vertex processor� displacement mapping
Real Time Shading
Vertex processorVertex processor
Real Time Shading
Vertex processor: INPUTVertex processor: INPUT
� Attributi (diversi per ogni vertice) comunicano valori, che cambiano frequentemente, dall’applicazione al vertex processor
– di default: glVertex, glNormal,glTexCoord, glColor...
– personalizzati: glVertexAttrib
� variabili uniformi (costanti per “grossi gruppi” di vertici)
comunicano valori che non cambiano frequentemente, dall’applicazione al vertex processor
– di default: matrici, informazioni di stato
– personalizzati: glUniform
Real Time Shading
Vertex processor: OUTPUTVertex processor: OUTPUT
� gl_Position
– coordinate omogenee in “clip space”
� variabili varying(verranno interpolate dal fragment processor
lungo la primitiva)
comunicano valori dal vertex processor al fragment
processor
– di default: gl_FrontColor, gl_TexCoord[i]...
– impostabili dall'utente
� es. notevole: normali
Real Time Shading
Fragment processorFragment processor
Real Time Shading
Fragment processor: INPUTFragment processor: INPUT
� variabili varying
(interpolate dallo stadio di rasterizzazione)
– di default: gl_Color, gl_TexCoord[i]...
– definite nel vertex shader
� variabili uniformi
– come per il vertex shader (comunicano valori che non
cambiano frequentemente, dall’applicazione al fragment
processor)
� variabili speciali
– gl_FragCoord, coordinate sullo schermo
– gl_FrontFacing
Real Time Shading
Fragment processor: OUTPUTFragment processor: OUTPUT
� gl_FragColor
– finalmente, colore RGBA del fragment
� gl_FragDepth
– opzionalmente anche la profondità
– di default calcolata automaticamente
� oppure può scartare il fragment
– utile per fare materiali “bucati” (es. ruggine)
Real Time Shading
Osservazioni sulla pipeline correnteOsservazioni sulla pipeline corrente
� 1 in, 1 out: non posso “generare” geometria
� ogni vertice è considerato singolarmente
– non ho informazioni topologiche, di prossimità
– non posso agire a livello di primitiva
� non posso stabilire direttamente
la posizione di un fragment sullo schermo
� le funzionalità della pipeline fissa
vanno riscritte se servono
� NB: vertici e fragment possono
essere eliminati dopo che li ho processati
Real Time Shading
Real Time Shading
PanoramicaPanoramica
� è il linguaggio di shading di OpenGL
– multipiattaforma
– estensione da OpenGL 1.5
– ufficialmente integrato da OpenGL 2.0
� molto simile ai concorrenti HLSL e Cg
� simile ad una versione semplificatae più rigida del C++
� compilato dal driver
Real Time Shading
Modello di esecuzioneModello di esecuzione
Real Time Shading
Vantaggi architetturaliVantaggi architetturali
� ~indipendenza dal motore di rendering(shading procedurale in generale)
– dal punto di vista del codice,
le funzionalità possono essere molto “ad hoc”
– riusabilità
– programmazione anche separata
� indipendenza dall'hardware(shading di alto livello in generale)
– uno shader in futuro va solo ricompilato
– nb: performance potenzialmente molto diverse
Real Time Shading
Breve panoramica sulla sintassiBreve panoramica sulla sintassi
� simile al C++ ma più severo sui tipi
– conversioni esplicite
– niente switch, goto, ecc.
– funzioni con in, out e inout per i parametri
� supportati solo i float
� nuovi tipi: vecN, matN, samplerND
– vettori con swizzle (.xyzw, .rgba, .stpq)
� nuovi qualifiers:– attribute (solo vertex), uniform, varying
� nutrita libreria di operazioni di base
Real Time Shading
Lo Lo ““Hello WorldHello World”” degli shaderdegli shader
[VERTEX SHADER]
void main() {
gl_Position = ftransform();
// equivale concettualmente a:
// gl_Position = gl_ModelViewProjectionMatrix *
// gl_Vertex;
}
[FRAGMENT SHADER]
void main() {
gl_Color = vec4(1.0, 0.0, 0.0, 1.0);
}
� la primitiva viene completamente rossa
Real Time Shading
GLSL shaders in XVR
Real Time Shading
Supporto in XVR Script EditorSupporto in XVR Script Editor
� a partire dalla serie 1.4.4 betasupporto ai file .sh con syntax highlight– scaricabile da wiki.vrmedia.it
� tre modi di usare gli shader– invocandoli esplicitamente da script
� impostando uno “stato” (valido per tutti gli oggetti)
� associandoli ad una particolare mesh
– integrandoli in un file AAMcon XVR Shader Editor (o manualmente)
� alcuni uniform sono inviatiautomaticamente da XVR
Real Time Shading
UsoUso esplicitoesplicito: : impostazioneimpostazione dellodello statostato
var sh = CVmShaderProgram(“prog.sh”);
var mesh = CVmNewMesh(“mesh.aam”);
sh.Start();
sh.SetParameter(“nome_uniform_a”, valore1);
sh.SetParameter(“nome_uniform_b”, valore2);
mesh.Draw(); // viene disegnata con lo shader
// ogni altra draw di altri oggetti verrà disegnata con lo shader
sh.Stop();
Real Time Shading
UsoUso esplicitoesplicito: : associazioneassociazione a mesha mesh
var mesh = CVmNewMesh(“mesh.aam”);
mesh.AddShader("basic.sh", 0, -2);
mesh.ActiveShader(true);
mesh.SetShaderParameter(0, “nome_uniform_a”,
valore1);
mesh.Draw(); // viene disegnata con lo shader
* -2 -> adds a new shader
* -1 -> adds a new pass
* N -> replaces pass N
subset number
Real Time Shading
Uso implicitoUso implicito
� una volta impostato lo shadernel file AAM è sufficiente disegnare la mesh
� var mesh = CVmNewMesh(“mesh.aam”);
mesh.Draw();
SHADERSnum: 1
SHADERBEGINnumPass: 1PASSname: sky.shnumP: 2numT: 1numGL: 2samplerCUBE Env 0 Mars.ddsvec3f cameraPosition 0.0 0.0 0.0glDisable 2929glDisable 2884ENDPASSSHADEREND
ENDSHADERS
MATERIALSMatCount: 1Mat# 0{
Name: 17 - DefaultClass: StandardAm: 0.5882 0.5882
0.5882Di: 0.5882 0.5882
0.5882Sp: 0.1000 0.1000
0.1000Tr: 0.0000Sh: 0.1000WS: 1.0000Sh: BLINNTx: Y{
FN: Mars.dds
…}TS: N
}ENDMATERIALS
GEOMETRY SmGEnabledNObj: 1NFrames: 1Animation_mode: NoneFrame: 0{
Obj: 0 Parallelep.04
Par: -1{MatID: 0
mesh.aam
Real Time Shading
Tool di supportoper la programmazione di shader
Real Time Shading
ATI RendermonkeyATI Rendermonkey
Real Time Shading
Typhoon Labs Shader DesignerTyphoon Labs Shader Designer
Real Time Shading
nVidia FX Composer (Cg)nVidia FX Composer (Cg)
Real Time Shading
Risorse onlineRisorse online
� www.opengl.org
– specifiche, link vari
� www.3dshaders.com
– sito dell'Orange Book
� developer.3dlabs.com
– documentazione varia
� www.lighthouse3d.com
– esempi e tutorial
� wiki.vrmedia.it
– esempi relativi ad XVR