500 likes | 684 Views
COS 397 Computer Graphics Practical Session №1. Introduction to OpenGL, GLFW and CG. Outline. Task 1 : CodeBlock , GLFW & OpenGL testing Task 2 : Full Screen mode Task 3 : Graphical Application Structure Task 4: Alternative Structure of Graphical Application
E N D
COS 397 Computer Graphics Practical Session №1 Introduction to OpenGL, GLFW and CG
Outline • Task 1:CodeBlock, GLFW&OpenGL testing • Task 2: Full Screen mode • Task 3: Graphical Application Structure • Task 4: Alternative Structure of Graphical Application • Task 5:OpneGLprimitives – points, lines, • triangles, squares, polygons • Task 6: Cube vertices • Task 7: Cube edges • Task 8: Cube Size Parameterization • Task 9: Concentric Cubes • Task 10:Cube Center Parameterization
Learning Outcomes • Introduction to OpenGL (1.x) in level to design and implement simple 3Danimations • Implementation of simple CG algorithms
Software • Required software • OpenGL, GLU, GLFW, GCC • Code::Blocks • Information about OpenGL 1.xhttp://www.opengl.org/registry/http://www.glprogramming.com/red/ • Alternative software • MESA, FreeGLUT, GLUT, Notepad, C compiler
Task №1 CodeBlock, GLFW&OpenGL Testing • Let’s Begin: • Code::Blocks • GNU GCC Compiler • GLFW 2.7.7 32-bit
Task №1 • Create New project • File → New → Project → GLFW Project
Settings • Choose project name and browse for location • Browse to select the folder where is GLFW library stored
Hint • Code::Blocks should explicitly “know” where is GLFW 2.7 library
Result • Automatically generated GLFW project • Build and Run
Task №2 Full Screen mode • GLFW functions • GLFW Reference Manualhttp://www.glfw.org/GLFWUsersGuide277.pdfsections 3.1.1, 3.1.2 и 3.2.1 • Changes in glfwOpenWindow() • ParameterGLFW_FULLSCREEN
Task № 3:Graphical Application Structure • Minimal Skeleton of GLFWcode #include <GL/glfw.h> int main() { glfwInit(); glfwOpenWindow(512,512,0,0,0,0,0,0,GLFW_WINDOW); while(…) { //Using OpenGL, GLU, GLFW functions } glfwTerminate(); return 0; }
Graphical Application Structure • Structure of GLFW Application • GLFW Initialization • OpenGLwindow opening • Animation frame (scene) generation • Termination
Graphical Application Structure • Animation frame (scene) generation • Buffers Cleaning • Projection Type Setting • View Point Setting • Drawing a frame in the hidden buffer • Swapping the hidden buffer with the visible one • Task • Identify these elements in generated source code in Task 1
Alternative Structure of Minimal GLFW Application Proposed in GLFW Reference Manual
Task №4 Alternative Structure of Graphical Application • Define the following functions: • bool running() – to test whether to continue running • void init() – to initialize the graphical window, to set perspective, to set point of view and etc. • void finit() – to close the graphical window and to terminate the process
Alternative Structure of Minimal GLFW Application • #include <GL/glfw.h> • bool running() { // definition } • void init() { // definition } • void finit() { // definition } • int main() • { • init(); // Initialization • while( running() ) // Testing • { • glClear( GL_COLOR_BUFFER_BIT ); • glRotatef( 0.1, 0.4, -0.2, 0.7); // We will keep this rotation, because It will be necessary for other tasks // single frame drawing // <Write your code here ….> • glfwSwapBuffers(); • } • finit(); // Termination • return 0; • }
Task 5: OpenGL primitives – points, lines, triangles, squares, polygons • glBegin(GLenummode); • …. // list of vertices and colors • glEnd(); • Parameters • Mode - Specifies the primitive or primitives that will be created from vertices presented between glBegin and the subsequent glEnd. Ten symbolic constants are accepted: • GL_POINTS, • GL_LINES, • GL_LINE_STRIP, • GL_LINE_LOOP, • GL_TRIANGLES, • GL_TRIANGLE_STRIP, • GL_TRIANGLE_FAN, • GL_QUADS, • GL_QUAD_STRIP, and • GL_POLYGON. • More readings: http://www.opengl.org/sdk/docs/man2/xhtml/glBegin.xml
Vertices • 2D • void glVertex2i(GLint x, GLint y); • void glVertex2f(GLfloat x, GLfloat y); • 3D • void glVertex3i(GLint x, GLint y, GLint z); • void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
I hope that you have no eye problem and will be able to see the result on the screen without magnifier
Color • //integer values in range [0;255] • void glColor3i(GLint red, GLint green, GLint blue); • //floating point values in range [0.0; 1.0] • void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
2D Points (1,1) (-1,1) glBegin(GL_POINTS); glVertex2f(-.6,1.); glVertex2f(-.6,.6); glVertex2f(-.2,.6); glVertex2f(-.2,-.6); glVertex2f(-.6,-.6); glVertex2f(-.6,-1.); glVertex2f(.6,-1.); glVertex2f(.6,-.6); glVertex2f(.2,-.6); glVertex2f(.2,.6); glVertex2f(.6,.6); glVertex2f(.6,1.); glEnd(); (-1,-1) (1,-1)
2D Lines (1,1) (-1,1) glBegin(GL_LINES); glVertex2f(-.6,1.); glVertex2f(-.6,.6); glVertex2f(-.2,.6); glVertex2f(-.2,-.6); glVertex2f(-.6,-.6); glVertex2f(-.6,-1.); glVertex2f(.6,-1.); glVertex2f(.6,-.6); glVertex2f(.2,-.6); glVertex2f(.2,.6); glVertex2f(.6,.6); glVertex2f(.6,1.); glEnd(); (-1,-1) (1,-1)
Line Strip (1,1) (-1,1) glBegin(GL_LINE_STRIP); glVertex2f(-.6,1.); glVertex2f(-.6,.6); glVertex2f(-.2,.6); glVertex2f(-.2,-.6); glVertex2f(-.6,-.6); glVertex2f(-.6,-1.); glVertex2f(.6,-1.); glVertex2f(.6,-.6); glVertex2f(.2,-.6); glVertex2f(.2,.6); glVertex2f(.6,.6); glVertex2f(.6,1.); glEnd(); (-1,-1) (1,-1)
2D Line Loop (1,1) (-1,1) glBegin(GL_LINE_LOOP); glVertex2f(-.6,1.); glVertex2f(-.6,.6); glVertex2f(-.2,.6); glVertex2f(-.2,-.6); glVertex2f(-.6,-.6); glVertex2f(-.6,-1.); glVertex2f(.6,-1.); glVertex2f(.6,-.6); glVertex2f(.2,-.6); glVertex2f(.2,.6); glVertex2f(.6,.6); glVertex2f(.6,1.); glEnd(); (-1,-1) (1,-1)
2D Polygon OpenGL only supports convex polygons (and really only triangles) (1,1) (-1,1) glBegin(GL_POLYGON); glVertex2f(-.6,1.); glVertex2f(-.6,.6); glVertex2f(-.2,.6); glVertex2f(-.2,-.6); glVertex2f(-.6,-.6); glVertex2f(-.6,-1.); glVertex2f(.6,-1.); glVertex2f(.6,-.6); glVertex2f(.2,-.6); glVertex2f(.2,.6); glVertex2f(.6,.6); glVertex2f(.6,1.); glEnd(); (-1,-1) (1,-1)
2D Quads (1,1) (-1,1) glBegin(GL_QUADS); glVertex2f(-.6,1.); glVertex2f(-.6,.6); glVertex2f(-.2,.6); glVertex2f(-.2,-.6); glVertex2f(-.6,-.6); glVertex2f(-.6,-1.); glVertex2f(.6,-1.); glVertex2f(.6,-.6); glVertex2f(.2,-.6); glVertex2f(.2,.6); glVertex2f(.6,.6); glVertex2f(.6,1.); glEnd(); (-1,-1) (1,-1)
2D Quads glBegin(GL_QUADS); glVertex2f(-.6,1.); glVertex2f(-.6,.6); glVertex2f(-.6,-.6); glVertex2f(-.6,-1.); glVertex2f(.6,-1.); glVertex2f(.6,-.6); glEnd(); glVertex2f(-.2,.6); glVertex2f(-.2,-.6); glVertex2f(.2,-.6); glVertex2f(.2,.6); glVertex2f(.6,.6); glVertex2f(.6,1.);
2D Quads Lines should never pass through a vertex. (1,1) (-1,1) (-1,1) glBegin(GL_QUADS); glVertex2f(-.6,1.); glVertex2f(-.6,.6); glVertex2f(.6,.6); glVertex2f(.6,1.); glVertex2f(-.6,-.6); glVertex2f(-.6,-1.); glVertex2f(.6,-1.); glVertex2f(.6,-.6); glVertex2f(-.2,.6); glVertex2f(-.2,-.6); glVertex2f(.2,-.6); glVertex2f(.2,.6); glEnd(); (-1,-1) (1,-1)
2D Triangles (1,1) (-1,1) glBegin(GL_TRIANGLES); glVertex2f(-.6,1.); glVertex2f(-.6,.6); glVertex2f(-.2,.6); glVertex2f(-.2,-.6); glVertex2f(-.6,-.6); glVertex2f(-.6,-1.); glVertex2f(.6,-1.); glVertex2f(.6,-.6); glVertex2f(.2,-.6); glVertex2f(.2,.6); glVertex2f(.6,.6); glVertex2f(.6,1.); glEnd(); (-1,-1) (1,-1)
2D Triangles Lines should never pass through a vertex. (1,1) (-1,1) glBegin(GL_TRIANGLES); glVertex2f(-.6,1.); glVertex2f(-.6,.6); glVertex2f(-.2,.6); glVertex2f(-.6,1.); glVertex2f(-.2,.6); glVertex2f(.6,1.); glVertex2f(-.2,.6); glVertex2f(.2,.6); glVertex2f(.6,1.); glVertex2f(.2,.6); glVertex2f(.6,.6); glVertex2f(.6,1.); … glEnd(); (-1,-1) (1,-1)
2D Triangle Strip (1,1) (-1,1) glBegin(GL_TRIANGLE_STRIP); glVertex2f(-.6,1.); glVertex2f(-.6,.6); glVertex2f(-.2,.6); glVertex2f(-.2,-.6); glVertex2f(-.6,-.6); glVertex2f(-.6,-1.); glVertex2f(.6,-1.); glVertex2f(.6,-.6); glVertex2f(.2,-.6); glVertex2f(.2,.6); glVertex2f(.6,.6); glVertex2f(.6,1.); glEnd(); (-1,-1) (1,-1)
2D Triangle Strip (1,1) (-1,1) glBegin(GL_TRIANGLE_STRIP); glVertex2f(-.6,1.); glVertex2f(.6,1.); glVertex2f(-.2,.6); glVertex2f(.2,.6); glVertex2f(-.2,-.6); glVertex2f(.2,-.6); glVertex2f(.6,-1.); glVertex2f(.6,-.6); glEnd(); … First two vertices prime the pump,then every new vertex creates a triangleconnecting it to the previous two vertices (-1,-1) (1,-1)
2D Triangle Fan (1,1) (-1,1) glBegin(GL_TRIANGLE_FAN); glVertex2f(-.2,.6); glVertex2f(-.6,.6); glVertex2f(-.6,1.); glVertex2f(.6,1.); glVertex2f(.2,.6); glVertex2f(.2,-.6); glVertex2f(-.2,-.6); glEnd(); … First two vertices prime the pump,then every new vertex creates a triangleconnecting it to the previous vertex andthe first vertex (-1,-1) (1,-1)
Assigning Color glColor3f(0,0,1); glBegin(GL_POLYGON); glVertex2f(-1,1); glVertex2f(-1,-1); glVertex2f(1,-1); glEnd(); glBegin(GL_POLYGON); glColor3f(0,1,0); glVertex2f(-1,1); glColor3f(0,0,1); glVertex2f(-1,-1); glColor3f(1,0,0); glVertex2f(1,-1); glEnd(); glColor3f(1,0,0); glBegin(GL_POLYGON); glVertex2f(-1,1); glVertex2f(-1,-1); glVertex2f(1,-1); glEnd(); glColor3f(0,0,0); glBegin(GL_LINE_LOOP); glVertex2f(-1,1); glVertex2f(-1,-1); glVertex2f(1,-1); glEnd();
Task 6:Cube vertices • Paying with 3D coordinates: • Draw 8 vertices of a cube • Center point (0,0,0) • Cube size = 2
Task 7:Cube edges • Make some changes in Task 6 such that: • Draw cube edges • Each edge is drawn as separate line
Task 7:Cube edges – v2 • Make some changes in Task 7 such that: • Draws a connected group of line segments from the first vertex to the last, then back to the first.
Task 8: Cube Size Parameterization • Write function to • Draw a cube with sizeа • In loop make a cube size to change randomly in predefined ranges
Task 9:Concentric Cubes • Draw Concentric Cubes • Use a loop to draw 10 cubes with the same center point and different sizes
Task 10:Cube Center Parameterization • Add new parameter to the function for drawing a cube • Coordinates of the center point • Test this function by drawing 3 cubes next to each other
Task 10:Cube Center Parameterization - v2 • Draw • Big size cube and next to each of its sides 10 smaller cubes with decreasing sizes