Nima Kalantari
CSCE 441 - Computer Graphics
OpenGL
General code structure
int main()
{
Init();
while (WindowIsOpen() == true)
{
glClear(GL_COLOR_BUFFER_BIT);
Display();
UpdateWindowAndEvents();
}
return 0;
}
Drawing primitives
Outline
Transformations in OpenGL
Transformations in OpenGL
Example
void Display()
{
matrixStack.loadIdentity();
// View and projection transformations
matrixStack.pushMatrix();
matrixStack.Perspective(…);
matrixStack.LookAt(…);
// Model transformation
matrixStack.pushMatrix();
matrixStack.translate(-2.0f, 2.0f, 0.0f);
matrixStack.rotateY(glm::radians(45.0f));
matrixStack.scale(0.8);
DrawCube(matrixStack.topMatrix());
matrixStack.popMatrix();
matrixStack.popMatrix();
}
Outline
OpenGL Primitives
Points
Lines (also strips, loops)
Polygon
Triangle
Quad
Quad Strip
Triangle Strip
Triangle Fan
Slide from Ravi Ramamoorthi
Geometry
Outline
Drawing in Old OpenGL
Example
void Display()
{
glBegin(GL_TRIANGLES);
// Triangle 1
glVertex3f(+0.0f, +0.0f, +0.0f);
glVertex3f(+1.0f, +1.0f, +0.0f);
glVertex3f(-1.0f, +1.0f, +0.0f);
// Triangle 2
glVertex3f(+0.0f, +0.0f, +0.0f);
glVertex3f(-1.0f, -1.0f, +0.0f);
glVertex3f(+1.0f, -1.0f, +0.0f);
glEnd();
}
Example
void Display()
{
glBegin(GL_TRIANGLES);
// Triangle 1
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(+0.0f, +0.0f, +0.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(+1.0f, +1.0f, +0.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(-1.0f, +1.0f, +0.0f);
// Triangle 2
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(+0.0f, +0.0f, +0.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, +0.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(+1.0f, -1.0f, +0.0f);
glEnd();
}
Example
void Display()
{
glBegin(GL_TRIANGLE_STRIP);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(-1.0f, +1.0f, +0.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(+1.0f, +1.0f, +0.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(+0.0f, +0.0f, +0.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(+1.0f, -1.0f, +0.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, +0.0f);
glEnd();
}
Drawing in Old OpenGL
Problem
void Display()
{
glBegin(GL_TRIANGLES);
// Triangle 1
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(+0.0f, +0.0f, +0.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(+1.0f, +1.0f, +0.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(-1.0f, +1.0f, +0.0f);
// Triangle 2
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(+0.0f, +0.0f, +0.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, +0.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(+1.0f, -1.0f, +0.0f);
glEnd();
}
General code structure
int main()
{
Init();
while (WindowIsOpen() == true)
{
glClear(GL_COLOR_BUFFER_BIT);
Display();
UpdateWindowAndEvents();
}
return 0;
}
Slow!
void Display()
{
glBegin(GL_TRIANGLES);
// Triangle 1
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(+0.0f, +0.0f, +0.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(+1.0f, +1.0f, +0.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(-1.0f, +1.0f, +0.0f);
// Triangle 2
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(+0.0f, +0.0f, +0.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, +0.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(+1.0f, -1.0f, +0.0f);
glEnd();
}
Outline
Drawing in Modern OpenGL
Example – Without Color
GLuint vpbufferID;
void SendData()
{
GLfloat vertsPos[] =
{
+0.0f, +0.0f, +0.0f,
+1.0f, +1.0f, +0.0f,
-1.0f, +1.0f, +0.0f,
+0.0f, +0.0f, +0.0f,
-1.0f, -1.0f, +0.0f,
+1.0f, -1.0f, +0.0f
};
glGenBuffers(1, &vpbufferID);
glBindBuffer(GL_ARRAY_BUFFER, vpbufferID);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertsPos), vertsPos, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
}
Example – Without Color
void Display()
{
glBindBuffer(GL_ARRAY_BUFFER, vpbufferID);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 6);
}
Attribute ID
Number of
Elements
Type
Normalization
Stride
Offset
Primitive
Offset
Number of
vertices
Example – With Color
GLuint vpbufferID;
GLuint vcbufferID;
void SendData()
{
GLfloat vertsPos[] = { // vertices };
glGenBuffers(1, &vpbufferID);
glBindBuffer(GL_ARRAY_BUFFER, vpbufferID);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertsPos), vertsPos, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
GLfloat vertsCol[] = { // colors };
glGenBuffers(1, &vcbufferID);
glBindBuffer(GL_ARRAY_BUFFER, vcbufferID);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertsCol), vertsCol, GL_STATIC_DRAW);
glEnableVertexAttribArray(1);
}
Example – With Color
void Display()
{
…
glBindBuffer(GL_ARRAY_BUFFER, vpbufferID);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, vcbufferID);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 6);
…
}
Example – Combining Color & Position Arrays
GLuint vbufferID;
void SendData()
{
GLfloat verts[] =
{
// x , y , z , r , g , b
+0.0f, +0.0f, +0.0f, +1.0f, +0.0f, +0.0f,
+1.0f, +1.0f, +0.0f, +0.0f, +0.0f, +1.0f,
-1.0f, +1.0f, +0.0f, +0.0f, +1.0f, +0.0f,
+0.0f, +0.0f, +0.0f, +1.0f, +0.0f, +0.0f,
-1.0f, -1.0f, +0.0f, +0.0f, +0.0f, +1.0f,
+1.0f, -1.0f, +0.0f, +0.0f, +1.0f, +0.0f
};
glGenBuffers(1, &vbufferID);
glBindBuffer(GL_ARRAY_BUFFER, vbufferID);
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
}
Example – Combining Color & Position Arrays
void Display()
{
glBindBuffer(GL_ARRAY_BUFFER, vbufferID);
glVertexAttribPointer(0, 3, …,sizeof(float)*6, 0);
glVertexAttribPointer(1, 3, …,sizeof(float)*6, (void*)(sizeof(float)*3));
glDrawArrays(GL_TRIANGLES, 0, 6);
}
Stride
Offset
Number of Elements
Example – glDrawElements
GLuint vbufferID;
GLuint ibufferID;
void SendData()
{
GLfloat verts[] =
{
+0.0f, +0.0f, +0.0f, +1.0f, +0.0f, +0.0f,
+1.0f, +1.0f, +0.0f, +0.0f, +0.0f, +1.0f,
-1.0f, +1.0f, +0.0f, +0.0f, +1.0f, +0.0f,
-1.0f, -1.0f, +0.0f, +0.0f, +0.0f, +1.0f,
+1.0f, -1.0f, +0.0f, +0.0f, +1.0f, +0.0f
};
glGenBuffers(1, &vbufferID);
glBindBuffer(GL_ARRAY_BUFFER, vbufferID);
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
GLuint inds[] = { 0, 1, 2, 0, 3, 4 };
glGenBuffers(1, &ibufferID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibufferID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(inds), inds, GL_STATIC_DRAW);
}
Example – glDrawElements
void Display()
{
glBindBuffer(GL_ARRAY_BUFFER, vbufferID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibufferID);
glVertexAttribPointer(0, …, sizeof(float) * 6, 0);
glVertexAttribPointer(1, …, sizeof(float) * 6, (void*)(sizeof(float) * 3));
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
}
Primitive
Offset
Number of
Vertices
Type of
Indices