glsl tutorial 9 shader introduction
DESCRIPTION
GLSL tutorial 9 shader introduction.TRANSCRIPT
-
1Shader Programming
Daniel Wessln, [email protected] Seipel, [email protected]
Examples
-
2Per-pixel lighting
Texture convolution filtering
-
3Post-processing, animated procedural textures
Vertex displacement mapping
-
4Fragment shader Mandelbrot set
Animation
-
5Direct volume rendering
The OpenGL pipeline
-
6OpenGL 1.4
vertex transform &
lighting
primitive assembly rasterization
fog, texturing
framebuffer
texture
connectivity
blending, depth, stencil
OpenGL 2.1
primitive assembly rasterization
fragment shader
framebuffertexture
connectivity
blending, depth, stencil
vertex shader
VBO
-
7Shader processing
Parallel processing
rasterizer
vertex scheduler
vertex processors
fragment processors
framebuffer
vertices: properties
vertices: positions, properties
fragments: positions, properties
fragments: colors
-
8Vertex shader
Transform Animation Per-vertex lighting Displacement Mostly: Parameter setup for fragments Can not modify topology No access to other vertices
vertex processors
vertices: properties
vertices: positions, properties
Fragment shader
Per-pixel lighting Texturing Compositing Filtering Fog Can not read or write pixels No access to other fragments
fragment processors
fragments: positions, properties
fragments: colors
-
9Simple example
Per-pixel lighting
-
10
Vertex shadervarying vec3 normal, color, pos;
void main(){
color = gl_Color.rgb;normal = normalize(gl_NormalMatrix * gl_Normal);
pos = vec3(gl_ModelViewMatrix * gl_Vertex);
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;}
Vertex shadervarying vec3 normal, color, pos;
void main(){
color = gl_Color.rgb;normal = normalize(gl_NormalMatrix * gl_Normal);
pos = vec3(gl_ModelViewMatrix * gl_Vertex);
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;}
uniform (prog. to vertex, per primitive)
attribute (prog. to vertex, per vertex)
varying (vertex to fragment)
-
11
Vertex shadervarying vec3 normal, color, pos;
void main(){
color = gl_Color.rgb;normal = normalize(gl_NormalMatrix * gl_Normal);
pos = vec3(gl_ModelViewMatrix * gl_Vertex);
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;}
int, float, bool (basic types)
vec2, vec3, vec4 (2,3,4d vector)
mat2, mat3, mat4 (2,3,4d float matrix)
ivec3, bvec4, etc. (vectors only)
Vertex shadervarying vec3 normal, color, pos;
void main(){
color = gl_Color.rgb;normal = normalize(gl_NormalMatrix * gl_Normal);
pos = vec3(gl_ModelViewMatrix * gl_Vertex);
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;}
-
12
Vertex shadervarying vec3 normal, color, pos;
void main(){
color = gl_Color.rgb;normal = normalize(gl_NormalMatrix * gl_Normal);
pos = vec3(gl_ModelViewMatrix * gl_Vertex);
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;}
vertex shader built-in attributes
writing to gl_Position is mandatory
Vertex shadervarying vec3 normal, color, pos;
void main(){
color = gl_Color.rgb;normal = normalize(gl_NormalMatrix * gl_Normal);
pos = vec3(gl_ModelViewMatrix * gl_Vertex);
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;}
built-in uniforms
-
13
Fragment shaderuniform float shininess;varying vec3 normal, color, pos;
void main(){
vec3 nlight = normalize(gl_LightSource[0].position.xyz - pos);vec3 neye = normalize(-pos);vec3 nnormal = normalize(normal);vec3 nhalf = normalize(neye + nlight);
float diff = max(0.0, dot(nlight, nnormal));float spec = diff > 0.0 ? pow(dot(nhalf, nnormal), shininess) : 0.0;
gl_FragColor = vec4(color * diff + spec, 1);}
Fragment shaderuniform float shininess;varying vec3 normal, color, pos;
void main(){
vec3 nlight = normalize(gl_LightSource[0].position.xyz - pos);vec3 neye = normalize(-pos);vec3 nnormal = normalize(normal);vec3 nhalf = normalize(neye + nlight);
float diff = max(0.0, dot(nlight, nnormal));float spec = diff > 0.0 ? pow(dot(nhalf, nnormal), shininess) : 0.0;
gl_FragColor = vec4(color * diff + spec, 1);}
built-in functions
-
14
Fragment shaderuniform float shininess;varying vec3 normal, color, pos;
void main(){
vec3 nlight = normalize(gl_LightSource[0].position.xyz - pos);vec3 neye = normalize(-pos);vec3 nnormal = normalize(normal);vec3 nhalf = normalize(neye + nlight);
float diff = max(0.0, dot(nlight, nnormal));float spec = diff > 0.0 ? pow(dot(nhalf, nnormal), shininess) : 0.0;
gl_FragColor = vec4(color * diff + spec, 1);}
writing to gl_FragColor or gl_FragData[] is mandatory