版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2017-1-24 21:35
|
显示全部楼层
/* sphere.c. I$ E8 n! u+ Q+ i& {! y
此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。$ T& a" F- Q3 m! _( f6 |! _( P4 @* D9 `
*/
: f/ K9 P, a9 c% _; t+ R9 N: o! L7 }0 v/* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/
: R R- s/ H2 {; h; @#include<GL/glut.h>. a$ w0 }* U3 @3 H
#include<stdlib.h> G3 n$ I5 @5 U- g( }1 x
% Z+ M/ [0 H6 c0 m2 i/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */
m2 v1 ^6 M A3 W& @$ @3 yvoid init(void)
- r) A! ?) Y$ Y3 Y0 P5 H{3 }! n) J f6 `( i- b1 W6 s
GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0}; v2 F2 s8 z, f0 b2 r) L
GLfloat mat_shininess[] = {50.0};
' a; F9 y% u' a5 B, k' ? GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
3 ^) u( ~3 m3 k7 L) p8 k
5 Q; M" f# c# h4 J glClearColor(0.0, 0.0, 0.0, 0.0);8 E2 z% P5 h! U b
glShadeModel(GL_SMOOTH);! l, c; c2 u- W q
. I s" O$ [8 o# U" V! U glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);% K8 ~1 }7 H. ? r& N
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);( L( Q, b" H! c- ?) V
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
9 Z2 g, q! }& H9 O6 E: p: z* H8 s9 K6 E+ a* z" H
glEnable(GL_LIGHTING);; k! X' d. I m+ Y- ~1 c
glEnable(GL_LIGHT0);+ V8 Y% ?2 ?' p9 L+ }- f* ~' }
glEnable(GL_DEPTH_TEST);8 D8 n4 |$ N- Z% m$ B: l) g, W
}
, H' W. {# X( \! N% ]- B1 | r: @/ I9 Z" S% D
/*调用GLUT函数,绘制一个球*/( v* M" O3 M4 u5 A" V2 s5 {, t
void display ( void )
. e: ?/ o( N2 X- N9 S& z{4 c9 c d4 c% g- x: J, V0 k
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);2 N; ~# l+ L$ x( J' z/ Z4 A% m
glutSolidSphere(1.0, 40, 50);
+ e: F# z2 h4 O+ X! |) ~- ~7 I, U glFlush();8 P' f) L X5 b
}
7 X* I1 g, [( |0 S# @7 t# y8 r! c2 z& F2 k" ^: _ T s
) m& N7 m' l: J/ }: S
/* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/
- S2 K, J9 B* a( `+ h0 E& n: nvoid reshape(int w, int h)+ [$ t5 F X1 ^8 {! x
{ / r. O- b, E/ o, M- L
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
7 \" U6 Z. ]' |1 {6 ~! B \8 b; M glMatrixMode(GL_PROJECTION); h, u9 `- j# R9 H
glLoadIdentity();
6 L4 G! s4 o$ V, v7 k+ y' r if (w <= h)
* ]3 ^+ P0 V) ]: e2 W glOrtho(-1.5, 1.5, -1.5 * ( GLfloat )h/( GLfloat )w, 1.5 * ( GLfloat )h / ( GLfloat )w, -10.0, 10.0);
- z5 W; y3 r* X# @3 g7 r7 [ else' W# {8 v6 n" P5 e' w; f, o- W% j
glOrtho(-1.5 * ( GLfloat )w / ( GLfloat )h, 1.5 * ( GLfloat )w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);
4 S5 v: D A* S( K) x, X( O# E/ v8 @ glMatrixMode(GL_MODELVIEW);
) T' q. V7 |4 i! c glLoadIdentity();
# C$ s$ u, V; K. B8 _$ ]}
: }% }+ {. Y" [$ r9 |" R( v
% ]! f: F* D3 j o* Z/* 定义对键盘的响应函数 */# K9 I2 P o% ~% f6 Y6 |
void keyboard(unsigned char key, int x, int y)2 p1 S; ]9 f v2 I( n
{' a w: N8 Q: w2 v9 o+ ]' X
/*按Esc键退出*/
9 {7 X3 L' X6 v* B% i0 t0 s switch(key)
9 n4 F% \# I0 O( D {6 l; G- f$ \1 D/ h% {( f
case 27:
6 X u3 {6 m d( ^2 A exit(0);5 [8 o$ N o) l" D. v
break;
6 V& ~0 R0 k/ P% q* N' m9 ` } f: Y$ C# ~" |
}/ l: M' q0 m! j5 I
* ~- j4 Q! ~3 t6 ?4 I0 Z& ]/ W' W) g" l! h* L2 l& k/ r
int main(int argc, char** argv) w+ J" t, l2 M8 m/ n# }
{6 D9 X% X: m1 c
/* GLUT环境初始化*/7 E# H; L4 G% x' {! |3 ~/ v W- P; `
glutInit(&argc, argv);6 t8 c2 c: U* V4 Y/ D
/* 显示模式初始化 */- L( |1 `/ k0 l3 `7 s% o7 `- @; A4 P
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
F( D% `4 K% H$ G" V. [8 [7 R /* 定义窗口大小 */
! q$ \% p g* {& d, T' V! E glutInitWindowSize(300, 300);
4 b- ]9 |3 W% `. r" W I" v- N /* 定义窗口位置 */
1 L1 N" \7 j8 a; y* {# M glutInitWindowPosition(100, 100);4 K. k, z; M9 X S
/* 显示窗口,窗口标题为执行函数名 */
1 {+ E2 ?& a1 S& d! z glutCreateWindow(argv[0]);
% H3 `+ d _& x6 c /* 调用OpenGL初始化函数 */
4 t6 W; g( p P- D2 A6 ] init();& q% }- H0 _' \* Q1 K
/* 注册OpenGL绘图函数 */
) V$ A( `# R1 O7 k6 c) m8 ` glutDisplayFunc(display);
- c4 Z% a& R& X: W7 B# W /* 注册窗口大小改变时的响应函数 */1 u1 X6 L* H) F: u
glutReshapeFunc(reshape);3 b0 C6 U# \, C- m2 z \
/* 注册键盘响应函数 */) B5 V' B- S% U! H9 ?
glutKeyboardFunc(keyboard);& M) a; f* ?8 Y4 o3 Y
/* 进入GLUT消息循环,开始执行程序 */
/ Y- k" E* q: I1 G+ ?9 ?+ O" f glutMainLoop();
4 g/ g; [" H$ s4 r- `. Q/ `7 W" O1 ` return 0;6 s, o- @; k3 Q! {* b7 U" o) L, Y3 r! ?
}1 m+ S- h' h! S& [ O: p& a! I& Q
, u. K4 l$ I) x4 }$ j! M% G9 m5 a 88,0-1 底端9 y- M, d! f- T4 D+ u; K, c
1 V6 c- O2 h: A! v' y+ q" p0 h0 S- W
编译
0 R; T- S, W3 O7 t, x/ b# Q) jg++ sphere.c -o sphere -lglut -lGL/ l8 ~, [2 M) T- Z) z. o# i5 j
5 z6 T8 S8 ]4 R$ ?
" s' ?3 x, H0 u. J+ U {. z. W2 h2 Z' m
|
|