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