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)
……
…..

Documents pareils