Programmation des GPU avec GLSL

40
[email protected] - http://liris.cnrs.fr/~fournier Laboratoire d'InfoRmatique en Image et Systèmes d'information http://liris.cnrs.fr FRE 2672 Gabriel Fournier - 19/01/2006 Programmation des GPU avec GLSL Gabriel Fournier

description

Programmation des GPU avec GLSL. Gabriel Fournier. Plan. Le pipeline graphique Les types de shader Interaction application – shader Le langage GLSL Le rendu multi passe GPGPU. Pipeline Shaders Interaction GLSL Multi passe GPGPU. OpenGL 1.0. - PowerPoint PPT Presentation

Transcript of Programmation des GPU avec GLSL

Page 1: Programmation des GPU avec GLSL

[email protected] - http://liris.cnrs.fr/~fournier

Laboratoire d'InfoRmatique en Image et Systèmes d'informationhttp://liris.cnrs.fr

FRE 2672

Gabriel Fournier - 19/01/2006

Programmation des GPU avec GLSL

Gabriel Fournier

Page 2: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 2

Plan

Le pipeline graphique Les types de shader Interaction application – shader Le langage GLSL Le rendu multi passe GPGPU

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 3: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 3

OpenGL 1.0

API graphique entre le matériel et l’applicationGère

Caméra virtuelle (pyramide de vision, projection)Rastérisation, points, lignes, polygonesÉlimination des parties cachéesApplication de textures ‘Éclairement’, BRDF de Phong

Ne gère pasCalculs d’ombresRéflexionsÉclairement globalLa physique des scènes (collisions, mouvements…)

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 4: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 4

Pipeline classique

CPU Création du contexte (depth_buffer, double_buffer,color_depth…)

Initialisation (projection, pyramide de vision, sources…)

Paramétrage des primitives (modelview, textures,…)

Dessin des primitives (glBegin( ) )

Description des sommets (glColor( ),…, glVertex( ))

Pipeline du GPU: Traitement des vertex (sommets)

Transform & Lighting Assemblage des primitives

Sommets triangles Projection en 2D Rasterisation Traitement des fragments (~pixels)

Textures, couleurs, fog Opérations sur les fragments

Stencil, depth, blending

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 5: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 5

Pourquoi des GPU programmables ?

Pipeline classique figé et limité : Rendu : Éclairement calculé aux sommets Textures : bitmaps Projection : perspective ou parallèle.

Ça se joue au niveau du traitement des vertex et des fragments

Pipeline programmable : BRDF plus sophistiquées Textures procédurales matériaux plus réalistes Rendu non photo-réaliste Animation procédurale Traitement d’image Anti Alissage …

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 6: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 6

Exemples : images tirées de GLSL Overview, 3DLabs

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 7: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 7

Pipeline programmable

Pipeline du GPU programmableVertex Shader : Traitement des vertex (sommets)

Transform & LightingAssemblage des primitives

Sommets trianglesProjection en 2DRasterisationFragment Shader : Traitement des fragments (~pixels)

Textures, couleurs, fogOpérations sur les fragments

Stencil, depth, blending

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 8: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 8

Pipeline programmable

Exécution parallèlePlusieurs vertex (ou fragment) sont traités

simultanément par un même programme : SIMD

Flux de données dans un seul sensPas de variable globale en écriturePas de sortie en lecture/écriture

Traitement conditionnel (if) souvent coûteux.

Pas d’accès aux sommets voisinsPas d’accès aux pixels voisins

Pour certains effets : multi-passe

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 9: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 9

Langages

Plusieurs langagesCg : (Nvidia) 2002

Langage de haut niveau Indépendant de la plateforme DirectX, OpenGLCompilateur externe

HLSL : (Microsoft) 2003Langage de haut niveauUniquement pour DirectX

GLSL : (3DLabs, OpenGL) 2004Langage de haut niveauUniquement pour OpenGLCompilateur interne intégré à OpenGL

Assembleur :Bas niveau, faible lisibilité

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 10: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 10

Vertex Shader

Opérations traditionnelles Transformation spatiale des sommets et des normales Calcul des coordonnées dans la texture Éclairement

Entrées Attribute variables : associées à chaque sommet

Traditionnelles: gl_Color, gl_Normal, gl_Vertex, gl_MultiTexCoord0,…

Définies par l’utilisateur Uniform variables : associées au programme

Traditionnelles : gl_ModelViewMatrix, gl_FrontMaterial, gl_LightSource0, …

Définies par l’utilisateur Textures

Sorties Spéciales : gl_position, gl_PointSize, gl_ClipVertex

Varying variables :

entrée du fragment shader, interpolées entre les sommets Traditionnelles : gl_FrontColor, gl_BackColor, gl_FogFragCoord,…

Définies par l’utilisateur

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 11: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 11

Fragment Shader

Opérations traditionnellesOpérations sur les valeurs interpoléesApplication des texturesCalcul de la couleur du pixel

Entrées :Varying variables : interpolées entre les sommets

Traditionnelles : gl_color, gl_SecondaryColor, gl_TexCoord0,…

Définies par l’utilisateurSpéciales : gl_FragCoord, gl_FrontFacingUniform variables : associées au programme

Les mêmes que pour le vertex shaderTextures

Sorties :gl_FragColor, gl_FragDepth

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 12: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 12

Interactions:

Vertex Attribute variables

Program Uniform variable

Textures

Vertex Shader

Varying variables

Fragment Shader

Color, Depth

Rasterisation

Depth, Stencil Tests

Textures

Program Uniform variable

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 13: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 13

Exemple//Vertex Shaderuniform float temp_min;uniform float temp_max;

attribute float vertex_temp;

varying float temperature;

void main(){

temperature = (vertex_temp-temp_min)/(temp_max-temp_min);gl_position = gl_ModelViewProjectionMatrix * gl_Vertex;

}

//Fragment Shaderuniform vec3 col_froid;uniform vec3 col_chaud;

varying float temperature;

void main(){

vec3 color = mix(col_froid,col_chaud,temperature);gl_FragColor = vec4(color,1.0);

}

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 14: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 14

OpenGL API : Shader and Program

ShaderObject Équivalent à un .o en C Un même Shader peut être découpé en modules dans plusieurs

ShaderObject Création

GLhandleARB glCreateShaderObjectARB(GLenum shaderType) Chargement

void glShaderSourceARB(GLhandleARB shader, GLuint nstrings,                         const GLcharARB **strings,

GLint *lengths) Compilation

void glCompileShaderARB(GLhandleARB shader)

Program Équivalent à l’exécutable Création

GLhandleARB glCreateProgramObjectARB(void) Rattachement

void glAttachObjectARB(GLhandleARB program,  GLhandleARB shader) Linkage

void glLinkProgramARB(GLhandleARB program) Insertion dans le pipeline

void glUseProgramObjectARB(GLhandleARB program)

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 15: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 15

GLSL : qualifiers

Variables qualifiées de Attribute :

Changent typiquement pour chaque sommet Uniquement dans Vertex Shader Read Only Seulement float, vecX et matX (pas d’int ni de bool)

Uniform : Changent au plus à chaque primitive Communes au Vertex et Fragment Shader Read Only

Varying : Communication entre Vertex et Fragment Shader Read, Write dans Vertex Shader Read Only dans Fragment Shader

Const : Constantes locale à un Shader Read Only

Sans qualifieur: Variables locales à un Shader (une seule exécution) Read, Write

PAS de variables static !

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 16: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 16

GLSL : types

Types: Scalaires : float, int, bool

Entiers pas forcément représentés matériellement Au moins 16 bits, pas de << & …

Vecteurs : Float : vec2, vec3, vec4 Int : ivec2, ivec3, ivec4 Bool : bvec2, bvec3,bvec4 Accès avec (équivalents, juste pour la lisibilité)

.x, .y, .z, .w ou .r, .g, .b, .a ou .s, .t, .p, .q

Matrices de float : mat2, mat3, mat4 Mat4 m; vec4 v=m[0]; float f=m[0][0];

Samplers : Accès aux textures. Toujours qualifiés uniform sampler1D, sampler2D, sampler3D, samplerCube, sampler1DShadow,

sampler2DShadow

Structures : comme en C, pas besoin de typedef Tableaux : taille pas forcement précisée à la déclaration mais connue à la

compilation Pas de promotion de type :

float a=3;//FAUX float a=3.0; Conversions : float a=float(3); vec4 b=vec4(3);//tous à 3

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 17: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 17

OpenGL API : interaction avec le shader

Spécification des attributs des sommets glColorXX(…) gl_color , …. glVertexAttribXXARB(GLuint index, …) attribut générique Pour envoyer le sommet, on finit par :

glVertexXX(…) ou glVertexAttribXXARB(0, …)

Lien entre attributs génériques et variables attributs du Shader glBindAttribLocationARB(GLhandleARB program, GLuint index, 

const GLcharARB *name) glBindAttribLocation(shader_id,1, ’’couleur ’’);

GLint glGetAttribLocationARB(GLhandleARB prog, const GLcharARB *name)

Disponible après le linkage , -1 si erreur

On peut utiliser les vertex arrays void glVertexAttribPointerARB(GLuint index,  GLint size,

  GLenum type, GLboolean normalized, 

                              GLsizei stride, const GLvoid *pointer)

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 18: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 18

OpenGL API : Interaction avec le Shader

Spécifications des variables uniformes GLint glGetUniformLocationARB(GLhandleARB program, 

                              const GLcharARB *name) Après le linkage, -1 si erreur

glUniformXXARB(GLuint location, … ) glUniformMatrix (GLuint location, GLint location, 

                                 GLuint count, GLboolean transpose,                                  const GLfloat *v );

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 19: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 19

Au travail !Créer un ShaderProgram contenant les programmes suivants.Dessiner un triangle en passant une température différente à chacun de ses

sommets

//Vertex Shader : temp_vs.txtuniform float temp_min;uniform float temp_max;

attribute float vertex_temp;

varying float temperature;

void main(){

temperature = (vertex_temp-temp_min)/(temp_max-temp_min);gl_position = gl_ModelViewProjectionMatrix * gl_Vertex;

}

//Fragment Shader : temp_fs.txtuniform vec3 col_froid;uniform vec3 col_chaud;

varying float temperature;

void main(){

vec3 color = mix(col_froid,col_chaud,temperature);gl_FragColor = vec4(color,1.0);

}

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 20: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 20

Exemple : Création des shadersGLhandleARB prog=glCreateProgramObjectARB();GLhandleARB

vertex_s=glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);GLhandleARB

fragment_s=glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);

char* src=readFile(‘’vertex.txt’’);glShaderSourceARB(vertex_s,1,(const GLcharARB**)&src,NULL);glCompileShaderARB(vertex_s);

src=readFile(‘’fragment.txt’’);glShaderSourceARB(fragment_s,1,(const GLcharARB**)&src,NULL);glCompileShaderARB(fragment_s);

glAttachObjectARB(prog,vertex_s);glAttachObjectARB(prog,fragment_s);glLinkProgramARB(prog);

int r=0;glGetObjectParameterivARB(prog,GL_OBJECT_LINK_STATUS,&r);

glUseProgramObjectARB(prog);

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 21: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 21

Exemple : Attachement des paramètresint temp_min_uni, temp_max_uni, col_min_uni, col_max_uni;int temp_att;

temp_min_uni=glGetUniformLocationARB(prog,’’temp_min’’);temp_max_uni=glGetUniformLocationARB (prog,’’temp_max’’);col_min_uni=glGetUniformLocationARB (prog,’’col_froid’’);col_max_uni=glGetUniformLocationARB (prog,’’col_chaud’’);

temp_att=glGetAttribLocationARB(prog, ’’temperature’’);

glUniform1fARB(temp_min,-10);glUniform1fARB(temp_max,30);glUniform3fARB(col_min,0,0,1);glUniform3fARB(col_min,1,0,0);

glBegin(GL_TRIANGLE);glVertexAttrib1fARB(temp_att,-5);glVertex3f(0,1,0);glVertexAttrib1fARB(temp_att,5);glVertex3f(-1,0,0);glVertexAttrib1fARB(temp_att,15);glVertex3f(1,0,0);glEnd();

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 22: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 22

GLSL : le langage

Opérateurs: +, -, *, /, ++, --

Terme à terme sauf : mat * vec, vec*mat (=vec) et mat * mat matrixcompmult(mat,mat) : terme à terme

<=, >=, <, > sur int et float scalaire ==, != terme à terme sur tous les types sauf les tableaux &&, ||, ^^ sur bool (scalaire), (pas d’opérateur bits à bits) =, +=, -=, *=, /=, ?: lessThan(vec, vec), lessThanEqual, equal, notEqual,

greater, greaterThan : terme à terme sur les vecteurs any(bvec), all(bvec), not(bvec)

Indexing et swizzling [n] sur tableau, vec, mat: accède au n-ième élément . permute les éléments :

ivec4 a=ivec4(1,2,3,4); a.wzyx est égal à {4,3,2,1}

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 23: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 23

GLSL : le langage

Fonctions cos, sin, tan, acos, asin, atan, radians, degrees pow, exp2, log2, sqrt, inversesqrt abs, sign, floor, ceil, fract, mod, min, max, clamp, step,

smoothstep length, distance, dot, cross, normalize, faceforward, reflect noise (non disponible sur la plupart des cartes)

Structures de contrôle: if, if-else for, while, do-while return, break, discard

Fonctions Paramètres qualifiés : in, out, inout, par défaut : in.

void calcu_coord(in vec3 pos, out coord)

Programme principale: void main()

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 24: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 24

Les textures

Dans l’applicationChoisir une unité de texture : glActiveTexture( )Créer une texture et l’associer à l’unité de texture

glBindTexture( )Fixer les paramètres (wrapping, filtering) :

glTexParameter ( )Associer une image glTexImage ( ) Initialiser le sampler du shader : glUniform1i( )

Dans le Shader :Déclarer un uniform de type Sampler (sampler1D,

sampler2D, sampler3D, samplerCube, samplerShadow1D, samplerShadow2D)

Pour accéder à un élement de la texture utiliser la fonction textureXXX (texture1D, …)

texture2D(sampler, coord);

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 25: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 25

Programmation

Développez petit à petit et testez souvent!Débuggage très difficile (pas de printf !)

OptimisationRéfléchissez au meilleur endroit pour placer un

calcul:Vertex shader : 1x par sommetFragment shader : 1x par fragment : beaucoup plus

souvent !Si un paramètre change

Vite : fragment shaderLentement : vertex shaderRarement : CPU uniform

Textures pour encoder les fonctions trop complexesUtilisez les fonctions fournies plutôt que de les re-

développez.Choisissez la bonne fonction : inversesqrt a des

chances d’être plus rapide que 1/sqrt.

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 26: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 26

Au travail !

Color=AmbientColor+

DiffuseColor * ( N. L )+

SpecularColor * ( V. R )^n

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 27: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 27

Calcul par vertex void main() {

gl_Position= gl_ModelViewMatrix* gl_Vertex;vec3 N = normalize(gl_NormalMatrix* gl_Normal);vec3 L = normalize(gl_light[0].position);

gl_FrontColor=gl_FrontMaterial.diffuse*gl_LightSource[0].ambient ;float diffuse = dot(N, L);If (diffuse>0){

gl_FrontColor+= gl_FrontMaterial.diffuse * diffuse *gl_LightSource[0].diffuse;

vec3 R = reflect(-L, N); vec3 V = normalize(-gl_Position.xyz); float specular= dot(V, R);if (specular>0)

gl_FrontColor+= gl_FrontMaterial.specular * pow(specular, gl_FrontMaterial.shininess)*gl_LightSource[0].specular ;

}gl_Position= gl_ProjectionMatrix* gl_Position;

}

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 28: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 28

Phong par pixels

Par sommet : on interpole la couleur linéairement entre chaque sommet

Par pixel : Le vertex programme calcule une normale dans le

repère de l’oeil Le fragment programme reçoit une normale

interpolée et réalise le calcul complet avec cette normale

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 29: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 29

Le rendu multi passes

Problèmes types:Filtres : besoin d’accéder aux pixels voisinsRendu HDR et tone mapping :

le rendu s’effectue 128 bits (on ne peut pas l’afficher)Séparation du rendu et du tone mapping

Deffered shading : shader très complexe,1ere passe : rendu rapide dans plusieurs buffers

(position, normale, paramètre…)2nd passe : calcul de l’éclairement uniquement pour les

pixels réellement affichésTextures dynamiques (réflexions, …)

Pixel Buffers (lourds, dépendants du système) Frame Buffer Object (FBO)

Contexte de rendu hors écranAssociable à une textureChangement de FBO rapide

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 30: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 30

Frame Buffer Object

FBO Contient des buffers de couleurs, stencil, profondeur Multiple render target (MRT) Associable à une texture

Render Buffer Comme FBO, non associé à une texture Read/Write Pixels

Usage (performences décroissantes):Unique FBO, plusieurs textures attachées :

glDrawBufer() pour changer de destinationUnique FBO, plusieurs textures attachées :

FramebufferTexture() pour changerMultiples FBO : BindFramebuffer() pour changer

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 31: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 31

API des FBO

Création

void glGenFramebuffersEXT (sizei n, uint *framebuffers) ;

void glDeleteFramebuffersEXT(sizei n, uint *framebuffers) ;

Association comme contexte de rendu

void glBindFramebufferEXT(enum target, uint framebuffer);

target =FRAMEBUFFER_EXT, framebuffer =0 : window,= id du fbo

Vérification de l’état

enum glCheckFramebufferStatusEXT(enum target); FRAME_BUFFER_COMPLETE

Association d’une texture au FBO

void glFramebufferTexture2DEXT(enum target, enum attachment, enum

textarget, uint texture, int level);

target= FRAMEBUFFER_EXT, attachment = COLOR_ATTACHMENT0_EXT, DEPTH_ATTACHMENT_EXT …

textarget=TEXTURE2D,TEXTURE_RECTANGLE,…

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 32: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 32

Exemple

GLuintfb, depth_rb, tex;glGenFramebuffersEXT(1, &fb);glGenTextures(1, &tex);

glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fb);glBindTexture( GL_TEXTURE_2D, tex);glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0,

GL_RGBA, GL_UNSIGNED_BYTE, NULL);

glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0);

glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fb);RENDU DANS LA TEXTURE

glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0);glBindTexture( GL_TEXTURE_2D, tex);RENDU DANS LA FENETRE AVEC LA TEXTURE

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 33: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 33

GPGPU: General Programming on GPU Utiliser la puissance du GPU:

PIV 3Ghz : 12 GFLOPS GeForce6 : 53 GFLOPS (pub Nvidia sur un shader inutile)

Problèmes API liée au graphisme Architecture parallèle Changement du matériel et de l’API fréquent Interface avec le CPU lente

Modèle de programmation: Stream : données devant subir un même traitement Kernel : traitement à appliquer

Implémentation Stream : texture Kernel : fragment program sur un Quad couvrant l’ecran Feed back : Render To Texture (FBO) Enchaînement de passes pour faire progresser les calculs

Langages dédiés : Brook et Sh

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 34: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 34

Exemple d’usage non standard du GPU - échantillonnage

Objet à ombrer

Bloqueur

Source de lumière

Image

Pyramide de vision

Lancer de rayons

GPU

Nb échantillonsT

emps

Calcul de la visibilité par le GPU Fin du calcul sur le CPU

Pondération de chaque pixel Source surfacique quelconque

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 35: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 35

L’échantillonnage perturbé (jittered sampling)

12 pixels dans la source 16 pixels dans la source

14 pixels dans la source

Échantillonnage régulier

Bandes dans les ombres

Échantillonnage perturbéPerturbation aléatoire ou quasi aléatoireLancer de rayons : facileGPU: pas prévu

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 36: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 36

Éclairement direct

Échantillonnage régulier

48x48 x1

Bandes

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 37: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 37

Éclairement direct

Échantillonnage perturbé

48x48 x1

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 38: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 38

Fragment program

Rastérization dans le Fragment Program Test d’appartenance d’un fragment au triangle

Projection non linéaire Perturbation du centre du

fragment avec les dérivées

DDX et DDY Dilatation du triangle dessiné

A

B

C

P

R

DDY(αP,βP)

DDX(αP,βP)(αP,βP)

(0,0)

(1,0)

(0,1)

Fragment

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 39: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 39

Fragment program

Rastérization dans le Fragment Program Test d’appartenance d’un fragment au triangle

Ad

Bd

Cd

Fragment

Triangle à dessiner

A

B

C

P

R

DDY(αP,βP)

(αP,βP)

(0,0)

(1,0)

(0,1)

Triangle dilaté

Projection non linéaire Perturbation du centre du

fragment avec les dérivées

DDX et DDY Dilatation du triangle dessiné

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU

Page 40: Programmation des GPU avec GLSL

19/01/2006 Gabriel Fournier 40

Le futur

DirectX 10 : Shader Model 4 Geometry shader :

Crée de la géométrie Combine les sommets en triangles

Random Random Access Access ReadsReads

Input AssemblerInput Assembler

Vertex ShaderVertex Shader

TessellatorTessellator

Vertex ShaderVertex Shader

SerialSerialAccessAccessStreamsStreams Geometry ShaderGeometry Shader

RasterizerRasterizer

Pixel ShaderPixel Shader

Render TargetRender Target

ReusableReusableStreamStreamOutputOutputReusableReusable

StreamStreamOutputOutput

Opt

ion

alO

ptio

nal

Pipeline

Shaders

Interaction

GLSL

Multi passe

GPGPU