GLSL tutorial 9 shader introduction

14
1 Shader Programming Daniel Wesslén, [email protected] Stefan Seipel, [email protected] Examples

description

GLSL tutorial 9 shader introduction.

Transcript of GLSL tutorial 9 shader introduction

  • 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