Groupe de Travail Introduction GPU/GLSL

Slides:



Advertisements
Présentations similaires
( Application Programming Interface)
Advertisements

Programmation Orienté Objet en C++
DirectX Guillaume Randon Microsoft Services
Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation.
The Reyes Image Rendering Architecture
Rendu 3D temps réel Patrick Reuter
Université de Bordeaux I DESS IMM Synthèse d’images
C++ 6ème cours Patrick Reuter maître de conférences
C++ 5ème cours Patrick Reuter maître de conférences
SI3 MAM3 Hydro Nathan Cohen Igor Litovsky Christophe Papazian
Formation C débutant. Notion de compilation source.c executable Phase de compilation Fichier de texte brut, inexploitable directement par la machine Fichier.
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
Cours n° 8 Conception et Programmation à Objets
IMAGIS-GRAVIR / IMAG Rendu de forêts en temps-réel iMAGIS / GRAVIR Franck Sénégas DEA IVR Tuteur: Fabrice Neyret.
Liste générique dans Linux 2.6 Source : Understanding the Linux kernel Chap3 processes p.87.
Introduction à RRDTool
جامعــــــة محمد خيضــــــــــــر
GTI 350 Travail pratique Android sur tablettes Xoom de Motorola.
Introduction à la programmation (420-PK2-SL) cours 15 Gestion des applications Technologie de linformation (LEA.BW)
1 Visualisation avec OpenGL Jérémie Allard 4 Novembre 2002.
Connexion base de données
Programmation des logiciels infographiques interactifs 2D et 3D, et le OpenGL.
INTRODUCTION A MATLAB ENVIRONNEMENT MATLAB.
Programmation de cartes graphiques
BlueJ_XI 1 Java, les objets : tout de suite ! Gestion des erreurs : les exceptions Notes de cours associées au chapitre 11 tutorial BlueJ
– Search Marketing et Marketing Interactif 1 ère Position – David Degrelle Tel : ou
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Approche mémoire partagée Threads – Paradigme de lapproche – Objets exécutés par les processeurs threads vs processus, – un thread possède : Ses registres,
IFT3355: Infographie Projections
SUJETS SPÉCIAUX EN INFORMATIQUE I PIF Contenu du cours Transformations géométriques des objets –Transformations 2D –Transformations entre systèmes.
Master 1 SIGLIS java Lecteur Stéphane Tallard Chapitre 4 – Structures de contrôle.
Historique de SystemC Regroupe 4 courants didées: SCENIC Project : Synopsys+UC Irvine Philips System-Level Data Types, VSIA SLD DWG IMEC, Hardware-Software.
Langage Oriente Objet Cours 2.
Optimisation et parallélisation de code pour processeur à instructions SIMD multimedia François Ferrand.
Transformation linéaires
Modélisation géométrique à l’aide d’un maillage
Ombres en temps-réel Nicolas Holzschuch Cours dOption Majeure 2
Images synthètiques de haute qualité
Contrôle de types Les types en programmation Expressions de types Un contrôleur de types Equivalence de types Conversions de types Généricité.
Passage entre quaternions et matrice des cosinus directeurs Transition from Quaternions to Direction Cosine Matrices.
Multi-Thread Jian-Yun Nie
IFT3730 : Infographie 3D Systèmes et modèles graphiques Pierre Poulin, Derek Nowrouzezahrai Hiver 2013 DIRO, Université de Montréal.
IFT2740 : Outils de l'infographie 3D Systèmes et modèles graphiques
Marketing électronique Cours 5 La personnalisation.
OpenCV: Introduction au Traitement d’Images et Vidéo
Formation Développeur Java Applet et interfaces graphiques avec AWT
Introduction au Langage C
CSI2520 Le langage Scheme (2) Un langage de programmation fonctionnelle.
Initiation à la programmation en Python
Techniques de points de contrôle en OpenGL : formes de Bézier
IFT3355: Infographie Transformations Géométriques
IFT3355: Infographie Pipeline graphique
PROTOTYPE D’UN PROGRAMME ÉCRIT EN C++ BASÉ SUR OPENGL
Structures de données IFT-2000
Plan cours La notion de pointeur et d’adresse mémoire.
Première CTP le 4 décembre Nouvelle CTP depuis le 1 er février RTM milieu de cette année.
Traitement d’images sur carte 3D
2.1 - Historique Chapitre 2 : Introduction au langage C++
LES PILES ET FILES.
Les images de synthèses Duprat Anatole. Les images de synthèses consistent en la création assistée par ordinateur, d'images numériques. Il existe différentes.
Projet Lancer de Rayons
OpenGL Shading Language Introduction. But de ce cours  Non-buts  Spécialistes GLSL  Experts en GLSL  Exploration du pipeline graphique  Séparation.
GRAPHISME PAR ORDINATEUR SIF Contenu du cours 10 Textures –Définir la texture –Superposition d’une texture sur une surface plane –Superposition.
Classe 1 CSI2572 Autres modificateurs de déclaration de variables: & volatile & register & static & auto & extern & const volatile Indique au compilateur.
B.Shishedjiev - Affectation1 Expressions et affectation Comment produire des nouvelles valeurs.
Architecture et Fonctionnement d’un GPU Géométrie Rendu.
PRO-1027 Programmation Scientifique en C
Portage d'une application sur GPU CreditCruncher.
Synthèse d’images Antoine Bouthors
Les Processeurs Graphiques Programmables
Transcription de la présentation:

Groupe de Travail Introduction GPU/GLSL Sébastien Barbier Laboratoire Jean Kuntzmann/EVASION Grenoble sebastien.barbier@inrialpes.fr

Plan Historique Fonctionnalités des cartes graphiques GLSL Communications CPU  GPU Rendu Off-Screen GPGPU

Plan Historique Fonctionnalités des cartes graphiques GLSL Communications CPU  GPU Rendu Off-Screen GPGPU

Motivations Le CPU s’occupe : Le GPU doit vérifier : Simulation physique, Intelligence Artificielle, Son, Réseau… Le GPU doit vérifier : Accès mémoire rapide Nombreux accès [ vertices, normal, textures, … ] Une bonne bande passante Go/s au meilleur cas Une grande force de calcul Flops = Floating Point Operations [ ADD, MUL, SUB, … ] Illustration: matrix-vector products (16 MUL + 12 ADD) x (#vertices + #normals) x fps = (28 Flops) x (6.000.000) x 30 ≈ 5GFlops

Motivations Interactivité : 15-60 fps Haute Résolution

Pipeline Graphique Application Geometry Processing Rasterization LOD selection Frustum Culling Portal Culling … Application Modelview/Projection tr. Clipping Lighting Division by w Primitive Assembly Viewport transform Backface culling Geometry Processing Scan Conversion Fragment Shading [Color and Texture interpol.] Frame Buffer Ops [Z-buffer, Alpha Blending,…] Rasterization Output to Device Output

Pipeline Graphique Application Geometry Processing Rasterization LOD selection Frustum Culling Portal Culling … Application Programmable Clipping Division by w Viewport transform Backface culling VERTEX SHADER Geometry Processing GEOMETRY SHADER Scan Conversion Rasterization FRAGMENT SHADER Output to Device Output

Shaders ( x, y, z, w ) ( x’, y’, z’, w’ ) ( nx, ny, nz ) ( s, t, r, q ) ( r, g, b, a ) VERTEX SHADER ( x’, y’, z’, w’ ) ( nx’, ny’, nz’ ) ( s’, t’, r’, q’ ) ( r’, g’, b’, a’ ) ( x, y ) ( r, g, b, a ) ( depth ) GEOMETRY SHADER ( x, y ) ( r’, g’, b’, a’ ) ( depth’ ) FRAGMENT SHADER

Plan Historique Fonctionnalités des cartes graphiques GLSL Communications CPU  GPU Rendu Off-Screen GPGPU

Pipeline Graphique

Fonctionnalités des cartes graphiques Shaders On agit au niveau local : Vertex shader : un sommet à la fois On ne connaît pas les sommets voisins

Fonctionnalités des cartes graphiques Shaders On agit au niveau local : Geometry shader : une primitive à la fois On ne connait que les sommets de la primitive courante On peut aussi connaître ses voisins

Fonctionnalités des cartes graphiques Shaders On agit au niveau local : Pixel shader : un pixel à la fois On ne connaît pas les pixels voisins Au mieux, variation d’une valeur par rapport au pixel d’à côté

Fonctionnalités des cartes graphiques Shaders Ce qu’on peut faire Au niveau des sommets : Des transformations/projections Des calculs de coordonnées de textures Des calculs d’illumination, de couleurs ( x, y, z, w ) ( nx, ny, nz ) ( s, t, r, q ) ( r, g, b, a )

Fonctionnalités des cartes graphiques Shaders Ce qu’on peut faire Au niveau des primitives : Ajouter/Supprimer des sommets Modifier les primitives Récupérer directement la géométrie sans “tramage”.

Fonctionnalités des cartes graphiques Shaders Ce qu’on peut faire Au niveau des pixels : La même chose qu’aux sommets, mais par pixel Utiliser le contenu de textures dans des calculs Changer la profondeur des pixels

Fonctionnalités des cartes graphiques Shaders Ce qu’on ne peut pas (encore ?) faire Modifier le tramage (rasterizer) Modifier la composition (output merger) Lire le buffer de dessin sur la fenêtre

Plan Historique Fonctionnalités des cartes graphiques GLSL Communications CPU  GPU Rendu Off-Screen GPGPU

GLSL Types de base Flottants, entiers, booléens Vecteurs 2,3,4 float, bool, int, unsigned int Vecteurs 2,3,4 [b,u,i]vec{2,3,4} Matrices 2x2, 3x3, 4x4 mat{2,3,4} Accesseurs de textures sampler{1,2,3}D, samplerCube, samplerRect, (et plein d’autres !!) Structures struct my_struct { int index; float value}; Tableaux int array[5];

GLSL Entrées Built-in : tous les états d’OpenGL, passés par OpenGL Position (glVertex3fv, …) Couleurs (glColor4f, …) Directions des lumières (glLighiv, …) Textures flottantes ou entières (glTexCoord[1|2|3][i|f], …) Matrices (glMatrixMode, …) Matériaux (glMateriali, …) Attribute : passés par le programme OpenGL Peuvent varier pour chaque sommet (couleurs, textures, normales, …) Uniform : passés par le programme OpenGL Ne varie pas entre glBegin/glEnd (matrices, textures, lumières, …) Varying : échanges entre les différents shaders In : d’entrées Out : de sortie Constant : constant au sein des shaders

GLSL Entrées built-in Vertex/Geometry shader : Fragment shader : Position : gl_Vertex Couleurs : gl_Color, gl_SecondaryColor Normale : gl_Normal Coordonnées de textures : gl_MultiTexCoordn Fragment shader : gl_FragCoord : coordonnées du pixel dans la fenêtre gl_Color : couleur du pixel interpolée gl_TexCoord[] : coordonnées de textures interpolées gl_FrontFacing : face ou dos du triangle

Vertex/Geometry shader : GLSL Sorties Vertex/Geometry shader : gl_Position : position du sommet en coordonnées homogènes (obligatoire) gl_PointSize : taille d’un point en rendu par point gl_FrontColor, gl_BackColor : couleurs gl_TexCoord[] : coordonnées de textures Fragment Shader : gl_FragColor : couleur du pixel (obligatoire) gl_FragData[] : rendu offscreen (obligatoire) gl_FragDepth : profondeur du pixel

GLSL Génération Geometry shader : Types des primitives EmitVertex() EndPrimitive() Types des primitives Points, Lignes, Triangles Lignes, Triangles avec Adjacences 3 2 4 1 5 3 1 2 3 2 1 2 3 4 1 5 6

GLSL Fonctions built-in Trigonométrie sin, cos, tan, asin, acos, atan, … Exponentiation exp, pow, log, exp2, log2, sqrt, … Arithmétiques abs, sign, floor, ceil, fract, mod, min, max, clamp, mix, step, … Géométriques length, distance, dot, cross, normalize, reflect, refract Accès aux textures texture1D, texture2D, texture3D, textureCube, shadow, … Manipulation de bits << , >> , | , & … Et d’autres…

Convention de notations (vec4) GLSL Swizzle Convention de notations (vec4) position : x, y, z, w couleur : r, g, b, a texture : s, t, p, q Permutation des variables Toutes les combinaisons sont possibles : vec4 res; res.xyzw (par défaut) res.xxxx, res.xyxy, res.xyzx, res.wzyx, res.xyww, etc… Changement de dimensions vec4 start; vec3 triple; vec2 couple; float alone; triple = start.xyz; couple = start.xy; alone = start.x;

GLSL Premier Programme uniform vec4 Bidule; vec4 UneFonction( vec4 Entree ) { return Entree.zxyw; } void main() vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex; gl_Position = pos + UneFonction( Bidule ); Entrée Fonction Swizzle Point d’entrée Entrées OpenGL Variable locale Multiplication matrice-vecteur Sortie OpenGL

GLSL Compilation Création Kernel Compilation Debug shader_id = glCreateShaderObjectARB(type); Type = {GL_VERTEX_SHADER_ARB, GL_FRAGMENT_SHADER_ARB, GL_GEOMETRY_SHADER_EXT glShaderSourceARB(shader_id,1,&const_shader_src,NULL); const_shader_src = programme Compilation glCompileShaderARB(shader_id); Debug glGetProgramivARB(shader_id,GL_OBJECT_INFO_LOG_LENGTH_ARB,&info_log_length); c_infolog = new char[info_log_length]; glGetInfoLogARB(shader_id,info_log_length,&nread,c_infolog);

GLSL Compilation Création Programme Propriétés Geometry Kernel _program_shader = glCreateProgramObjectARB(); Propriétés Geometry Kernel glProgramParameteriEXT(_program_shader, GL_GEOMETRY_INPUT_TYPE_EXT, _input_device); glProgramParameteriEXT(_program_shader, GL_GEOMETRY_OUTPUT_TYPE_EXT, _output_device); glProgramParameteriEXT(_program_shader, GL_GEOMETRY_VERTICES_OUT_EXT, _nb_max_vertices); Attacher glAttachObjectARB(_program_shader,_vertex_shader); glAttachObjectARB(_program_shader, _geometry_shader); glAttachObjectARB(_program_shader,_fragment_shader); Lier glLinkProgramARB(_program_shader);

GLSL Uniforms/Attributes glUseProgramObjectARB( Program ); glGetUniformLocationARB(); glUniform{1,2,3,4}f[v]ARB(); glUniformMatrix{2,3,4}fvARB(); glGetAttribLocationARB(); glVertexAttrib{1,2,3,4}f[v]ARB(); glUseProgramObjectARB(0); Utilisation d’un programme Réglage d’un uniform Réglage d’un attribute Fin de programme

Plan Historique Fonctionnalités des cartes graphiques GLSL Communications CPU  GPU Rendu Off-Screen GPGPU

Généralités Types de Buffer Mise à jour: static, dynamic, stream Static: une et une seule fois pour l’application Dynamic: modification multiples pour plusieurs rendus Stream: une modification, un rendu Accès : read, draw, copy Read: From GPU to CPU Draw: From CPU to GPU Copy: Both and From GPU to GPU Création glGenBuffersARB(1, &_name); glBindBufferARB(NATURE, _name); glBufferDataARB(NATURE, size, ptr, TYPE);

Communications CPU  GPU du CPU vers le GPU Vertex et Index Buffer Objects (VBO) Envoyer la géométrie via des tableaux Position, Normal, Couleurs, Coordonnées de textures (GL_ARRAY_BUFFER_ARB) Topologie (GL_ELEMENT_ARRAY_BUFFER_ARB) Type : [STATIC|DYNAMIC|STREAM]_DRAW

Communications CPU  GPU du CPU vers le GPU Pixel Buffer Object UNPACK (PBO) Envoyer une texture au GPU GL_PIXEL_UNPACK_BUFFER_ARB Activer le buffer Remplir le buffer Instancier la texture Type : [STATIC|DYNAMIC|STREAM]_DRAW

Communications CPU  GPU du GPU vers le CPU Pixel Buffer Object PACK (PBO) Récupérer une texture du GPU GL_PIXEL_PACK_BUFFER_EXT Activer le buffer Lire la sortie glReadPixels Mapping Type : [STATIC|DYNAMIC|STREAM]_READ

Communications CPU  GPU du GPU vers le CPU/GPU TRANSFORM FEEDBACK BUFFER OBJECT Buffer d’éléments spécial GL_ARRAY_BUFFER_ARB Spécifier Les éléments à récupérer à la fin du VS ou du GS Comment ? Un/Plusieurs buffers Lors du rendu : GL_TRANSFORM_FEEDBACK_BUFFER_NV Activer ou Désactiver la Rasterisation : glEnable(GL_RASTERIZER_DISCARD) TYPE : [DYNAMIC|STREAM]_[COPY|READ]

Communications CPU  GPU du CPU/GPU vers le GPU Texture Buffer Objects (TBO) Envoyer une texture accessible comme un tableau Utilisation : Réutiliser la sortie du pixel shader comme un buffer de géometrie GL_TEXTURE_BUFFER_EXT Type : [STATIC|DYNAMIC|STREAM]_[DRAW|COPY] glTexBufferEXT: association avec la texture Texture Buffer

Communications CPU  GPU du CPU vers le GPU Bindable Uniform Buffer Objects (BUBO) Envoyer des uniforms accessibles par TOUS les shaders Minimiser l’envoi de constantes (et aussi la place mémoire) GL_UNIFORM_BUFFER_EXT Type : STATIC_DRAW glUniformBufferExt: association mémoire buffer

Plan Historique Fonctionnalités des cartes graphiques GLSL Communications CPU  GPU Rendu Off-Screen GPGPU

Rendu off-screen FrameBuffer Objects (FBO) Object : GL_FRAMEBUFFER_EXT Attacher n textures : GL_COLOR_ATTACHMENTn_EXT z-buffer: GL_DEPTH_ATTACHMENT_EXT stencil-buffer : GL_STENCIL_ATTACHMENT_EXT

Rendu off-screen FrameBuffer Objects (FBO) :Type de Textures Flottantes rectangles : gl_FragData[n] Entières rectangles : varying out [i|u]vec4 data Tableau de textures 1D, 2D (layers) : glFramebufferTextureArrayExt(),TEXTURE_[1D|2D]_ARRAY_EXT gl_Layer

Rendu off-screen FrameBuffer Objects (FBO) Rendu Activer le FrameBuffer Activer le rendu dans les différentes textures Dessiner Terminer

Plan Historique Fonctionnalités des cartes graphiques GLSL Communications CPU  GPU Rendu Off-Screen GPGPU

GPGPU General-Purpose Computation Using Graphics Hardware Un GPU = un processeur SIMD Une texture = un tableau d’entrée Une image = un tableau de sortie

GPGPU Applications Rendu avancé Traitement du signal Illumination globale Image-based rendering … Traitement du signal Géométrie algorithmique Algorithmes génétiques A priori, tout ce qui peut se paralléliser

GPGPU Limitations Récupérer l’image rendue = lent PCI Express Opérateurs, fonctions, types assez limités Un algorithme parallélisé n’est pas forcément plus rapide que l’algorithme séquentiel

GPGPU Langages CUDA (NVIDIA) CTM (ATI) Shallows (Johan S. Seland – Chercheur à SINTEF ICT - Norvège) OpenCL (KRONOS, initié par APPLE) Exploite les puissances combinées du CPU et du GPU

GPGPU CUDA Compute Unified Device Architecture Basé sur le langage C Propose une mémoire partagée de 16 Ko pour les threads Pensé pour simplifier les accès, les retours et la compilation des kernels pour les non-spécialistes d’OpenGL. Librairies fournies FFT BLAS : Algèbre Linéaire

GPGPU Exemple Cuda cudaArray* cu_array; float* gpu_array; float* cpu_array = new float[width*height]; texture<float, 2, cudaReadModeElementType> tex; //Allocate array cudaMalloc((void**)&gpu_array, width*height*sizeof(float)); // Bind the array to the texture cudaBindTextureToArray(tex, cuArray); // Run kernel dim3 blockDim(16, 16); dim3 gridDim(width / blockDim.x, height / blockDm.y); kernel <<<gridDim, blockDim>>>(gpu_array, cu_array, width); cudaUnbindTexture(tex); //Copy GPU data to array cudaMemcpy(cpu_array,gpu_array,width*height*sizeof(float),cudaMemcpyDeviceToHost); //Free memory cudaFree(gpu_array); delete [] cpu_array; __global__ void kernel(float* odata, float* idata, int width) { unsigned int x = blockIdx.x*blockDim.x + threadIdx.x; unsigned int y = blockIdx.y*blockDim.y + threadIdx.y; odata[y*width+x] = idata[x+y*width]; }

Références/Liens Utiles La spec GLSL : http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.30.08.pdf Cg : http://developer.nvidia.com/page/cg_main.html Cuda : http://www.nvidia.com/cuda OpenCL : http://www.kronos.org/opencl/ Libraries pour les extensions GLUX (de Sylvain !) : http://www-sop.inria.fr/reves/Sylvain.Lefebvre/glux/ GLEW : http://glew.sourceforge.net/ Un éditeur spécial shader (malheureusement pas à jour, mais bien pour débuter) http://www.typhoonlabs.com/ Erreurs openGL/GLSL : un débogueur simple, efficace, super utile, vite pris en main. http://www.vis.uni-stuttgart.de/glsldevil/ Des tas d’exemples (à tester, éplucher, torturer) : http://developer.nvidia.com/object/sdk_home.html La référence GPGPU avec code, forums, tutoriaux : http://www.gpgpu.org/