Professional Documents
Culture Documents
OPENGL
OPENGL
:
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
Joystic . SDL_opengl.h
OpenGL . SDL
.
www.libsdl.org .
GLUT
OpenGL . (GLU (OpenGL Utility Library
OpenGL . GLU OpenGL
www.ParsBook.org
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 .
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();
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
) ( . :
;)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
#define edgeOnly 0
5
6
www.ParsBook.org
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 }
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();
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
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
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
:
:
;)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
)(Torus
) ( . :
void glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint nsides, GLint
;)rings
www.ParsBook.org
:
) ( :
;)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
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
22
23
24
25
26
27
28
;)(glutSwapBuffers
29
} 30
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 .
. :
www.ParsBook.org