Top Banner
Viewing and OpenGL EDAF80 Michael Doggett 2017 Slides by Jacob Munkberg 2012-13
55

Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

Mar 15, 2018

Download

Documents

doannhan
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

Viewing and OpenGLEDAF80

Michael Doggett

2017Slides by Jacob Munkberg 2012-13

Page 2: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

MD16

Adding a Cube Map• Complete loadTextureCubeMap and use it

• Add a cube map to your current node

• node.cpp will bind the cube map and set the uniform (check the code)

• In your fragment shader add

• Then use it in your fragment shader

2

auto my_cube_map_id = eda221::loadTextureCubeMap("sunset_sky/posx.png","sunset_sky/negx.png",                                           "sunset_sky/posy.png","sunset_sky/negy.png",                                           "sunset_sky/negz.png","sunset_sky/posz.png", true);

uniform samplerCube my_cube_map;

big_sphere.add_texture(“my_cube_map", my_cube_map_id, GL_TEXTURE_CUBE_MAP);

frag_color = texture(my_cube_map, myTexCoords);

Page 3: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Today• Camera setup

• Viewing and Projection

• Modern OpenGL - Walkthrough of simple GLUT program

3

Transforms http://www.realtimerendering.com/udacity/transforms.html

Page 4: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Task at Hand• Setup an OpenGL camera

• Find matrix that transforms an arbitrary camera to the origin, looking along the negative z axis

4

Page 5: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

up

E C

Setup Camera Matrix• LookAt function

- Takes eye position (E), a position to look at (C) and an up vector (up)

- Constructs the View matrix, i.e., a matrix that transforms geometry (in world space) into the camera’s coordinate system (camera space)

5

mat4 View = LookAt(E.x,E.y,E.z, // Camera position C.x,C.y,C.z, // Center of interest up.x, up.y, up.z); // Up-vector

Page 6: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Camera Placement

• Specify camera position (E), center of interest (C) and up-vector (up)

6

y

xz

up

E C

Derivation from Ravi Ramamoorthi

Page 7: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

OpenGL convention• In OpenGL: right-hand coordinate

system, looking down -z.

7

y

x

z

Page 8: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Find orthonormal basis

8

y

xz

w =a

|a|

b = up

Derivation from Ravi Ramamoorthi

w

a = E � C

u =b⇥w

|b⇥w| v = w ⇥ u

u

v

• OpenGL standard: camera looks along negative z. Choose w in direction -(C-E)

E C

Page 9: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Find orthonormal basis

9

y

xz

Derivation from Ravi Ramamoorthi

w

u

v

• Now, we look for matrix that transforms frame {u, v, w, E} to {x, y, z, O}

• Translation and rotation

EO

Page 10: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Find orthonormal basis

10

y

xz

Derivation from Ravi Ramamoorthi

• Translate uvwE frame so that the origin align with the xyzO frame

w

u

v

t

t =

2

4�E

x

�Ey

�Ez

3

5

E

Page 11: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Find orthonormal basis

11

y

xz

Derivation from Ravi Ramamoorthi

w

u

v

• Translate uvwE frame so that the origin align with the xyzO frame

Page 12: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Find orthonormal basis

12

y

xz

Derivation from Ravi Ramamoorthi

w u

v

• Then rotate uvw basis so that the three axes align, u // x, v // y and w // z

• Rotation matrix given by

• R rotates vectors uvw to xyz

R =

2

4� u �� v �� w �

3

5

Ru =

2

4� u �� v �� w �

3

5

2

4|u

|

3

5 =

2

4u · uv · uw · u

3

5 =

2

4100

3

5 = x

Rv = y, Rw = z

Page 13: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Camera Placement• Combine the two transforms

• Move to center, and apply rotation

13

Derivation from Ravi Ramamoorthi

Move to centerRotate

M =

2

664

ux

uy

uz

0vx

vy

vz

0w

x

wy

wz

00 0 0 1

3

775

2

664

1 0 0 �Ex

0 1 0 �Ey

0 0 1 �Ez

0 0 0 1

3

775

Page 14: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Workflow• OpenGL geometry workflow

- Place camera in scene

- Find View transform that moves camera toorigin, looking along -z.

- Place geometry in scene using Model (or World) transform

- Setup camera Projection matrix (3D->2D)

- Apply ModelViewProjection matrix to all geometry in the scene in vertex shader

14

Page 15: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Projection• From 3D to a 2D image

- Orthographic projection

- Perspective projection

• Lines map to lines - Projective transform does not preserve parallel

lines, angles or distances!

15

Page 16: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Orthographic Projection• Drop one coordinate

- Project onto xy plane: (x,y,z)-> (x,y)

- Parallel lines remain parallel

- In homogeneous coordinates:

16

2

664

xp

yp

zp

1

3

775 =

2

664

1 0 0 00 1 0 00 0 0 00 0 0 1

3

775

2

664

x

y

z

1

3

775

Page 17: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Orthographic vs Perspective

17

Page 18: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D18

Albrecht Dürer’s 1525 woodcut ‘Man drawing a Lute’

Page 19: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Pinhole Camera

• Projection of a 3D point (x,y,z) on image plane:

19

xp = �d

x

z

, yp = �d

y

z

Page 20: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Synthetic Camera Model

20

center of projection

image plane

p

projection of p xp = d

x

z

yp = d

y

z

Page 21: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Perspective Projection• More realistic model - objects far away

are smaller after projection

21

(x, z)

d

(xp, d)

z

(x, y, z) ! (dx

z

, d

y

z

)

xp

d

=x

z

xp = d

x

z

Equal triangles

Page 22: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

OpenGL convention• In OpenGL: right-hand coordinate

system, looking down -z. - The image plane is placed at z = -d

- Visible geometry has negative z-values

22

y

x

z

z=-d

Page 23: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Homogeneous Coordinates• Change our homogeneous coordinate

to be scaled

• Normalize by dividing with w

• Vector: - “Point at infinity”, pure direction

• Exploit this representation to express projection

23

v = (x, y, z, 0)

(wx,wy,wz, w) = (x, y, z, 1)

Page 24: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Perspective Projection on Matrix Form

24

2

664

1 0 0 00 1 0 00 0 1 00 0 � 1

d 0

3

775

2

664

x

y

z

1

3

775 =

2

664

x

y

z

� zd

3

775

2

664

x

y

z

� z

d

3

775 !

2

664

�dx

z

�dy

z

�d

1

3

775projected point on image plane z = -d

Divide by: �z

d

Common standard: Let d = 1

Page 25: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Camera in OpenGL• Perspective camera setup

25

y

z

z=-far

y=bottomz=-near

y=topz=-near

View volume

top = tan(fovy)*near

fovy

Page 26: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

OpenGL Projection Matrix

26

mat4 proj = Perspective(fovy,aspect,n,f);

aspect = w/h t = tan(fovy)*n r = t*aspect

y

xz

2*fovy

z=-f

z=-n (r, t) 2

664

nr 0 0 00 n

t 0 00 0 � f+n

f�n�2fnf�n

0 0 �1 0

3

775

w

h

mat4 proj = glm::perspective(fovy,aspect,n,f);

Page 27: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Examples

27

2

664

nr 0 0 00 n

t 0 00 0 � f+n

f�n�2fnf�n

0 0 �1 0

3

775

2

664

rt

�n1

3

775 =

2

664

nn�nn

3

775 !

2

664

11�11

3

775

y

xz

z=-f

z=-n(r, t)

Point at upper right corner at near plane ( z=-n )

Point along view direction (-z) at far plane ( z=-f )divide by w

divide by w

2

664

nr 0 0 00 n

t 0 00 0 � f+n

f�n�2fnf�n

0 0 �1 0

3

775

2

664

00�f1

3

775 =

2

664

00ff

3

775 !

2

664

0011

3

775

Page 28: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

OpenGL Projection Matrix

28

(-1,-1,-1)

(1,1,1)

y

xz

z=-f

z=-n (r, t)

• View frustum volume maps to a cube

divide by w

Page 29: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

New Coordinate Spaces

29

Clip space

NDC

2

664

n

r

0 0 00 n

t

0 00 0 � f+n

f�n

�2fnf�n

0 0 �1 0

3

775

2

664

x

y

z

1

3

775 =

2

664

x

c

y

c

z

c

w

c

3

775 !

2

664

xcwcyc

wczcwc

1

3

775

Projection Matrix

y

xz

z=-f

z=-n (r, t)

Camera space Normalized

Device Coords

divide by w

Page 30: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Classification of Transforms

Translation

Rotation

Uniform Scaling

Non-Uniform Scaling

Shear

Reflection

Perspective30

Rigid Body preserves anglesand distances

Similaritypreserves angles

Affine preserves parallel lines

Projective preserves lines

Page 31: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

OpenGL

Page 32: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

What is OpenGL?• OpenGL is a computer graphics

rendering application programming interface (API)

• High level API to graphics hardware

• Abstracts the graphics pipeline

• State machine - Input can either change the state or produce

visible output

32

Page 33: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Flavors of GL• OpenGL

- Desktop & laptop

• OpenGL ES - Phones & tablets

- Focus on energy efficiency (heat, battery life)

• WebGL - JavaScript implementation of OpenGL ES

- Works in modern web-browsers

33

Page 34: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Graphics Hardware• Pipeline that accelerates the costly

tasks of rendering

34

Vertex Shader

Rasterizer

Pixel Shader

Move geometry

Compute visibility per pixel

Compute color per pixel

Page 35: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Graphics Hardware• Expresses the rendering pipeline

35

Vertex Shader

Rasterizer

Pixel Shader

GLSL vertex shader

program

GLSL pixel shader

program

OpenGL applicationcode (C)

Page 36: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

OpenGL Programming• Create shaders

• Create buffers and load data into them - Vertices, normals, transformation matrices,

textures

• Connect buffers with shader variables

• Render to an on-screen window - Platform specific, or use GLFW

• (or GLUT(better freeglut) or SDL)

36

Page 37: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Platform Independence• Avoid OS window specific code

- OpenGL renders into a window, needs to communicate with native windowing system

- GLFW/GLUT: open source lib for windowing ops.

• Different linkage mechanisms between OSs - Library functions may look different on different

platforms (Windows, Linux, OS X, ...)

- GLAD/GLEW: open source library hides this

37

Page 38: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Example setup code• Render a triangle

- Create triangle vertices

- Create Vertex Buffer Object to hold vertex data

- Write shaders that:

• Position the triangle (vertex shader)

• Color the triangle (pixel shader)

38

Page 39: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Create Geometry

39

struct vec4 { float x; float y; float z; float w; };

vec4 points[3] = { vec4(0,0,0,1), // vec 0 vec4(1,0,0,1), // vec 1 vec4(0,1,0,1), // vec 2 };

0 1

2

x

y

Page 40: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Vertex Array Object (VAO)• Store all data of a geometric object

- Holds one or more buffers describing the object

40

GLuint vaoID; glGenVertexArrays(1, &vaoID); // generate vertex array // object name(s)

glBindVertexArray(vaoID); // bind a specific vertex array // i.e., render a specific object

Page 41: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Vertex Buffer Object• Store vertex data in GL buffers

41

GLuint bufferID; gGenBuffers(1, &bufferID); // generate vertex array // object name(s)

glBindBuffer(GL_ARRAY_BUFFER, bufferID); // vertex array

glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW); // fill buffer // with data

vec4 points[3] = { vec4(0,0,0,1), vec4(1,0,0,1), vec4(0,1,0,1), };

Page 42: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Connect vertex array to shader• Application vertex data enters GL

pipeline through vertex shader - Load shaders

- Get entry point in shader

- Set pointer to uploaded buffer data

42

GLuint posID = glGetAttribLocation( program, "vPosition" ); glEnableVertexAttribArray( posID ); glVertexAttribPointer( posID, 4, GL_FLOAT, GL_FALSE, 0,0);

in vec4 vPosition; uniform mat4 MVP; //ModelViewProj

void main() { gl_Position = MVP * vPosition; }

Page 43: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Passing variables to shaders• Need to associate a uniform shader

variable with an OpenGL data source - Example:

GLint mat_idx = glGetUniformLocation( program, ”MVP” );GLfloat mvp[16] = ... glUniformMatrix4fv(mat_idx, 1, GL_TRUE, mvp);

43

in vec4 vPosition; uniform mat4 MVP; //ModelViewProj

void main() { gl_Position = MVP * vPosition; }

Page 44: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Draw Geometry• Tell OpenGL to start rendering the

triangle

44

glDrawArrays( GL_TRIANGLES, 0, 3 );

start indexnumber of indices

primitive type

Page 45: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Build primitives from vertices

45

GL_POINTS GL_LINES

GL_TRIANGLES GL_TRIANGLE_STRIP

0 1

2 3

40 1

2

01

2

3

0

12

3

4

5

3

4 5

6

7

8

Page 46: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Transforms• User constructs matrices in application

code

• Pass them to the vertex shader -GLint mat_idx = glGetUniformLocation( program, ”MVP” );

GLfloat mvp[16] = ... glUniformMatrix4fv(mat_idx, 1, GL_TRUE, mvp);

• Vertex shader applies matrices - Last matrix applied is the projection matrix

- Output is a clip space position

46

Page 47: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

User input• Callbacks for mouse and keyboard

- See assignment code for examples

- Feel free to modify/add additional controls

- GLFW/GLUT has convenient callbacks for keyboard & mouse interactions

47

Page 48: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Getting shaders into OpenGL• Shaders need to be compiled and

linked to form an executable shader program that runs on the graphics card

48

Page 49: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Shader Setup

49

GLuint initShaders() { GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER); GLuint pixelShaderID = glCreateShader(GL_FRAGMENT_SHADER); const char* vs = textFileRead("simple.vert"); const char* fs = textFileRead("simple.frag"); glShaderSource(vertexShaderID, 1, &vs, NULL); glShaderSource(pixelShaderID, 1, &fs, NULL); delete [] vs; delete [] fs; glCompileShader(vertexShaderID); glCompileShader(pixelShaderID); GLuint program = glCreateProgram(); glAttachShader(program,pixelShaderID); glAttachShader(program,vertexShaderID); glLinkProgram(program); glUseProgram(program);

return program; }

Page 50: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

An OpenGL program in GLUT

Page 51: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Main

51

int main(int argc, char **argv) { GLenum err = glewInit(); // Init GLEW if (GLEW_VERSION_3_0) { printf("GL version 3 supported \n"); }

glutInit(&argc, argv); // Init GLUT glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(100,100); glutInitWindowSize(512,512); glutCreateWindow("GLSL Test"); // Set GLUT callbacks glutDisplayFunc(render); glutIdleFunc(render); glutReshapeFunc(resize); glutKeyboardFunc(processKeys); glutMouseFunc(processMouse); glutMotionFunc(processMouseActiveMotion); init(); // Create geometry and shaders glutMainLoop(); cleanup(); return 0; }

Page 52: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Init - Setup Geometry

52

void init() { glClearColor(1.0,1.0,1.0,1.0); gShaderProgramID = initShaders();

// Create geometry (one triangle) vec3 vertices[3]; vertices[0] = vec3( -0.5f, -0.5f, 1.0f); vertices[1] = vec3( 0.5f, -0.5f, 1.0f); vertices[2] = vec3( -0.5f, 0.5f, 1.0f);

// Create a vertex array object glGenVertexArrays( 1, &gVaoID ); glBindVertexArray( gVaoID );

// Create and initialize a buffer object glGenBuffers( 1, &gVboID ); glBindBuffer( GL_ARRAY_BUFFER, gVboID ); glBufferData( GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW );

// Initialize the vertex position attribute from the vertex shader GLuint pos = glGetAttribLocation( gShaderProgramID, "vPosition" ); glEnableVertexAttribArray( pos ); glVertexAttribPointer( pos, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0) ); }

in vec4 vPosition; uniform mat4 MVP;//ModelViewProj

void main() { gl_Position = MVP*vPosition; }

0 1

2

x

y

Page 53: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Resize

53

// If the size of the window changed, // call this to update the GL matrices void resize(int w, int h) { if(h == 0) h = 1; // Prevent a divide by zero // Calculate the projection matrix float aspect = ((float)w) / h; float fovy = 45.0f; float near = 0.01f; float far = 10.0f; gProjectionMatrix = Perspective(fovy, aspect, near, far);

glViewport(0, 0, w, h); // Set the viewport to be the entire window }

aspect = w/h t = tan(fovy)*n r = t*aspect

y

xz

2*fovy

z=-f

z=-n (r, t)

2

664

nr 0 0 00 n

t 0 00 0 � f+n

f�n�2fnf�n

0 0 �1 0

3

775

w

h

Page 54: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Render

54

void render() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Calculate the view matrix vec3 at(0.0,0.0,0.0); vec3 up(0.0,1.0,0.0); mat4 View = LookAt(gEyePos, at, up ); // Compute world matrix mat4 World = ...; // Compute ModelViewProjection matrix mat4 MVP = gProjectionMatrix*View*World; // Pass the modelview projection matrix to the shader GLuint mvpID = glGetUniformLocation(gShaderProgramID,"MVP"); glUniformMatrix4fv(mvpID, 1, GL_TRUE, (GLfloat*)MVP.getFloatArray()); // draw a triangle glDrawArrays(GL_TRIANGLES, 0, 3); glutSwapBuffers(); }

in vec4 vPosition; uniform mat4 MVP; //ModelViewProj

void main() { gl_Position = MVP * vPosition; }

y

xz

up

E C

Page 55: Viewing and OpenGL - LTHfileadmin.cs.lth.se/cs/Education/EDA221/lectures/Lecture5_web.pdfViewing and OpenGL EDAF80 Michael Doggett ... •Viewing and Projection ... communicate with

EDAF80 - Computer graphics: Introduction to 3D

Input Handling

55

// Mouse and keyboard handling void processKeys(unsigned char key, int x, int y) { switch (key) { case 27: // ASCII code for the escape key exit(0); break; case 'w': case ‘W': gEyePos.z -= 0.1; break; case 's': case 'S': gEyePos.z += 0.1; break; default: break; } }