As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

26
As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1

Transcript of As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

Page 1: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 1

As well as colors, normals, and other vertex data

PUSHIN’ GEO TO THE GPU

Page 2: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 2

This is what we want to make

Page 3: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 3

Normalized Device Coordinate System

(-1, 1)

(-1, 0)

(-1, -1)

(0, 1)

(0, -1)

(0, 0)

(1, 1)

(1, 0)

(1, -1)

Page 4: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 4

Coordinates of our triangle(0.0f, 0.5f, 0.0f)

(0.5f, -0.5f, 0.0f)(-0.5f, -0.5f, 0.0f)

Page 5: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 5

QUICK! COLOR THEORY!• Represent almost any color by adding red, green and blue

• Alpha is the transparency

• Called the primary colors (RGB or RGBA)

• 0.0 means “all the way off”

• 1.0 means “all the way on”

• Examples:

• Red (1.0, 0.0, 0.0, 1.0)

• Blue (0.0, 0.0, 1.0, 1.0)

• Purple (1.0, 0.0, 1.0, 1.0)

• Yellow (1.0, 1.0, 0.0, 1.0)

• White (1.0, 1.0, 1.0, 1.0)

• Black (0.0, 0.0, 0.0, 1.0)

• Grey (0.5, 0.5, 0.5, 1.0)

• Brown (0.7, 0.5, 0.1, 1.0)

Page 6: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 6

Colors of our triangle*(0.0f, 0.0f, 1.0f, 1.0f)

(0.0f, 1.0f, 0.0f, 1.0f)(1.0f, 0.0f, 0.0f, 1.0f)

*Note the beautiful interpolation of color!

Page 7: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 7

BASIC PROBLEM

• Get the geometry and color to the GPU

• Typically also need a normal and texture coordinate for each vertex!

• Ask the OpenGL driver to create a buffer object

• This is just a chunk of memory (e.g. array)

• Nothing to be afraid of!

• Located on the GPU (probably)

Page 8: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 8

WORKING WITH BUFFERS• To create a buffer ID:

// This will be the ID of the bufferGLuint buffer;

// Ask OpenGL to generate exactly 1 unique IDglGenBuffers(1, &buffer);

• To set this buffer as the active one and specify which buffer we’re referring to:

glBindBuffer(GL_ARRAY_BUFFER, buffer);

• Notes:

• That buffer is now bound and active!

• Any “drawing” will come from that buffer

• Any “loading” goes into that buffer

Page 9: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 9

TWO APPROACHES TO LOADING THE BUFFER WITH DATA• Assume everything is in GLfloat* (called data)

• One-shot call to load the buffer with data:

glBufferData(GL_ARRAY_BUFFER, sizeof(data),

data, GL_STATIC_DRAW);

• Other drawing types GL_X_Y:

• X

• STREAM for infrequent use and changes

• STATIC for frequent use and infrequent change

• DYNAMIC for frequent use and frequent change

• Y could be DRAW, READ or COPY

Page 10: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 10

HOW WE’LL DO IT• Process

• Create the buffer and pass no data

• Load the geometry

• Load the colors (if any) after that

• Load the normals after that…

• Note: some like to interlace their vertex data…

Page 11: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 11

A SIDE-BY-SIDE COMPARISON• Show the relationship between client code and shader code

• Assume we’re still trying to draw 1 triangle…

• numVertices – the number of vertices (will be 3 - duh!)

• verts – the position information of each vertex (XYZ - array of GLfloats)

• colors – the color information of each vertex (RGBA - array of GLfloats)

Page 12: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 12

GLuint buffer;

glGenBuffers(1, &buffer);

buffer

Note: buffer “lives” on the graphics card in a nice, two-bedroom loft…

Page 13: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 13

GLuint buffer;

glGenBuffers(1, &buffer);

glBindBuffer (GL_ARRAY_BUFFER, buffer);

buffer

Hey – I’m active now

Page 14: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 14

GLuint buffer;

glGenBuffers(1, &buffer);

glBindBuffer (GL_ARRAY_BUFFER, buffer);

glBufferData(GL_ARRAY_BUFFER, numVertices*7*sizeof(GLfloat), NULL, GL_STATIC_DRAW);

buffer

Now I know how big I am!

Where’d the 7 come from?

Allocate how much space (in bytes) we need

Page 15: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 15

GLuint buffer;

glGenBuffers(1, &buffer);

glBindBuffer (GL_ARRAY_BUFFER, buffer);

glBufferData(GL_ARRAY_BUFFER, numVertices*7*sizeof(GLfloat), NULL, GL_STATIC_DRAW);

buffer

Now I know how big I am!

(x, y, z) + (r, g, b, a) = 7

Where’d the 7 come from?

Allocate how much space (in bytes) we need

Page 16: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 16

GLuint buffer;

glGenBuffers(1, &buffer);

glBindBuffer (GL_ARRAY_BUFFER, buffer);

glBufferData(GL_ARRAY_BUFFER, numVertices*7*sizeof(GLfloat), NULL, GL_STATIC_DRAW);

glBufferSubData (GL_ARRAY_BUFFER, 0, numVertices*3*sizeof(GLfloat), verts);

glBufferSubData (GL_ARRAY_BUFFER, numVertices*3*sizeof(GLfloat), numVertices*4*sizeof(GLfloat), colors);

buffer

Now I’m putting verts at the beginning

verts

Put verts at 0…

it’s pretty bigthough…

Page 17: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 17

GLuint buffer;

glGenBuffers(1, &buffer);

glBindBuffer (GL_ARRAY_BUFFER, buffer);

glBufferData(GL_ARRAY_BUFFER, numVertices*7*sizeof(GLfloat), NULL, GL_STATIC_DRAW);

glBufferSubData (GL_ARRAY_BUFFER, 0, numVertices*3*sizeof(GLfloat), verts);

glBufferSubData (GL_ARRAY_BUFFER, numVertices*3*sizeof(GLfloat), numVertices*4*sizeof(GLfloat), colors);

buffer

I’m putting colors next

verts

Put colors startingright after that!

It’s pretty big

too…

colors

Page 18: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 18

WHAT WE HAVE SO FAR…

• We have a buffer with an ID

• That buffer lives on the graphics card

• That buffer is full of vertex position/color data

• How do we get that info to our shader?

Page 19: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 19

HOW TO LINK TO THE SHADER• Query the shader program for its variables

• The code below goes into the shader program and gets the “vPosition” ID

GLuint vpos;vpos = glGetAttribLocation (programID, “vPosition”);

• In OpenGL, we have to enable things (attributes, in this case):

glEnableVertexAttribArray(vpos); // turn on vPosition

• Finally, we set the location and tell it the format of the data in the buffer

glVertexAttribPointer(vpos, 3, GL_FLOAT, GL_FALSE, 0, 0);

void glVertexAttribPointer(GLuint index, GLint size, Glenum type, GLboolean normalized, GLsizei stride,

const GLvoid* offset);

Page 20: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 20

GLuint loc = glGetAttribLocation(shaderProgramID, "vPosition");

#version 130

in vec4 vPosition;in vec4 vColor;out vec4 color;

void main () {color = vColor;gl_Position = vPosition;

}

Find the variable “vPosition” inside the shader

Page 21: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 21

GLuint loc = glGetAttribLocation(shaderProgramID, "vPosition");glEnableVertexAttribArray(loc);glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, 0, 0);

#version 130

in vec4 vPosition;in vec4 vColor;out vec4 color;

void main () {color = vColor;gl_Position = vPosition;

}

buffer

Guys! I’m still active, remember?

verts colors

Page 22: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 22

GLuint loc2 = glGetAttribLocation(shaderProgramID, "vColor");glEnableVertexAttribArray(loc2);glVertexAttribPointer(loc2, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(numVertices*3*sizeof(GLfloat)));

#version 130

in vec4 vPosition;in vec4 vColor;out vec4 color;

void main () {color = vColor;gl_Position = vPosition;

}

buffer

Tell vColor where to find its data in me…

verts colors

Page 23: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 23

GLuint loc = glGetAttribLocation(shaderProgramID, "vPosition");glEnableVertexAttribArray(loc);glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, 0, 0);

GLuint loc2 = glGetAttribLocation(shaderProgramID, "vColor");glEnableVertexAttribArray(loc2);glVertexAttribPointer(loc2, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(numVertices*3*sizeof(GLfloat)));

#version 130

in vec4 vPosition;in vec4 vColor;out vec4 color;

void main () {color = vColor;gl_Position = vPosition;

}

Page 24: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 24

ONE LAST THING• Vertex Array Objects (VAOs)

• “Pure State” - it remembers almost everything about buffers

• Set it up once, then just call it before drawing!

• glVertexAttribPointer…

• Doesn’t bind the VBO though…

• Creating a vertex array object:

// This will be the ID of the VAOGLuint vao;

// Ask the driver for exactly 1 unique IDglGenVertexArrays(1, &vao);

// Everything after this will be part of the VAOglBindVertexArray(vao);

Page 25: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 25

// Create the "remember all"

glGenVertexArrays(1, &vao);

glBindVertexArray(vao);

// Create a buffer and bind it as active

glGenBuffers(1, &vbo);

glBindBuffer(GL_ARRAY_BUFFER, vbo);

// Create space and load the buffer

glBufferData(GL_ARRAY_BUFFER, 7*3*sizeof(GLfloat), NULL, GL_STATIC_DRAW);

glBufferSubData(GL_ARRAY_BUFFER, 0, 3*3*sizeof(GLfloat), vertices);

glBufferSubData(GL_ARRAY_BUFFER, 3*3*sizeof(GLfloat),3*4*sizeof(GLfloat), colors);

// Find the positions of the variables in the shader

positionID = glGetAttribLocation(shaderProgramID, "vPosition");

colorID = glGetAttribLocation(shaderProgramID, "vColor");

// Tell the shader variables where to find their data

glVertexAttribPointer(positionID, 3, GL_FLOAT, GL_FALSE, 0, 0);

glVertexAttribPointer(colorID, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(3*3*sizeof(GLfloat)));

glUseProgram(shaderProgramID);

glEnableVertexAttribArray(positionID);

glEnableVertexAttribArray(colorID);

Page 26: As well as colors, normals, and other vertex data PUSHIN’ GEO TO THE GPU JEFF CHASTINE 1.

JEFF CHASTINE 26

END WITH A UTAH TEAPOT!