OpenGL Shading Language
Transcription
OpenGL Shading Language
OpenGL Shading Language Introduction But de ce cours Non-buts Spécialistes GLS Experts en GLSL Exploration du pipeline graphique Séparation vertex/fragment Différentes possibilités Lecture de documents techniques Spécifications Description de langage Historique Rapide Années 80 : SGI IRIS GL Concept de « graphic pipeline » 1992 :OpenGL 1.0 Standard ouvert Machine à états 1993 : 1ere carte supportant OpenGL 1.0 1995 : DirectX/Direct3D 1.0 Concept d’objets 1999 : 1er pipeline hardware grand public NVIDIA GeForce Pipeline Graphique © Copyright 3Dlabs Vers la programmation 2000 : Register Combiners NVIDIA GeForce 2 Operation sur les textures 2001 : Vertex Program : NVIDIA GeForce 3 Fragment Shader : ATI Radeon 8500 Assembleur pour Cartes Graphiques 2002 : NVIDIA Cg : C pour le Graphique Langage de haut niveau 2003 : Direct3D HLSL OpenGL GLSL Pipeline Programmable © Copyright 3Dlabs OpenGL 2.0 © Copyright 3Dlabs Différent noms DirectX/Direct3D Vertex Shader Opération sur les sommets Assembleur Pixel Shader Opération sur les fragments (après la rasterisation) Assembleur HLSL High Level Shading Language Langage de style C Différent noms OpenGL Vertex Program Opération sur les sommets Assembleur Fragment Program Opération sur les fragments (après la rasterisation) Assembleur GLSL OpenGL Shading Language Langage de style C Fragment Shader / Vertex Shader ARB_vertex_program Program Environment Parameters Vertex Attributes vertex.* Address Variables program.env[N] User defined Program Local Parameters program.local[N] OpenGL states state.* Vertex Program Temporary Variables Vertex Result Registers result.* User defined ARB_vertex_program "!!ARBvp1.0" "ATTRIB iPos = vertex.position;" "ATTRIB iCol = vertex.color;" "PARAM iMvp[4] = {state.matrix.mvp};" "OUTPUT oPos = result.position;" "OUTPUT oCol = result.color;" "# transform vertex to clip space" "DP4 oPos.x,iMvp[0],iPos;" "DP4 oPos.y,iMvp[1],iPos;" "DP4 oPos.z,iMvp[2],iPos;" "DP4 oPos.w,iMvp[3],iPos;" "# transmit attributs" "MOV oCol,iCol;" "MOV result.texcoord[0],vertex.texcoord[0];" "END" A noter Opérations sur des vecteurs ATTRIB attribut au sommet (paramètre du sommet) prédéfinis position, couleur, normale, coordonnées textures accès direct (.texcoord[0], .color, ....) lecture seule PARAM paramètre global (paramètre du programme) prédéfinis matrice de transformation, position des lumières, .... accès direct (state.*, ....) lecture seule OUTPUT valeur en sortie prédéfinis écriture seule DP4 = dot product NV_vertex_program Dans le programme glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 0, GL_MODELVIEW_PROJECTION_NV,GL_IDENTITY_NV); "!!VP1.0" "# c[0]...c[3] contains modelview projection composite matrix" "# transform vertex to clip space" "DP4 o[HPOS].x,c[0],v[OPOS];" "DP4 o[HPOS].y,c[1],v[OPOS];" "DP4 o[HPOS].z,c[2],v[OPOS];" "DP4 o[HPOS].w,c[3],v[OPOS];" "# transmit attributs" "MOV o[COL0],v[COL0];" "MOV o[TEX0],v[TEX0];" "END" ARB_fragment_program Program Environment Parameters Fragment Attributes Textures fragment.* texture[N] program.env[N] Program Local Parameters program.local[N] OpenGL states state.* Fragment Program Vertex Result Registers result.* Address Variables User defined Temporary Variables User defined ARB_fragment_program "!!ARBfp1.0" "ATTRIB iTex = fragment.texcoord[0];" "TEMP tVal;" "TEX tVal,iTex,texture[0],2D;" "MAD result.color,tVal,fragment.color,state.material.ambient;" "# set depth value" "MOV result.depth,fragment.position.z;" "END" "!!ARBfp1.0" "TEMP tVal;" "TEX tVal,fragment.texcoord[0],texture[0],2D;" "MAD result.color,tVal,fragment.color,state.material.ambient;" "END" NV_fragment_program "!!FP1.0" "# p[0] contain ambient term" "TEX R0,f[TEX0].xyxx,TEX0,2D;" "MADX_SAT o[COLH],R0,f[COL0],p[0];" "# set depth value" "MOVR o[DEPR].z,f[WPOS].z;" "END" "!!FP1.0" "DECLARE amb;" "TEX R0,f[TEX0].zwxx,TEX0,RECT;" "MADR o[COLR],R0,f[COL0],amb;" "# set depth value" "MOVR o[DEPR].z,f[WPOS].z;" "END" Pourquoi GLSL ? OpenGL Standard ouvert Multi-plateformes IRIX, Linux, MacOS X, Windows Intégré aux drivers Mise à jour des pilotes Extensible à d’autres langages Cg (GL_EXT_Cg_shader) Proches des autres solutions HLSL / Cg Marche sur les petits périphériques (OpenGL ES) PDA PS3 Vertex Shader Peut faire Transformation des propriétés des sommets Position/normale/couleurs/coordonnées texture/… Calcul de l’éclairage Génération de coordonnées texture … Ne peut pas faire Transformation perspective Projection sur l’image Élimination des faces non-visibles Backface culling Assemblage des primitives … Fragment Shader Peut faire Opérations sur les valeurs interpolées Texturing … Ne peut pas faire Histogramme Alpha test Test de profondeur Stencil test Alpha blending Opération logique Dithering … Modèle GLSL Shader OpenGL Chaîne de caractères Pilote OpenGL Style C Compilateur GLSL Hardware Modèle HLSL Shader HLSL Chaîne de caractères Librairie Direct3D Style C Compilateur HLSL Pilote Direct3D Assembleur Direct3D Assembleur HLSL Hardware Modèle Cg Shader Cg Chaîne de caractères Librairie Cg Style C Compilateur Cg Assembleur OpenGL / NVIDiA Assembleur HLSL Pilote OpenGL Pilote Direct3D Assembleur Direct3D Assembleur OpenGL Hardware Différences avec ANSI C Vecteur : 2-, 3-, ou 4- dimensions Matrices de flottants : 2x2, 3x3, or 4x4 Type “sampler” pour l’accès aux textures Qualificateur de types “attribute”, “uniform”, et “varying” Accès aux états OpenGL Fonctions pré-définies pour le graphique Mot-clef “discard” to tuer un fragment Accès aux membres des vecteurs .rgba, .xyzw, .stpq Permutations (.xxx, .stst, …) Types float, vec2, vec3, vec4 1, 2, 3, ou 4 flottants int, ivec2, ivec3, ivec4 1, 2, 3, ou 4 entiers Pas de nécessité de support matériel Limitée à 16 bits de précision, avec le signe Pas de garantie de bouclage bool, bvec2, bvec3, bvec4 1, 2, 3, ou 4 booléens Pas de nécessité de support matériel Types (suite) mat2, mat3, mat4 Matrices de flottants void Pour les fonctions sans valeur retournée sampler[123]D, samplerCube Texture 1D, 2D, et 3D Texture « cube map » sampler1DShadow, sampler2DShadow Texture de profondeurs 1D et 2D Construction de types Structures (struct mais pas union) Tableau Qualificateur de types const attribute Donnée par sommet pour le vertex shader uniform Paramètre de shader (faible variation) varying Sortie du vertex shader Entrée du fragment shader Interpolée à la rasterisation (avec correction de perspective) in Paramètre en lecture d’un fonction out Paramètre en écriture d’un fonction inout Paramètre en lecture/écriture d’un fonction Vertex Shader attribute pré-défini gl_color gl_normal gl_vertex .. attribute défini par l’utilisateur attribute vec3 tangent; …. Fournie directement par l’application Fournie indirectement par l’application Produit par le Vertex Processor Vertex Processor uniform défini par l’utilisateur uniform float time; …. uniform pré-défini gl_ModelViewMatrix, gl_FrontMaterial …. varying pré-définis gl_FrontColor gl_BackColor .. variables de sortie spéciales gl_Position gl_BackColor .. varying défini par l’utilisateur varying vec3 normale; .. Fragment Shader varying pré-définis gl_FrontColor gl_BackColor .. variables d’entrée spéciales gl_FragCoord gl_Color .. Fragment Processor varying défini par l’utilisateur varying vec3 normale; .. Produit par la rasterisation Fournie directement par l’application Fournie indirectement par l’application Produit par le fragment processor uniform défini par l’utilisateur uniform float time; …. uniform pré-défini gl_ModelViewMatrix, gl_FrontMaterial …. variables de sortie spéciales gl_FragDepth gl_FragColor .. Extensions OpenGL Plusieurs types GL_ : extensions OpenGL WGL_/AGL_/GLX_ : communication avec le fenêtrage Plusieurs sources ARB : organisme de standardisation OpenGL (officiel) EXT : couramment supportée ATI/NV/SGI/… : vendeur-spécifique ATIX/NVX/SGIX/ … : expérimentale OES/OML : pour OpenGL|ES et OpenML (consortium Khronos) … Extension : Spécification Name ARB_texture_rectangle Name Strings GL_ARB_texture_rectangle …. Version Date: March 5, 2004 Revision: 0.9 Number ARB Extension #38 Dependencies OpenGL 1.1 is required OpenGL 1.4 (or ARB_texture_mirrored_repeat) affects the definition of this extension. ….. Overview ....... Extension : Spécification - suite New Procedures and Functions void SpriteParameteriSGIX(enum pname, int param); void SpriteParameterfSGIX(enum pname, float param); void SpriteParameterivSGIX(enum pname, int* params); void SpriteParameterfvSGIX(enum pname, float* params); New Tokens Accepted by the <cap> parameter of Enable, Disable, and IsEnabled, and by the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev: SPRITE_SGIX ….. Additions to Chapter 2 of the 1.0 Specification (OpenGL Operation) …… …..