Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  ·...

49
Programming with OpenGL Part 3: Shaders CS 537 Interactive Computer Graphics Prof. David E. Breen Department of Computer Science 1 E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Transcript of Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  ·...

Page 1: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Programming with OpenGL Part 3: Shaders

CS 537 Interactive Computer Graphics Prof. David E. Breen

Department of Computer Science

1E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 2: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

2

Geometric Preliminaries

• Affine Geometry - Scalars + Points + Vectors and their ops

• Euclidian Geometry - Affine Geometry lacks angles, distance - New op: Inner/Dot product, which gives

•  Length, distance, normalization •  Angle, Orthogonality, Orthogonal projection

• Projective Geometry

Page 3: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

3

Affine Geometry

• Affine Operations:

• Affine Combinations: α1v1 + α2v2 + … + αnvn where v1,v2, …,vn are vectors and Example:

Page 4: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

4

Mathematical Preliminaries

•  Vector: an n-tuple of real numbers •  Vector Operations

-  Vector addition: u + v = w •  Commutative,

associative, identity element (0)

-  Scalar multiplication: cv

•  Note: Vectors and Points are different -  Can not add points -  Can find the vector between two points

Page 5: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

5

Linear Combinations & Dot Products

• A linear combination of the vectors v1, v2, … vn is any vector of the form α1v1 + α2v2 + … + αnvn where αi is a real number (i.e. a scalar)

• Dot Product:

a real value u1v1 + u2v2 + … + unvn written as

vu •

Page 6: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

6

Fun with Dot Products

• Euclidian Distance from (x,y) to (0,0) in general: which is just:

• This is also the length of vector v: ||v|| or |v|

• Normalization of a vector: • Orthogonal vectors:

22 yx + 222

21 ... nxxx +++

x • x

Page 7: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

7

Projections & Angles

• Angle between vectors,

• Projection of vectors

Pics/Math courtesy of Dave Mount @ UMD-CP

u ⋅ v = u v cos(θ)

Page 8: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

8

Matrices and Matrix Operators

•  A n-dimensional vector:

•  Matrix Operations: -  Addition/Subtraction -  Identity -  Multiplication

•  Scalar •  Matrix Multiplication

•  Implementation issue: Where does the index start? (0 or 1, it’s up to you…)

Page 9: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

9

Matrix Multiplication

• [C] = [A][B] • Sum over rows & columns • Recall: matrix multiplication is not commutative

• Identity Matrix: 1s on diagonal 0s everywhere else

Page 10: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

10

Matrix Determinants

• A single real number • Computed recursively • Example:

• Uses: - Find vector ortho to two other vectors - Determine the plane of a polygon

bcaddbca

−="#

$%&

'det

det(A) = Ai, j (−1)i+ j Mi, j

j=1

n

Page 11: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

11

Cross Product

• Given two non-parallel vectors, A and B • A x B calculates third vector C that is orthogonal to A and B

• A x B = (aybz - azby, azbx - axbz, axby - aybx)

A × B =

x y z

ax ay az

bx by bz

Page 12: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

12

Matrix Transpose & Inverse

• Matrix Transpose: Swap rows and cols:

• Facts about the transpose:

• Matrix Inverse: Given A, find B such that AB = BA = I BèA-1

(only defined for square matrices)

Page 13: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Objectives

• Simple Shaders - Vertex shader - Fragment shaders

• Programming shaders with GLSL • Finish first program

13E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 14: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Vertex Shader Applications

• Moving vertices - Transformations

•  Modeling •  Projection

- Morphing - Wave motion - Fractals - Particle systems

14E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

• Lighting - More realistic shading

models - Cartoon shaders

Page 15: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Fragment Shader Applications

Per fragment lighting calculations

15E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

per vertex lighting (Gouraud shading)

per fragment lighting (Phong shading)

Page 16: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Fragment Shader Applications

Texture mapping

16E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Procedural textures environment mapping

bump mapping

Page 17: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Writing Shaders

• First programmable shaders were programmed in an assembly-like manner

• OpenGL extensions added vertex and fragment shaders

• Cg (C for graphics) C-like language for programming shaders

- Works with both OpenGL and DirectX -  Interface to OpenGL complex

• OpenGL Shading Language (GLSL) 17E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 18: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

GLSL

• OpenGL Shading Language • Part of OpenGL 2.0 and up • High level C-like language • New data types

- Matrices - Vectors - Samplers

• As of OpenGL 3.1, application must provide shaders

18E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 19: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Execution Model

19E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Vertex Shader

GPU

Primitive Assembly

Application Program

glDrawArrays Vertex

Vertex data Shader Program

Page 20: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Simple Vertex Shader

in vec4 vPosition; void main(void) { gl_Position = vPosition; } Use “attribute vec4 vPosition” for GLSL 1.4

20E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 21: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Execution Model

21E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Fragment Shader

Application

Frame Buffer Rasterizer

Fragment Fragment Color

Shader Program

Page 22: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Simple (Old) Fragment Program

void main() { gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 ); } Every fragment simply colored red

22E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 23: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Simple (New) Fragment Program

out vec4 fragcolor; void main(void) { fragcolor = vec4(1.0, 0.0, 0.0, 1.0); } Every fragment simply colored red

23E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 24: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Data Types

• C types: int, float, bool, uint, double • Vectors:

-  float vec2, vec3, vec4 - Also int (ivec), boolean (bvec), uvec, dvec

• Matrices: mat2, mat3, mat4 - Stored by columns - Standard referencing m[row][column]

• C++ style constructors - vec3 a =vec3(1.0, 2.0, 3.0) - vec2 b = vec2(a)

24E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 25: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Pointers

• There are no pointers in GLSL • We can use C structs which can be copied back from functions • Because matrices and vectors are basic types they can be passed into and out from GLSL functions, e.g.

mat3 func(mat3 a)

25E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 26: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Qualifiers

• GLSL has many of the same qualifiers such as const as C/C++

• Need others due to the nature of the execution model

• Variables can change - Once per vertex - Once per primitive - Once per fragment -  At any time in the application

• Vertex attributes are interpolated by the rasterizer into fragment attributes

26E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 27: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Attribute Qualifier

• Attribute-qualified variables can change at most once per vertex

• There are a few built in variables such as gl_Position but most have been deprecated

• User defined (in application program) - Use ‘in’ qualifier to get to shader - in float temperature - in vec3 velocity

27E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 28: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Uniform Qualifier

• Variables that are constant for an entire primitive

• Can be changed in application and sent to shaders

• Cannot be changed in shader • Used to pass information to shader such as the bounding box of a primitive

28E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 29: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Varying Qualifier

• Variables that are passed from vertex shader to fragment shader

• Automatically interpolated by the rasterizer • Old style used the varying qualifier varying vec4 color;

• Now use out in vertex shader and in in the fragment shader out vec4 color;

29E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 30: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Example: Vertex Shader

const vec4 red = vec4(1.0, 0.0, 0.0, 1.0); in vec4 vPosition; out vec4 color_out; void main(void) { gl_Position = vPosition; color_out = vPosition.x * red; }

30E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 31: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Required Fragment Shader (old)

in vec4 color_out; void main(void) { // Now deprecated gl_FragColor = color_out; }

31E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 32: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Required Fragment Shader (new)

in vec4 color_out; out vec4 fragcolor; void main(void) { fragcolor = color_out; }

32E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 33: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

User-defined functions

• Similar to C/C++ functions • Except

- Cannot be recursive - Specification of parameters

33

returnType MyFunction(in float inputValue, out int outputValue, inout float inAndOutValue);

Page 34: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Passing values

• call by value-return • Variables are copied in • Returned values are copied back • Three possibilities

-  in - out -  inout

34E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 35: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Operators and Functions

• Standard C functions - Trigonometric - Arithmetic - Normalize, reflect, length

• Overloading of vector and matrix types mat4 a; vec4 b, c, d; c = b*a; // a column vector stored as a 1d array d = a*b; // a row vector stored as a 1d array

35E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 36: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Swizzling and Selection

• Can refer to array elements by element using [] or selection (.) operator with

- x, y, z, w -  r, g, b, a - s, t, p, q - a[2], a.b, a.z, a.p are the same

• Swizzling operator lets us manipulate components vec4 a, b; a.yz = vec2(1.0, 2.0); a.xw = b.yy;

36E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 37: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Programming with OpenGL Part 4: Color and Attributes

37E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 38: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Objectives

• Expanding primitive set • Adding color • Vertex attributes • Uniform variables

38E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 39: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

OpenGL Primitives

39E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

GL_TRIANGLE_STRIP GL_TRIANGLE_FAN

GL_POINTS

GL_LINES

GL_LINE_LOOP

GL_LINE_STRIP

GL_TRIANGLES

Page 40: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Polygon Issues

• OpenGL will only display triangles -  Simple: edges cannot cross - Convex: All points on line segment between two points in a

polygon are also in the polygon -  Flat: all vertices are in the same plane

• Application program must tessellate a polygon into triangles (triangulation)

• OpenGL 4.1 contains a tessellator

40E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

nonsimple polygon nonconvex polygon

Page 41: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Polygon Testing

• Conceptually simple to test for simplicity and convexity

• Time consuming • Earlier versions assumed both and left testing to the application

• Present version only renders triangles • Need algorithm to triangulate an arbitrary polygon

41E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 42: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Good and Bad Triangles

• Long thin triangles render badly

• Equilateral triangles render well • Maximize minimum angle • Delaunay triangulation for unstructured points

42E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 43: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Triangularization

• Convex polygon

• Start with abc, remove b, then acd, …. 43E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

a

c

b

d

Page 44: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Non-convex (concave)

44E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 45: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Recursive Division

• There are a variety of recursive algorithms for subdividing concave polygons

45E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 46: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Attributes

• Attributes determine the appearance of objects - Color (points, lines, polygons) - Size and width (points, lines) - Stipple pattern (lines, polygons) - Polygon mode

• Display as filled: solid color or stipple pattern • Display edges • Display vertices

• Only a few (glPointSize) are supported by OpenGL functions

46E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 47: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

RGB color

• Each color component is stored separately in the frame buffer

• Usually 8 bits per component in buffer • Color values can range from 0.0 (none) to 1.0 (all) using floats or over the range from 0 to 255 using unsigned bytes

47E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 48: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Smooth Color

• Default is smooth shading - OpenGL interpolates vertex colors across

visible polygons • Alternative is flat shading

- Color of first vertex determines fill color - Handle in shader

49E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 49: Programming with OpenGL Part 3: Shaders - Computer …david/Classes/ICG/Lectures… ·  · 2017-01-193 Affine Geometry • Affine Operations: • Affine Combinations: α 1v 1 + α

Setting Colors

• Colors are ultimately set in the fragment shader but can be determined in either shader or in the application

• Application color: pass to vertex shader as a uniform variable (next lecture) or as a vertex attribute

• Vertex shader color: pass to fragment shader as varying variable (next lecture)

• Fragment color: can alter via shader code 50E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012