版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2017-1-24 21:35
|
显示全部楼层
/* sphere.c
. o3 F9 w* F+ W0 m1 X- D 此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。
/ G/ ]2 Q1 d9 a3 k3 @) G/ a*/
$ u1 | B1 ?/ B* m! \* m/* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/4 V0 D3 v& A$ f- o8 J
#include<GL/glut.h>
6 ^8 Q; {( d0 |' T1 B: b+ G3 a#include<stdlib.h>
g* K$ L1 V1 q p! _. a: z1 ?8 Z8 l- r
/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */# S9 C; O! h/ C' d! p4 [6 ^
void init(void)
. O8 ?9 ]% S% w) t{
5 }* R3 H& D+ N, I GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
5 E$ o- A- z, W4 p$ U5 y2 B GLfloat mat_shininess[] = {50.0};
2 m; s1 c f: @2 R, d GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
$ y' c" I8 c! l( U8 q4 l/ d$ B: K, a; D9 M5 v
glClearColor(0.0, 0.0, 0.0, 0.0);
S$ {, O9 P; B; f0 u4 G# |1 w glShadeModel(GL_SMOOTH);% `* Q$ W+ M4 S
* T5 X f* Y- q% x' V7 H/ _ glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
" o" h2 J6 Y. A) V( N glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
, @: d& z+ r8 l, h2 M+ F2 j glLightfv(GL_LIGHT0, GL_POSITION, light_position);: f$ N. `# m" B4 s0 Z4 F9 ]; ?
, ?' {" p: }6 ?6 b/ J6 Q glEnable(GL_LIGHTING);
7 O6 N' [+ k7 w- e& ] glEnable(GL_LIGHT0);
6 G7 n/ \, E+ _0 Q glEnable(GL_DEPTH_TEST);* u3 E: J7 q- }* P {
}
) O7 T+ g( e- }9 u6 e- V( i. [" _- T6 f* ~; b
/*调用GLUT函数,绘制一个球*/! A0 t% d$ k8 f, f
void display ( void )
8 f8 V- z' d8 p, g+ e{ g2 S+ p1 d. r' H/ F
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);+ `0 V: u& N9 j2 W2 z: E- l7 g/ J4 z
glutSolidSphere(1.0, 40, 50);$ q5 z- V2 m/ l/ K( t1 ^/ w
glFlush();
! G$ |' f# j3 U( J# ]! m8 P( R}
# b( A2 ^% t& V4 u3 N+ y) D% n* Y% r. h% J; p
* V$ d, f+ a! E7 {3 u" E: v: o
/* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/3 A8 G" _* |2 b8 A# c
void reshape(int w, int h)
+ n9 ?. a$ z8 b/ ^# U8 H{ ' L$ v( `: Y" @9 H2 ~
glViewport(0, 0, (GLsizei) w, (GLsizei) h);. D, v3 ]1 s& i' g8 H0 ?6 `
glMatrixMode(GL_PROJECTION);
, q C, E# }9 z% J glLoadIdentity();
6 h, X3 G1 Z5 F0 |) S1 ?7 J1 X1 ? if (w <= h)
6 S- C3 \8 O ^3 n4 @ glOrtho(-1.5, 1.5, -1.5 * ( GLfloat )h/( GLfloat )w, 1.5 * ( GLfloat )h / ( GLfloat )w, -10.0, 10.0);4 x+ }0 f# z$ N9 L, `
else5 | S! B9 |0 s0 ^8 b( A
glOrtho(-1.5 * ( GLfloat )w / ( GLfloat )h, 1.5 * ( GLfloat )w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);# F3 H9 K7 M4 h1 Q
glMatrixMode(GL_MODELVIEW);
7 V: ^0 |! c+ \% I glLoadIdentity();
4 K0 s. @8 A; \/ @}
5 ~3 f) i- D1 b6 u; ]5 A
+ M7 G# i% Z5 u2 [0 I3 z% N' M/* 定义对键盘的响应函数 */
$ I% Q; U3 i7 _( Fvoid keyboard(unsigned char key, int x, int y)! O$ j7 g0 W# F, |. F: c: p
{+ h0 p4 l0 u: M2 V& Y( T
/*按Esc键退出*/
0 j+ G1 o- ~! u switch(key)$ [( P- q9 u5 X! w
{
+ I9 r0 k* N' X6 t+ i case 27:
m8 Y* ^7 ]0 p; M exit(0);
: X8 j4 f3 T& [! l$ j break;1 F O0 |3 A8 ~3 |4 G$ Q9 r
}+ T' M/ o5 u4 E* b0 O6 d. `
}
2 S8 s4 {, [ `) ?/ N& \. f5 Q0 B1 o+ H- N
/ ^* j4 B, w8 n: U4 \
int main(int argc, char** argv), Z! V3 x, `# s& V8 e, v
{2 b/ }. Q# \, K; {+ R. K( b% L
/* GLUT环境初始化*/( Q/ I5 B' d2 p+ m" z. o
glutInit(&argc, argv);
" m! r2 w; @: V- i /* 显示模式初始化 */0 R) y0 g8 s, [; u
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
- r; s( w. f4 n' p /* 定义窗口大小 */
" f# k' P8 j, a/ t glutInitWindowSize(300, 300);
1 N$ j: O* n( x! T /* 定义窗口位置 */3 K% j- ^; e& C# s
glutInitWindowPosition(100, 100);& v4 R {/ D j: }
/* 显示窗口,窗口标题为执行函数名 */" i3 Q) F1 P8 `& l
glutCreateWindow(argv[0]);1 S% C+ D8 H2 M: B' c
/* 调用OpenGL初始化函数 */
; Z' d. S/ S4 ~' U8 g0 Z8 I init();' d' X. o! Y8 [; Q4 K
/* 注册OpenGL绘图函数 */
$ T- h& K8 d; ^, G! o f% ~ glutDisplayFunc(display);
) N; Z0 Z# h$ r' B /* 注册窗口大小改变时的响应函数 */. G: E p g2 H$ R- B4 p3 ]
glutReshapeFunc(reshape);
( n: D% ?3 V0 L /* 注册键盘响应函数 */
0 T- J7 ?: K- L6 j E# b3 W5 O8 M glutKeyboardFunc(keyboard);% h5 w( N" s8 t$ {9 C3 R
/* 进入GLUT消息循环,开始执行程序 */; F" i3 h" j, L O0 c% d9 i. e
glutMainLoop();( G$ p# S8 u# w3 A+ k% H
return 0;+ S& W5 {' b; E+ J
}
8 w# _, S N9 u* m* u/ L {3 l9 g5 l* b; Q& c% z
88,0-1 底端
6 n: P( a C9 A0 z2 I; d
4 K. m! h7 z7 C编译' s$ M+ H, ~4 ?/ A0 C7 R* p4 o5 v
g++ sphere.c -o sphere -lglut -lGL; O; K2 T2 B! t
4 l e+ C( W8 m+ _, M; Y
6 v) l6 x9 D1 a7 g, D
- M3 C' q/ N* @4 X7 ^ {- l, P |
|