Shader Programming

Embed Size (px)

Citation preview

  • 8/16/2019 Shader Programming

    1/49

    Shader programmingBased on Jian Huang’s lecture on Shader Programming

  • 8/16/2019 Shader Programming

    2/49

    What OpenGL could do 20 years ago

  • 8/16/2019 Shader Programming

    3/49

    What OpenGL could do ' years ago

  • 8/16/2019 Shader Programming

    4/49

    What’s (hanged)

    * 20 years ago:* +rans,orm -ertices !ith model-ie!pro&ection matrices"

    * Shade !ith Phong lighting model only"

    * .o!:* (ustom -erte/ trans,ormation"

    * (ustom lighting model"

    * ore complicated -isual e,,ects"

    * Shado!s* 1isplaced and detailed sur,aces

    * Simple re,lections and re,ractions

    * tc"

  • 8/16/2019 Shader Programming

    5/49

    What’s (hanged)

    * 20 years ago:* 3erte/ trans,ormation,ragment shading hardcoded into GP4s"

    *

    .o!:* ore parts o, the GP4 are programma%le 5%ut not all6"

  • 8/16/2019 Shader Programming

    6/49

    Shader Program

    * 7 small program to control parts o, the graphics pipeline

    * (onsists o, 2 5or more6 separate parts:* 3erte/ shader controls -erte/ trans,ormation"

    * 8ragment shader controls ,ragment shading"

  • 8/16/2019 Shader Programming

    7/49

    3erte/ Shader 

    * +rans,orm -ertices ,rom o%&ect space to clip space"* (on-entionally model-ie! ,ollo!ed %y pro&ection

    * (an de,ine custom trans,ormation to clip space

    * (ompute other data that are interpolated !ith -ertices"* (olor 

    * .ormals

    * +e/ture coordinates

    * tc"

  • 8/16/2019 Shader Programming

    8/49

    What (an a 3erte/ Shader 1o)

    1isplaceddistorted sur,aces

  • 8/16/2019 Shader Programming

    9/49

    What (an a 3erte/ Shader 1o)

    Skinning/Animation

  • 8/16/2019 Shader Programming

    10/49

    8ragment Shader 

    * (ompute the color o, a ,ragment 5i"e" a pi/el6"

    * +a#e interpolated data ,rom -erte/ shaders"

    * (an read more data ,rom:* +e/tures

    * 4ser speci,ied -alues"

  • 8/16/2019 Shader Programming

    11/49

    What (an a 8ragment Shader 1o)

    ore (omplicated9 1etailed aterials* Glossy

    * e,lecti-e9 re,racti-e

    * ough9 %umpy9 lots o, noo#s and crannies

    * Wooden

  • 8/16/2019 Shader Programming

    12/49

    What (an a 8ragment Shader 1o)

    Shado!s 5including so,t edges;6

    http:!!!",a%iensanglard"netshado!mappingP(8

  • 8/16/2019 Shader Programming

    13/49

    GLSL

  • 8/16/2019 Shader Programming

    14/49

    GLSL

    * Similar to ((>>

    * 4sed to !rite shaders

    * 3erte/9 tessellation9 geometry9 ,ragment

    * We only co-er -erte/ and ,ragment here

    * Based on OpenGL

    * 8irst a-aila%le in OpenGL 2"0 5200?6

    * (ompetitors:

    * .-idia (g

    * icroso,t HLSL

  • 8/16/2019 Shader Programming

    15/49

    GLSL Program

    * Speci,ies ho! OpenGL should dra! geometry"

    * Program: 7 collection o, shaders that run together"* 7t least one -erte/ shader or one ,ragment shader"

    * Should ha-e %oth so !e #no! its %eha-ior completely"

    * 7t any time9 the GP4 runs only one program"* ust speci,y program to use %e,ore dra!ing geometry"

  • 8/16/2019 Shader Programming

    16/49

    Shader 

    * Shader source code resem%les ((>> source code"* Similar data types9 e/pressions9 and control statements"

    * 8unctions are !ritten in the same !ay"

    * ntry point @ A-oid main5 6* .ot Aint main5int argc9 char CCarg-6 as in normal ("

    * +!o main ,unctions !hen !riting a -erte/ shader and a

    ,ragment shader together"

  • 8/16/2019 Shader Programming

    17/49

    Shader Structure

    /*Multiple-lined comment

    */

    // Single-lined comment

    //// Global variable definitions

    //

    void main()

    {

      //

      // Function body

      //

    }

  • 8/16/2019 Shader Programming

    18/49

    Green shader 

  • 8/16/2019 Shader Programming

    19/49

    3erte/ Shader 

    Green.vert:

    version !"#

    uniform mat$ un%&ro'ection

    uniform mat$ un%Modelie

    attribute vec+ in%erte,

    void main()

    {

      gl%&osition un%&ro'ection * un%Modelie * vec$(in%erte,. !)}

  • 8/16/2019 Shader Programming

    20/49

    Green.vert:

    version !"#

    uniform mat$ un%&ro'ection

    uniform mat$ un%Modelie

    attribute vec+ in%erte,

    void main()

    {

      gl%&osition un%&ro'ection * un%Modelie * vec$(in%erte,. !)}

    3erte/ Shader 

    ach time the screen is dra!n9 thismain56 ,unction is called once per -erte/9 as i, it !ere in a ,or loop"

  • 8/16/2019 Shader Programming

    21/49

    3erte/ Shader 

    +he ,irst thing to do is speci,y theGLSL -ersion" We use -ersion D"20in this class" 5.ote: other -ersionscan %e -ery di,,erent;6

    Green.vert:

    version !"#

    uniform mat$ un%&ro'ection

    uniform mat$ un%Modelie

    attribute vec+ in%erte,

    void main()

    {

      gl%&osition un%&ro'ection * un%Modelie * vec$(in%erte,. !)}

  • 8/16/2019 Shader Programming

    22/49

    3erte/ Shader 

    4ni,orms are one type o, input to theshader" +hey are the same ,or each-erte/ dra!n during one dra!,unction" We !ill see ho! to set them

    later" +hese ones are thecon-entional pro&ection andmodel3ie! matrices"

    Green.vert:

    version !"#

    uniform mat$ un%&ro'ection

    uniform mat$ un%Modelie

    attribute vec+ in%erte,

    void main()

    {

      gl%&osition un%&ro'ection * un%Modelie * vec$(in%erte,. !)}

  • 8/16/2019 Shader Programming

    23/49

    3erte/ Shader 

     7ttri%ute -aria%les lin# to -erte/attri%utes9 or data associated !itheach -erte/" +his one is set to the-erte/ position %u,,er" ach timemain56 is e/ecuted9 in=3erte/ is setto the -erte/ currently %eingprocessed"

    Green.vert:

    version !"#

    uniform mat$ un%&ro'ection

    uniform mat$ un%Modelie

    attribute vec+ in%erte,

    void main()

    {

      gl%&osition un%&ro'ection * un%Modelie * vec$(in%erte,. !)}

  • 8/16/2019 Shader Programming

    24/49

    3erte/ Shader  gl=Position is a special -aria%le thatholds the position o, the -erte/ in clip

    space"

    Since a -erte/ shader’s main outputis the position in clip space9 it mustalways set gl=Position"

    +his -erte/ shader &ust trans,ormseach -erte/ position %y thepro&ection9 model9 and -ie! matrices"

    Green.vert:

    version !"#

    uniform mat$ un%&ro'ection

    uniform mat$ un%Modelie

    attribute vec+ in%erte,

    void main()

    {

      gl%&osition un%&ro'ection * un%Modelie * vec$(in%erte,. !)}

  • 8/16/2019 Shader Programming

    25/49

    8ragment Shader 

    Green.frag:

    version !"#

    uniform mat$ un%&ro'ection

    uniform mat$ un%Modelie

    void main()

    {

      gl%Fragolor  vec$(#.!.#.!)

    }

  • 8/16/2019 Shader Programming

    26/49

    8ragment Shader 

    ach time the screen isdra!n9 this main56 ,unctionis called once per pi/el"

    Green.frag:

    version !"#

    uniform mat$ un%&ro'ection

    uniform mat$ un%Modelie

    void main()

    {

      gl%Fragolor  vec$(#.!.#.!)

    }

  • 8/16/2019 Shader Programming

    27/49

    8ragment Shader 

    gl=8rag(olor is a special-aria%le that stores thecolor o, the output,ragment"

    Since a ,ragment shader computes the color o, a,ragment9 it must always set gl=8rag(olor"

    Green.frag:

    version !"#

    uniform mat$ un%&ro'ection

    uniform mat$ un%Modelie

    void main()

    {

      gl%Fragolor  vec$(#.!.#.!)

    }

  • 8/16/2019 Shader Programming

    28/49

    8ragment Shader 

    -ec? is a data type o, ?1-ector"

    (an %e used to store: $homogeneous coordinates $GB7 color 

    -ec?509D909D6 constructs an

    GB7 tuple !ith @09 G@D9B@09 7@D9 !hich is green"

    Green.frag:

    version !"#

    uniform mat$ un%&ro'ection

    uniform mat$ un%Modelie

    void main()

    {

      gl%Fragolor  vec$(#.!.#.!)

    }

  • 8/16/2019 Shader Programming

    29/49

    OpenGLGLSL Plum%ing

    * Suppose !e ha-e already created the program

    * We tell OpenGL to use it"

    * We then instruct OpenGL to dra! a triangle:

    Green.java:// 01e vertices in our verte, buffer. initiali2ed earlierfloat 34 vertices {-#56. -#56. #.  -#56. -#56. #.  #. #56. # }//555

    // 7n t1e dra met1odprogram5use()

    gl8ra9lements(555)

    G:&rogram5unuse()

  • 8/16/2019 Shader Programming

    30/49

    Green+riangle1emo

  • 8/16/2019 Shader Programming

    31/49

    4sing GLSL in Ja-a

  • 8/16/2019 Shader Programming

    32/49

    +o use a GLSL programE

    * 8ollo! the ,ollo!ing F steps"

    D" (reate shader o%&ects"

    2" ead source code ,rom ,iles and ,eed them to the shader o%&ects &ust created"

    " (ompile the shader"

    ?" (reate a program o%&ect"

    '"  7ttach the shaders to the program"" Lin# the program"

    F" +ell OpenGL to use your shader program"

  • 8/16/2019 Shader Programming

    33/49

    +o use a GLSL programE

    * 8ollo! the ,ollo!ing F steps"

    D" (reate shader o%&ects"

    2" ead source code ,rom ,iles and ,eed them to the shader o%&ects &ust created"

    " (ompile the shader"

    ?" (reate a program o%&ect"

    '"  7ttach the shaders to the program"" Lin# the program"

    F" +ell OpenGL to use your shader program"

    W H  7+   7 P  7I . ; 

  • 8/16/2019 Shader Programming

    34/49

    (S ?20 8rame!or#

    * (ontains GLProgram class to a%stract OpenGL calls;–  7dded con-enience methods

    – Help #eep con-entions straight

    – (ontrols mapping %et!een attri%ute -aria%les and-erte/ %u,,ers

  • 8/16/2019 Shader Programming

    35/49

    .o!9 to create a GLSL programE

    * (reate a GLProgram o%&ect"

     rivate GLProgram program;

     ublic void onEntry(GameTime gameTime) {

    program = new GLProgram();program.quic!reate"e#ource(

    $c#%&'glGrid.vert$* Pat+ to verte, #+ader  $c#%&'glGrid.-rag$* Pat+ to -ragment #+ader

    null); ptional attribute li#t  /

  • 8/16/2019 Shader Programming

    36/49

    .o!9 to use a GLSL programE

    * 4se it" 1ra! stu,," 4nuse it 5i, need %e6"

     ublic void draw(GameTime gameTime) {  0#e our GL1L program

      program.u#e();

      Tell penGL to draw our me#+  gl2rawElement# (GL3T"456GLE1 * inde,!ount* GLType.0n#igned4nt * );

      !lean up  GLProgram5unu#e ();

    /

  • 8/16/2019 Shader Programming

    37/49

    GLSL 17+7 +PS

  • 8/16/2019 Shader Programming

    38/49

    GLSL 1ata +ypes

    * Both GLSL and Ja-a* ,loat9 int

    * GLSL has9 %ut Ja-a has not* -ec29 -ec9 -ec?: -ectors

    * mat29 mat9 mat?: matrices

    * samplerD19 sampler219 sample19 sampler(u%e9 etc: te/tures

    * Ja-a has9 %ut GLSL has not* O%&ect

    * String

    * etc

  • 8/16/2019 Shader Programming

    39/49

    -ec2

    * epresents a -ector in 21" ach component is a ,loat"

    vec" a;

    a., = #5#;

    a.y = !5#; // a (#.!)

    vec" b;

    b.s = !#5#;

    b.t = !"56; // b (!#.!"56)

    vec" c;

    c[#] = ;5#;

    c[!] = 

  • 8/16/2019 Shader Programming

    40/49

    -ec2

    float p = a.t;  // p !

    float = = b[!] + c., // = "!56

    vec" d = vec"(+, c.y * "); // d (+.!>)

    vec" d = a + b; // d (!#.!+56)

    vec" e = b - c; // e (!.$56)

    vec" f = b * c; // f (;#.!##)

    vec" g = + * a; // g (#.+)

    float 1 = lengt1(c); // 1 !"5#$"

  • 8/16/2019 Shader Programming

    41/49

    -ec

    vec+ a;

    a., = !#5#; a.y = "#5#; a.2 = +#5#;  // a (!#. "#. +#)

    a.r = #5!;  a.g = #5";  a.b = #5+;  // a (#5!. #5". #5+)

    a.s = !5#,  a.t = "5#;  a.p = +5#;  // a (!. ". +)

    vec+ b = vec+($5#, 65#, >5#);

    vec+ c = a + b; // c (6. ?. ;)

    vec+ d = a - b; // d (-+. -+. -+)

    vec+ e = a * b; // e ($. !#. !. ;)

    float g = dot(a,b); // g +"

    vec+ 1 = cross(a,b); // 1 (-6.>.-+)

    float i = lengt1(a); // i +5?$"

  • 8/16/2019 Shader Programming

    42/49

    -ec?

    vec$ a;

    a., = !#5#; a.y = "#5#; a.2 = +#5#; a. = $#5#;

    // a (!#. "#. +#. $#)

    a.r = #5!;  a.g = #5";  a.b = #5+;  a.a = #5$;

    // a (#5!. #5". #5+. #5$)

    a.s = !5#;  a.t = "5#;  a.p = +5#;  a.= = $5#;

    // a (!. ". +. $)

    vec$ b = vec$(6, >, ?, . . ;. !")

    float g = lengt1(a); // g 65$??

  • 8/16/2019 Shader Programming

    43/49

    mat2

    * epresents a 2 %y 2 matri/" ach component is a ,loat"

    mat" @ = mat"(!5#, "5#, +5#, $5#); // in column-ma'or order

    vec" , = vec"(!5#, #5#);

    vec" y = vec"(#5#, !5#);

    vec" a = @ * ,; // a (!.")

    vec" b = @ * y; // b (+.$)

  • 8/16/2019 Shader Programming

    44/49

    mat

    mat+ @ = mat+(!5#, "5#, +5#, $5#, 65#, >5#, ?5#, 

  • 8/16/2019 Shader Programming

    45/49

  • 8/16/2019 Shader Programming

    46/49

     7rray

    * We can declare ,i/ed$siKe arrays 5siKe #no!n at compile

    time6

    * 4se ( synta/"

    float @[$];

    @[#] = 6; @[+] = !#;

    vec$ A[!#];

    A[+] = vec$

    (!,",+,$);

    A[

  • 8/16/2019 Shader Programming

    47/49

    S!iKKling

    * 4sed to construct a -ector ,rom another -ector %y

    re,erring to multiple components at one time"

    vec$ a = vec$(!,",+,$);

    vec+ b = a.,y2;  // b (!.".+)

    vec" c = a.=p;  // c ($.+)

    vec$ d = a.,,yy; // d (!.!.".")

  • 8/16/2019 Shader Programming

    48/49

    +ype (on-ersion

    * Synta/: -aria%leMM @ typeMM5 -alueMM 6N

    * /pression on HS @ Aconstructor e/pression"

    * /ample:

    float a = !5#;

    int b = int(a);

  • 8/16/2019 Shader Programming

    49/49

    +ype (on-ersion

    * We can create larger -ectors ,rom smaller ones"

    vec" a = vec"(!,");

    vec" b = vec"(+,$);

    vec$ c = vec$(a,b);  // c (!.".+.$)

    vec+ d = vec+(#,#,!);

    vec$ e = vec$(d,#);  // d (#.#.!.#)

    vec$ f = vec$(#,a,+); // f (#.!.".+)