You are on page 1of 30

OpenGL C++

:
http://www.itnotes.info :

OpenGL
Open Graphic Library .
OpenGL . OpenGL
.
. )
( .
: . API
OpenGL . .

OpenGL
OpenGL . OpenGL
.
OpenGL 1990 Silicon Grapihcs . ARB (OpenGL
(Architecture Review Board . 3DLabs SGI ATI Intel
IBM Sun NVIDIA Dell ) ( DirectX 2003
. OpenGL SGI 1992 . 3DLabs .
) ( OpenGL 3.1
.

OpenGL
OpenGL :
-1

-2

www.ParsBook.org

OpenGL
OpenGL . .
) ( ...
.
. OpenGL . .
-1 : -2
OpenGL OpenGL
. ) .
(
GLUT SDL GLUT .
WGL CGL Mac OS X GLX .
Windowing
.
.

SDL
SDL ) (Simple DirectMedia Layer .
:
-1

: SDL_image

-2

: SDL_mixer

-3

: SDL_net

-4

SDL_ttf : SDL_rtf rtf

Joystic . SDL_opengl.h
OpenGL . SDL
.
www.libsdl.org .

GLUT
OpenGL . (GLU (OpenGL Utility Library
OpenGL . GLU OpenGL

www.ParsBook.org

OpenGL : texture OpenGL


. OpenGL GLU . GLUT )
(OpenGL Utility Toolkit GLU . .
... . OpenGL GLU GLUT
.

OpenGL
. GLUT
.
XP Visual Studio 2005 .
Visual Console . ++Borland C GCC .
OpenGL ++C
OpenGL
.

GLUT
)!( OpenGL ) . system32
opengl32.dll ( . GLU ) system32
glu32.dll ( GLUT . :
http://www.xmission.com/~nate/glut.html
Extract :
glut32.dll glut32.dll glut.h
:
-1

glut32.dll system32 .

-2

glut32.lib ) C (
\C:\Program Files\Visual Studio 8\VC\PlatformSDK\Lib

-3

glut32.h :
\C:\Program Files\Visual Studio 8\VC\PlatformSDK\Include\gl

-4

restart .

GLUT . .

www.ParsBook.org

Visual Studio 2005 File > New > Project Project Types
++Visual C Win32 Visual Studio Installed Templates Win32 Console
Application Name ) (FirstOpenGL OK .

Next . Empty Project Additional options


Finish .
Solution Explorer Source Files Add New item
.

Name ) (Simple (C++ File(.cpp . Add


. OpenGL GLUT .
Project Visual Studio FirstOpenGL Properties +
Configuration Properties . Linker Input Linker
Additional Dependencies :
opengl32.lib glu32.lib glut32.lib
) lib ( . OK .

www.ParsBook.org

code . GLUT
: Source Files
#include <GL/glut.h>
int Height=400, Width=400;
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glutSwapBuffers();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE);
glutInitWindowSize(Width, Height);
glutCreateWindow("Hello OpenGL World");

glutDisplayFunc(display);
glutMainLoop();

( ) ! F7 ) Build FirstOpenGL Build


. Start without debugging Debug (
: ( Hello OpenGL World )

www.ParsBook.org

OpenGL ) .
( .

OpenGL
OpenGL . 2
3 . 2 .
3 GLUT . glut
) ( OpenGL display
main glutDisplayFunc GLUT .

OpenGL
OpenGL -1 +1 . .
OpenGL . x y
-1 +1 ) ( ) . ( 0.7
x y z .
:

www.ParsBook.org


OpenGL . OpenGL
. OpenGL glVertex ) . OpenGL gl
. glut glut ( . . ) (
-1

-2

)()glVertex{234}(dfis

)(glVertex{234}(dfis)v
) v vector (
} {234 )( 3 2 4 . glVertex2 x
y glVertex3 . x y z glVertex4 .
.
) (dfis . :
d -> double

f -> float

i -> integer

s -> short

. 2
. :

www.ParsBook.org

;)glVertex2i(2, 4
4 ,2 .
;}GLfloat v[3] = {2.0, -9.0, +4.0
;)glVertex3fv(v
GLfloat ) . -1
+1 (


OpenGL .
. glColor :
) (glColor{34}(bdfisubusui)v
glVertex 3 4 . 3 ) RGB ( .
) ( Alpha . :
)b (byte

)d (double

)f (float

)i (integer

)s (short

)ub (unsigned byte

)us (unsigned short

)ui (unsigned integer

) ( . :
;)glColor4f(1.0, 0.5, 1.0, 0.2
0.2 .
;} GLint c[3] = { 255, 0, 0
;)glColor3i(c
) (

www.ParsBook.org

OpenGL
OpenGL ()glBegin ()glEnd .
()glBeign
OpenGL )
( ()glEnd ) . (

2 : OpenGL
OpenGL : 4 )
( :

.
diplay .
): (GL_POINTS
. ) (0.5- ,0.2 display
) display ( :
;)glColor3f(1.0, 0.0, 1.0
;)glBegin(GL_POINTS
;)glVertex2f(0.2, -0.5
;)(glEnd
.
glPointSize ) 64 ( .
glBegin :

www.ParsBook.org

;)glPointSize(20.0
. .
GL_POINT_SMOOTH .
glEnable OpenGL ) ( display
:
;)glClear(GL_COLOR_BUFFER_BIT
;)glColor3f(1.0, 0.0, 1.0
;)glEnable(GL_POINT_SMOOTH
;)glPointSize(20.0
;)glBegin(GL_POINTS
;)glVertex2f(0.2, -0.5
;)(glEnd
;)(glutSwapBuffers

.
.
: glBegin glEnd . :
;)glBegin(GL_POINTS
;)glVertex2f(0.2, -0.5
;)(glEnd
;)glBegin(GL_POINTS
;)glVertex2f(0.8, 0.7
;)(glEnd

. ) (
. :
;)glBegin(GL_POINTS
;)glVertex2f(0.2, -0.5
;)glVertex2f(0.8, 0.7
;)(glEnd

www.ParsBook.org

): (GL_LINES
:

)(GL_LINES

)(GL_LINE_STRIP

)(GL_LINE_LOOP

:
:
) ( OpenGL GL_LINES glBegin
.
. :
;)glBegin(GL_LINES
;)glVertex2f(-0.2, -0.5
;)glVertex2f(0.3, 0.8
;)glVertex2f(-0.8, -0.8
;)glVertex2f(0.8, -0.8
;)(glEnd

:

. .
:
;)glBegin(GL_LINE_STRIP
;)glVertex2f(-0.2, -0.5
;)glVertex2f(0.3, 0.8

www.ParsBook.org

;)glVertex2f(0.4, 0.1
;)glVertex2f(-0.8, 0.0
;)(glEnd

:
:
glBegin GL_LINE_LOOP . :
;)glBegin(GL_LINE_LOOP
;)glVertex2f(-0.2, -0.5
;)glVertex2f(0.3, 0.8
;)glVertex2f(0.4, 0.1
;)glVertex2f(-0.8, 0.0
;)(glEnd

:
()glLineWidth .
) glBegin ( :

www.ParsBook.org

;)glLineWidth(7.0

:
OpenGL .
OpenGL ) (.
:

:
. 9 .
) ( .
. :
;)glBegin(GL_TRIANGLES
;)glVertex2f(-0.8, -0.8
;)glVertex2f(-0.6, -0.4
;)glVertex2f(-0.3, -0.8
;)glVertex2f(0.8, 0.8
;)glVertex2f(0.6, 0.4
;)glVertex2f(0.3, 0.8
;)glVertex2f(-0.4, 0.0
;)glVertex2f(0.0, 0.5

www.ParsBook.org

;)glVertex2f(0.4, 0.0
;)(glEnd

:
.
.
glBegin GL_TRIANGLE_STRIP . :
: glPolygonMode )
( .
;)glPolygonMode(GL_FRONT_AND_BACK, GL_LINE
;)glBegin(GL_TRIANGLE_STRIP
;)glVertex2f(-0.4, -0.5
;)glVertex2f(-0.4, -0.1
;)glVertex2f(0.0, -0.5
;)glVertex2f(0.0, -0.1
;)glVertex2f(0.4, -0.5
;)(glEnd

www.ParsBook.org

:
) .
( 7 9 :
;)glPolygonMode(GL_FRONT_AND_BACK, GL_LINE
;)glBegin(GL_TRIANGLE_FAN
;)glVertex2f(-0.0, 0.0
;)glVertex2f(-0.7, 0.0
;)glVertex2f(-0.7, 0.7
;)glVertex2f(0.0, 0.7
;)glVertex2f(0.7, 0.7
;)glVertex2f(0.7, 0.0
;)glVertex2f(0.7, -0.7
;)glVertex2f(0.0, -0.7
;)glVertex2f(-0.7, -0.7
;)(glEnd

): (GL_POLYGON
.
.
. 4 .
glPolygonMode .
3 . :
;)void glPolygonMode(GLenum face, GLenum mode
face GL_FRONT GL_BACK GL_FRONT_AND_BACK .
mode .
. .
mode GL_POINT GL_LINE GL_FILL ) GL_FILL

www.ParsBook.org

( GL_POINT GL_LINE .
GL_FILL .
.
.
8 ) ( :
;)glPolygonMode(GL_FRONT_AND_BACK, GL_LINE
;)glBegin(GL_POLYGON
;)glVertex2f(-0.7, -0.4
;)glVertex2f(-0.7, 0.4
;)glVertex2f(-0.4, 0.7
;)glVertex2f(0.4, 0.7
;)glVertex2f(0.7, 0.4
;)glVertex2f(0.7, -0.4
;)glVertex2f(0.4, -0.7
;)glVertex2f(-0.4, -0.7
;)(glEnd

:
.
:

)(GL_QUADS

)(GL_QUAD_STRIP

. OpenGL
.

www.ParsBook.org

:
;)glPolygonMode(GL_FRONT_AND_BACK, GL_FILL
;)glBegin(GL_QUADS
;)glVertex2f(-0.8, 0
;)glVertex2f(-0.4, 0.4
;)glVertex2f(0.0, 0.0
;)glVertex2f(-0.4, -0.4
;)0.5
;)0.5
;)0.0
;)0.0

glVertex2f(0.9,
glVertex2f(0.2,
glVertex2f(0.1,
glVertex2f(0.8,
;)(glEnd

2
. .
GL_QUAD_STRIP glBegin . . 2
:
;)glPolygonMode(GL_FRONT_AND_BACK, GL_LINE
;)glBegin(GL_QUAD_STRIP
;)glVertex2f(-0.8, 0.4
;)glVertex2f(-0.8, -0.4
;)glVertex2f(0.0, 0.4
;)glVertex2f(0.0, -0.4
;)glVertex2f(0.2, 0.4
;)glVertex2f(0.2, -0.4
;)glVertex2f(0.5, 0.4
;)glVertex2f(0.5, -0.4
;)(glEnd

www.ParsBook.org

OpenGL .
! ) ( !
. ) ( . )
(
. ) ( .
.
---------------------------------------------------------------------------------------------------- : 9/0 4/0
.
OpenGL . )!(
. :
)( )( .
. 2r :
-1 :

-2

) (
. :
>#include <GL/glut.h
>#include <math.h

1
2

;int Height=400, Width=400

#define edgeOnly 0

)void DrawCircle(double radius, int numberOfSides


{

5
6

www.ParsBook.org

7
8
9
10
11

// if edge only, use line strips; otherwise , use polygons


if(edgeOnly)
glBegin(GL_LINE_STRIP);
else
glBegin(GL_POLYGON);

12
13
14

// calculate each vertex on the circle


for ( int vertex = 0; vertex < numberOfSides; vertex++ )
{

15
16
17

// calculate the angle of current vertex


// ( vertex # * 2 * PI ) / # of sides
float angle_c = (float) vertex * 2.0 * 3.14159 / numberOfSides;

18

glColor3f(0,0,1); // Blue Color

19
20
21 }

// draw the current vertex at the correct radius


glVertex2f(cosf(angle_c)*radius, sinf(angle_c)*radius);

22
23
24

// if drawing edge only, then need to complete the loop with first vertex
if(edgeOnly)
glVertex2f(radius, 0.0);

25

glEnd();

26 }
27 void display(void)
28 {
29
glClear(GL_COLOR_BUFFER_BIT);
30

DrawCircle(0.8, 100);

31
32
33
34
35
36
37

glColor3f(1, 1, 0);
glBegin(GL_QUADS);
glVertex2f(-0.2, 0.2);
glVertex2f(-0.2, -0.2);
glVertex2f(0.2, -0.2);
glVertex2f(0.2, 0.2);
glEnd();

38
39 }

glutSwapBuffers();

40 int main(int argc, char **argv)


41 {
42
glutInit(&argc, argv);
43
glutInitDisplayMode(GLUT_DOUBLE);
44
glutInitWindowSize(Width, Height);
45
glutCreateWindow("Circle Example");
46
47
48
49 }

glutDisplayFunc(display);
glutMainLoop();

www.ParsBook.org

:
. DrawCircle
display . 2 math . 3
OpenGL . 4 edgeOnly
. .
5 DrawCircle radius numberOfSides
. 7 11
edgeOnly GL_POLYGON . GL_LINE_STRIP 13
vertex ) ( . 17
20 ) ( ) (
glVertex2f . 18 .
23 .
diplay DrawCircle 8/0 100 4/0 )
( 31 . glut .

:
OpenGL .
.
:
) (
glPointSize .
OpenGL . display ) ( ) : ( cpp.03

www.ParsBook.org

;)glClear(GL_COLOR_BUFFER_BIT
;float Size = 1.0
)for(float pos=-0.9; pos < 0.9 ; pos+=0.2
{
;)glPointSize(Size
;)glBegin(GL_POINTS
;)glVertex2f(pos, 0.0
;)(glEnd
;Size += 2.0
}
;)(glutSwapBuffers


.
. .
:

16 .
GLushort ) ( . :
;)void glLineStipple(GLint factor, GLushort pattern

www.ParsBook.org

pattern 16 factor integer 1 .


factor 5 1 5 .
GL_LINE_STIPPLE glEnable . 5 :
;)glClear(GL_COLOR_BUFFER_BIT
;)glEnable(GL_LINE_STIPPLE
;GLushort stPattern = 0xFAFA
;)glLineStipple(5, stPattern
;)glLineWidth(5.0
;)glBegin(GL_LINES
;)glVertex2f(-0.2, -0.5
;)glVertex2f(0.3, 0.8
;)glVertex2f(-0.8, -0.8
;)glVertex2f(0.8, -0.8
;)(glEnd
;)(glutSwapBuffers

OpenGL
glEnable .
OpenGL .
OpenGL
:
;)void glGetBooleanv(GLenum pname, GLboolean *params
;)void glGetDoublev(GLenum pname, GLdouble *params
;)void glGetFloatv(GLenum pname, GLfloat *params

www.ParsBook.org

;)void glGetIntegerv(GLenum pname, GLint *params


params C
) OpenGL C ( pname OpenGL params
pname . .
OpenGL :
;GLfolat nowSize
;)glGetFloatv(GL_POINT_SIZE, &nowSize
: . .
glPointSize .


glEnable . glEnable
glDisable . .
glIsEnabled . GL_TRUE GL_FALSE .
) smooth ( :
) if( glIsEnabled(GL_LINE_SMOOTH) == GL_FALSE
;)glEnable(GL_LINE_SMOOTH
OpenGL
()glGetError OpenGL . GLenum
. OpenGL :

: GL_NO_ERROR . )!(

: GL_INVALID_ENUM OpenGL .
) ( .

: GL_INVALID_VALUE .

: GL_INVALID_OPERATION
) (

: GL_STACK_OVERFLOW )
OpenGL (

www.ParsBook.org

: GL_STACK_UNDERFLOW .

: GL_OUT_OF_MEMORY OpenGL
.

-3 OpenGL
) (glVertex2 .
. . -3 GLUT
. -3 OpenGL .

-3 OpenGL
-3 OpenGL -3 . .

) OpenGL ( .
z ) . ) (2,4,7
) (7-,2,4 ( .

-3
z x y
:

www.ParsBook.org

) (}glVertex3{dfis
-2 )
( .

GLUT
: (glRotatef(40,1,0,1 .
) . 40 (
:
OpenGL :
;)void glutSolidSphere(GLdouble radius, GLint slices, GLint stacks
;)void glutWireSphere(GLdouble radius, GLint slices, GLint stacks

radius slices z stacks z.


) (radius=0.9, slices=50, stacks=40

:
:
;)void glutSolidCube(GLdouble size
;)void glutWireCube(GLdouble size

size .

www.ParsBook.org

9/0 .

:
:
;)void glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks
;)void glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks

base height slices z stacks z .

) (base=0.4, height=1.0, slices=50, stacks=40 :

)(Torus
) ( . :
void glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint nsides, GLint
;)rings

www.ParsBook.org

void glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint nsides, GLint


;)rings

innerRadius outerRadius nsides rings


.
) (innerRadius=0.3, outerRadius=0.8, nsides=50, rings=40 :

:
) ( :
;)void glutSolidTeapot(GLdouble size
;)void glutWireTeapot(GLdouble size

size . 6/0 :

) (

www.ParsBook.org

) ( GLUT
: .
void glutSolidOctahedron(void);
void glutWireOctahedron(void);

void glutSolidTetrahedron(void);
void glutWireTetrahedron(void);

void glutSolidIcosahedron(void);
void glutWireIcosahedron(void);

www.ParsBook.org

:
-3 -2
) glut ( .
-4 ) (GL_QUADS ) (GL_LINES .
. .
): (cpp.04
>1 #include <GL/glut.h
;2 int Height=400, Width=400
;3 float Size=0.5
)4 void display(void
{ 5
6
;)glClear(GL_COLOR_BUFFER_BIT
7
;)glRotatef(50,1,0,1
;)glPolygonMode(GL_FRONT_AND_BACK, GL_LINE
;)glBegin(GL_QUADS
;)glVertex3f(0.0, 0.0, 0.0
;)glVertex3f(Size, 0.0, 0.0
;)glVertex3f(Size, Size, 0.0
;)glVertex3f(0.0, Size, 0.0

8
9
10
11
12
13

;)glVertex3f(0.0, 0.0, -Size


;)glVertex3f(Size, 0.0, -Size
;)glVertex3f(Size, Size, -Size
;)glVertex3f(0.0, Size, -Size
;)(glEnd

14
15
16
17
18

;)glBegin(GL_LINES
;)glVertex3f(0.0, Size, 0.0
;)glVertex3f(0.0, Size, -Size

19
20
21

www.ParsBook.org

;)glVertex3f(0.0, 0.0, 0.0


;)glVertex3f(0.0, 0.0, -Size

22
23

;)glVertex3f(Size, 0.0, 0.0


;)glVertex3f(Size, 0.0, -Size

24
25

;)glVertex3f(Size, Size, 0.0


;)glVertex3f(Size, Size, -Size
;)(glEnd

26
27
28

;)(glutSwapBuffers

29
} 30

)31 int main(int argc, char **argv


{ 32
33
;)glutInit(&argc, argv
34
;)glutInitDisplayMode(GLUT_DOUBLE
35
;)glutInitWindowSize(Width, Height
36
;)"glutCreateWindow("Manual Cube
;)glutDisplayFunc(display

37

;)(glutMainLoop

38
} 39

. 3 Size .
7 glRotate 50 x z )
( . . 8 glPolygonMode
) ( 10 13 z=0 Size
14 17 ) z=-Size z (
Size 19 28 .
. :

D Kevin Hawkings THOMSON


beginning OpenGL Game Programming : ave Astle:
COURSE THECNOLOGY

www.ParsBook.org

You might also like