Shader Programming
-
Upload
milena-danailova -
Category
Documents
-
view
257 -
download
0
Transcript of Shader Programming
-
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 (#.!.".+)