Program Structure. simple.c revisited. Programming with OpenGL Part 2: Complete Programs. Objectives. Refine the first program

Programming with OpenGL Part 2: Complete Programs Program Structure • Most OpenGL programs have a similar structure that consists of the following fu...
Author: Alexina Warren
0 downloads 0 Views 100KB Size
Programming with OpenGL Part 2: Complete Programs

Program Structure • Most OpenGL programs have a similar structure that consists of the following functions

Objectives • Refine the first program

-main(): • defines the callback functions • opens one or more windows with the required properties • enters event loop (last executable statement)

- Alter the default values - Introduce a standard program structure

-init(): sets the state variables

• Simple viewing

• Viewing • Attributes

- Two-dimensional viewing as a special case of three-dimensional viewing

- callbacks • Display function • Input and window functions

• Fundamental OpenGL primitives • Attributes Angel: Interactive Computer Graphics 4E © Addison-Wesley 2005

1

2

Angel: Interactive Computer Graphics 4E © Addison-Wesley 2005

simple.c revisited

main.c includes gl.h

#include

• In this version, we shall see the same output but we have defined all the relevant state values through function calls using the default values • In particular, we set

int main(int argc, char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(500,500); glutInitWindowPosition(0,0); glutCreateWindow("simple"); define window properties glutDisplayFunc(mydisplay);

- Colors - Viewing conditions - Window properties

init();

display callback set OpenGL state

glutMainLoop(); } Angel: Interactive Computer Graphics 4E © Addison-Wesley 2005

3

enter event loop

Angel: Interactive Computer Graphics 4E © Addison-Wesley 2005

4

1

GLUT functions

init.c

•glutInit allows application to get command line arguments and initializes system •gluInitDisplayMode requests properties for the window (the rendering context)

black clear color void init() opaque window { glClearColor (0.0, 0.0, 0.0, 1.0);

- RGB color - Single buffering - Properties logically ORed together

glColor3f(1.0, 1.0, 1.0);

glMatrixMode (GL_PROJECTION); glLoadIdentity (); glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);

•glutWindowSize in pixels •glutWindowPosition from top-left corner of display •glutCreateWindow create window with title “simple” •glutDisplayFunc display callback •glutMainLoop enter infinite event loop Angel: Interactive Computer Graphics 4E © Addison-Wesley 2005

fill/draw with white

}

viewing volume 5

Angel: Interactive Computer Graphics 4E © Addison-Wesley 2005

Coordinate Systems

OpenGL Camera

• The units in glVertex are determined by the application and are called object or problem coordinates • The viewing specifications are also in object coordinates and it is the size of the viewing volume that determines what will appear in the image • Internally, OpenGL will convert to camera (eye) coordinates and later to screen coordinates • OpenGL also uses some internal representations that usually are not visible to the application

• OpenGL places a camera at the origin in object space pointing in the negative z direction • The default viewing volume is a box centered at the origin with a side of length 2

Angel: Interactive Computer Graphics 4E © Addison-Wesley 2005

7

Angel: Interactive Computer Graphics 4E © Addison-Wesley 2005

6

8

2

Orthographic Viewing

Transformations and Viewing • In OpenGL, projection is carried out by a projection matrix (transformation) • There is only one set of transformation functions so we must set the matrix mode first

In the default orthographic view, points are projected forward along the z axis onto the plane z=0

glMatrixMode (GL_PROJECTION) z=0

• Transformation functions are incremental so we start with an identity matrix and alter it with a projection matrix that gives the view volume

z=0

glLoadIdentity(); glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);

Angel: Interactive Computer Graphics 4E © Addison-Wesley 2005

9

Two- and threedimensional viewing

10

mydisplay.c

• In glOrtho(left, right, bottom, top, near, far) the near and far distances are measured from the camera • Two-dimensional vertex commands place all vertices in the plane z=0 • If the application is in two dimensions, we can use the function gluOrtho2D(left, right,bottom,top) • In two dimensions, the view or clipping volume becomes a clipping window Angel: Interactive Computer Graphics 4E © Addison-Wesley 2005

Angel: Interactive Computer Graphics 4E © Addison-Wesley 2005

11

clear window to clear color void mydisplay() { Draw polygon glClear(GL_COLOR_BUFFER_BIT); with current glBegin(GL_POLYGON); fill/draw glVertex2f(-0.5, -0.5); color glVertex2f(-0.5, 0.5); glVertex2f(0.5, 0.5); glVertex2f(0.5, -0.5); glEnd(); glFlush(); } Flush buffers – cause object to be drawn Angel: Interactive Computer Graphics 4E © Addison-Wesley 2005

12

3

OpenGL Primitives

Polygon Issues • OpenGL will only display polygons correctly that are

GL_POINTS

GL_POLYGON GL_LINES

0

GL_LINE_STRIP GL_LINE_LOOP

1 0 1 222 4

3

GL_TRIANGLES

1

2 4

2

3 5

3

0

GL_TRIANGLE_STRIP New point gives new triangle

1

0

GL_TRIANGLE_FAN First point in all triangles

Angel: Interactive Computer Graphics 4E © Addison-Wesley 2005

GL_QUAD_STRIP Each pair of points adds a quad

- 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

nonsimple polygon 13

Angel: Interactive Computer Graphics 4E © Addison-Wesley 2005

nonconvex polygon 14

Attributes

RGB color

• Attributes are part of the OpenGL state and determine the appearance of objects

• Each color component is stored separately in the frame buffer • Usually 8 bits per component in buffer (256 values) • Note in glColor3f the color values range from 0.0 (none) to 1.0 (all), whereas in glColor3ub the values range from 0 to 255

- Color (points, lines, polygons) - Size and width (points, lines) - Stipple pattern (lines, polygons) - Polygon mode • Display as filled: solid color or stipple pattern (default) • Display edges • Display vertices • Only one set - cannot fill and display edges Angel: Interactive Computer Graphics 4E © Addison-Wesley 2005

15

Angel: Interactive Computer Graphics 4E © Addison-Wesley 2005

16

4

Indexed Color

Color and State

• Colors are indices into tables of RGB values • Requires less memory - indices usually 8 bits - not as important now • Memory inexpensive • Need more colors for shading

Angel: Interactive Computer Graphics 4E © Addison-Wesley 2005

17

Smooth Color

• The color as set by glColor becomes part of the state and will be used until changed - Colors and other attributes are not part of the object but are assigned when the object is rendered • We can create conceptual vertex colors by code such as glColor glVertex glColor glVertex Angel: Interactive Computer Graphics 4E © Addison-Wesley 2005

18

Viewports

• Default is smooth shading - OpenGL interpolates vertex colors across visible polygons • Alternative is flat shading - Color of first vertex determines fill color

• Do not have to use the entire window for the image: glViewport(x,y,w,h) • Values in pixels (screen coordinates)

•glShadeModel (GL_SMOOTH) or GL_FLAT Angel: Interactive Computer Graphics 4E © Addison-Wesley 2005

19

Angel: Interactive Computer Graphics 4E © Addison-Wesley 2005

20

5