Real Time Shadingpercro.sssup.it/marcello/didattica/AA20082009/20_RTShading.pdfGLSL shaders in XVR....

Post on 04-May-2021

7 views 0 download

Transcript of Real Time Shadingpercro.sssup.it/marcello/didattica/AA20082009/20_RTShading.pdfGLSL shaders in XVR....

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