- No category
advertisement
OpenGL Tutorial
Mihail Gaianu
GUI - Graphics and user interfaces
19/03/2014
OpenGL IS an API
OpenGL IS nothing more than a set of functions you call from your program
(think of as collection of .h file(s)).
Hides the details of the display adapter, operating system, etc.
Comprises several libraries with varying levels of abstraction: GL, GLU, and
GLUT
What is OpenGL?
A software interface to graphics hardware
Graphics rendering API (Low Level)
High-quality color images composed of geometric and image primitives
Window system independent
Operating system independent
OpenGL Basics
Rendering
Typically execution of OpenGL commands
Converting geometric/mathematical object descriptions into frame buffer values
OpenGL can render:
Geometric primitives
Lines, points, polygons, etc…
Bitmaps and Images
Images and geometry linked through
texture mapping
Graphics Pipeline
OpenGL Hierarchy
Several levels of abstraction are provided
GL
Lowest level: vertex, matrix manipulation glVertex3f(point.x, point.y, point.z)
GLU
Helper functions for shapes, transformations gluPerspective( fovy, aspect, near, far )
GLUT
Highest level: Window and interface management glutSwapBuffers()
How to install GLUT?
Download GLUT http://www.opengl.org/resources/libraries/glut.html
Copy the files to following folders: glut.h VC/include/gl/
glut32.lib VC/lib/ glut32.dll windows/system32/
Header Files:
#include <GL/glut.h>
#include <GL/gl.h>
Include glut automatically includes other header files
OpenGL Implementations
OpenGL IS an API (think of as collection of .h files):
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
Windows, Linux, UNIX, etc. all provide a
platform specific implementation.
Windows: opengl32.lib glu32.lib glut32.lib
Linux: -l GL -l GLU –l GLUT
OpenGL API
As a programmer, you need to do the following things:
Specify the location/parameters of camera.
Specify the geometry (and appearance).
Specify the lights (optional).
OpenGL will compute the resulting 2D image!
Sample Program
#include <GL/glut.h>
#include <GL/gl.h> void main(int argc, char** argv)
{ int mode = GLUT_RGB|GLUT_DOUBLE; glutInitDisplayMode( mode ); glutInitWindowSize( 500,500 ); glutCreateWindow( “Simple” );
init();
glutDisplayFunc( display );
glutKeyboardFunc( key );
glutMainLoop();
}
Sample Program
#include <GL/glut.h>
#include <GL/gl.h> void main(int argc, char** argv)
{
int mode =
GLUT_RGB|GLUT_DOUBLE; glutInitDisplayMode( mode );
glutInitWindowSize( 500,500 ); glutCreateWindow( “Simple” );
init();
glutDisplayFunc( display );
glutKeyboardFunc( key );
glutMainLoop();
}
Specify the display
Mode – RGB or color
Index, single or double
Buffer
Sample Program
#include <GL/glut.h>
#include <GL/gl.h> void main(int argc, char** argv)
{
int mode =
GLUT_RGB|GLUT_DOUBLE ;
glutInitDisplayMode( mode );
glutInitWindowSize( 500,500 );
glutCreateWindow( “Simple” );
init();
glutDisplayFunc( display );
glutKeyboardFunc( key );
glutMainLoop();
}
Create a window
Named “simple” with resolution
500 x 500
Sample Program
#include <GL/glut.h>
#include <GL/gl.h> void main(int argc, char** argv)
{
int mode =
GLUT_RGB|GLUT_DOUBLE ;
glutInitDisplayMode( mode ); glutInitWindowSize( 500,500 ); glutCreateWindow( “Simple” );
init();
glutDisplayFunc( display );
glutKeyboardFunc( key );
glutMainLoop();
}
Your OpenGL initialization
code (Optional)
Sample Program
#include <GL/glut.h>
#include <GL/gl.h> void main(int argc, char** argv)
{
int mode =
GLUT_RGB|GLUT_DOUBLE ;
glutInitDisplayMode( mode ); glutInitWindowSize( 500,500 ); glutCreateWindow( “Simple” ); init();
glutDisplayFunc( display ); glutKeyboardFunc(key);
glutMainLoop();
}
Register your call back functions
glutMainLoop()
#include <GL/glut.h>
#include <GL/gl.h> int main(int argc, char** argv)
{
int mode =
GLUT_RGB|GLUT_DOUBLE ;
glutInitDisplayMode(mode); glutInitWindowSize(500,500); glutCreateWindow(“Simple”); init();
glutDisplayFunc(display);
glutKeyboardFunc(key);
glutMainLoop();
}
The program goes into an infinite loop waiting for events
OpenGL Initialization
Set up whatever state you’re going to use
Don’t need this much detail unless working in 3D
void init( void )
{
glClearColor (0.0, 0.0, 0.0, 0.0); glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-10, 10, -10, 10, -10, 20); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glEnable( GL_LIGHT0 ); glEnable( GL_LIGHTING ); glEnable( GL_DEPTH_TEST );
}
Polygon Issues
OpenGL will only display polygons correctly that are
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
User program can check if above true
OpenGL will produce output if these conditions are violated but it may not be what is desired
Triangles satisfy all conditions
That’s why we need triangulation algorithms!
OpenGL Conventions
Many functions have multiple forms:
glVertex2f, glVertex3i, glVertex4dv, etc.
Number indicates number of arguments
Letters indicate type
f: float, d: double, ub: unsigned byte, etc.
‘v’ (if present) indicates a single pointer argument
glVertex3f(point.x, point.y, point.z) glVertex3fv(point)
OpenGL Command Format
OpenGL Geometric Primitives
The geometry is specified by vertices.
There are ten primitive types:
Vertices and Primitives
Primitives are specified using glBegin( primType );
… glEnd();
primType
determines how vertices are combined
GLfloat
red, green, blue;
Glfloat coords[nVerts][3];
/*Initialize coords and colors somewhere in program*/
glBegin(
primType
);
for ( i = 0; i < nVerts; ++i ) {
glColor3f( red, green, blue );
glVertex3fv( coords[i] );
}
glEnd();
An Example
void drawParallelogram( GLfloat color[] )
{ glBegin( GL_QUADS ); glColor3fv( color ); glVertex2f( 0.0, 0.0 ); glVertex2f( 1.0, 0.0 ); glVertex2f( 1.5, 1.118 ); glVertex2f( 0.5, 1.118 ); glEnd();
}
Vertices and Primitives
Points, GL_POINTS
Individual points
Point size can be altered
glPointSize ( float size )
glBegin( GL_POINTS );
glColor3fv( color ); glVertex2f( P0.x, P0.y ); glVertex2f( P1.x, P1.y ); glVertex2f( P2.x, P2.y ); glVertex2f( P3.x, P3.y ); glVertex2f( P4.x, P4.y ); glVertex2f( P5.x, P5.y ); glVertex2f( P6.x, P6.y ); glVertex2f( P7.x, P7.y );
glEnd();
Vertices and Primitives
Lines, GL_LINES
Pairs of vertices interpreted as individual line segments
Can specify line width using:
glLineWidth ( float width )
glBegin( GL_LINES );
glColor3fv( color ); glVertex2f( P0.x, P0.y ); glVertex2f( P1.x, P1.y ); glVertex2f( P2.x, P2.y ); glVertex2f( P3.x, P3.y ); glVertex2f( P4.x, P4.y ); glVertex2f( P5.x, P5.y ); glVertex2f( P6.x, P6.y ); glVertex2f( P7.x, P7.y );
glEnd();
Vertices and Primitives
Line Strip, GL_LINE_STRIP series of connected line segments
Vertices and Primitives
Line Loop, GL_LINE_LOOP
Line strip with a segment added between last and first vertices
Vertices and Primitives
Polygon , GL_POLYGON boundary of a simple, convex polygon
Vertices and Primitives
Triangles , GL_TRIANGLES triples of vertices interpreted as triangles
Vertices and Primitives
Triangle Strip , GL_TRIANGLE_STRIP linked strip of triangles v0 v1 v2 v3 v4 v5 v7 v6
Vertices and Primitives
Triangle Fan ,
GL_TRIANGLE_FAN
linked fan of triangles v1 v0 v2 v3 v4 v5
Vertices and Primitives
Quads , GL_QUADS quadruples of vertices interpreted as four-sided polygons
Vertices and Primitives
Between glBegin/ glEnd, those opengl commands are allowed: glVertex*() : set vertex coordinates
glColor*() : set current color glIndex*() : set current color index glNormal*() : set normal vector coordinates (Light.) glTexCoord*() : set texture coordinates (Texture)
GLUT Callback functions
Event-driven
: Programs that use windows
Input/Output
Wait until an event happens and then execute some pre-defined functions according to the user’s input
Events
– key press, mouse button press and release, window resize, etc.
Your OpenGL program will be in infinite loop
GLUT Callback Functions
Callback function : Routine to call when an event happens
Window resize or redraw
User input (mouse, keyboard)
Animation (render many frames)
“Register” callbacks with GLUT
glutDisplayFunc( my_display_func ); glutIdleFunc( my_idle_func ); glutKeyboardFunc( my_key_events_func ); glutMouseFunc ( my_mouse_events_func );
Event Queue
MainLoop()
Event queue
Keyboard
….
Mouse
Window
Mouse_callback()
{
….
{
Keypress_callback()
{
….
{ window_callback()
{
….
{
Rendering Callback
Callback function where all our drawing is done
Every GLUT program must have a display callback glutDisplayFunc(
my_display_func
); /* this part is in main.c */
void my_display_func (void )
{ glClear(
GL_COLOR_BUFFER_BIT
)
;
glBegin(
GL_TRIANGLE
)
;
glVertex3fv( v[0] );
glVertex3fv( v[1] );
glVertex3fv( v[2] );
glEnd(); glFlush();
}
Idle Callback
Use for animation and continuous update
Can use glutTimerFunc
or timed callbacks for animations glutIdleFunc(
idle void idle( void )
{
);
/* change something */
t += dt;
glutPostRedisplay();
}
User Input Callbacks
Process user input glutKeyboardFunc( my_key_events );
void my_key_events (char key, int x, int y )
{
switch ( key ) {
case ‘q’ : case ‘Q’ :
exit ( EXIT_SUCCESS);
break;
case ‘r’ : case ‘R’ :
rotate = GL_TRUE;
break;
}
}
Mouse Callback
Captures mouse press and release events glutMouseFunc( my_mouse );
void myMouse(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON && state ==
GLUT_DOWN)
{
…
}
}
Events in OpenGL
Event Example
Keypress KeyDown
KeyUp
Mouse leftButtonDown leftButtonUp
Motion With mouse press
Without
Window Moving
Resizing
System Idle
Timer
Software What to draw
OpenGL Callback
Function
glutKeyboardFunc glutMouseFunc glutMotionFunc glutPassiveMotionFunc glutReshapeFunc glutIdleFunc glutTimerFunc glutDisplayFunc
Questions?
advertisement
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project