版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2017-1-24 21:35
|
显示全部楼层
/* sphere.c
" @/ ^& [# v! G0 l% U( n 此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。
. N1 A& B- V# y2 m6 C: g*/% P% M2 {, a7 A( e
/* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/
- [9 }$ @" c3 u" E; z#include<GL/glut.h>
8 M% B. M8 d' e, X3 N' X5 h1 a#include<stdlib.h>
' V1 X7 ^- R$ j4 e
2 a; T( B1 i( ^* s: V+ Q/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */
$ G) H9 p! Y3 s& ?" Y5 pvoid init(void)$ b5 R, W* J4 N) }2 f3 {' L
{
* J% T7 }/ E6 h5 @7 z$ o GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
) ]' N# K* Z) [4 N0 u+ Q GLfloat mat_shininess[] = {50.0};8 c# d0 V4 f. \6 i2 B& |( [2 r( y- S
GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
" l. z; U/ [9 Y5 q( v/ k% U8 @6 i4 y, H6 f1 C" y
glClearColor(0.0, 0.0, 0.0, 0.0);0 g$ {+ y/ D4 E' H
glShadeModel(GL_SMOOTH);
4 k+ w6 c: u; R) S u$ G* \. N2 c) \1 R' i2 t' z7 L$ V
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);7 B% W! Z' j# {9 e1 ]; x/ k
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);0 K4 V% `% t3 h& M% J% i
glLightfv(GL_LIGHT0, GL_POSITION, light_position); E0 M1 P1 J4 v5 e6 V
+ |* D5 s, H& N. }! P1 R; W' O0 I- B9 w
glEnable(GL_LIGHTING);8 q8 k/ l# c% o0 t0 J
glEnable(GL_LIGHT0);; ], e$ |8 h% Y
glEnable(GL_DEPTH_TEST);( F! _( l, J' {5 p. v2 w" G. y' I
}
. y6 O* h, C( i- i, j8 |3 K `8 x2 D
/*调用GLUT函数,绘制一个球*/) E8 V# a5 @0 V9 Y! L' x
void display ( void )
# W) G7 a; d! i2 g5 i% \{* n9 H6 |2 K& b l6 v7 t. F9 u* P- l* f* W
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- I6 x8 E" g# L. ~+ _4 y glutSolidSphere(1.0, 40, 50);
; n) \) A% Y& c+ v& Q2 C glFlush();3 O' }, H9 ~+ B! b) T/ a
}5 e, v( a* [- K0 _
e5 q1 N3 ? B, j3 `0 f3 T1 _ v; T' D6 I) b. ^
/* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/
+ ^8 {4 z% D' F/ g3 b( cvoid reshape(int w, int h)
. Q0 t) z( V$ T{
5 j5 [4 B, I/ J9 g* w glViewport(0, 0, (GLsizei) w, (GLsizei) h);5 t8 t( C& l" {* ]
glMatrixMode(GL_PROJECTION);' a. `' E: Z4 e, U0 \; f3 e
glLoadIdentity();
' _2 V. r; P: A( [, S if (w <= h)
3 M4 K2 v# n/ {$ ?9 s3 ~ ~7 D glOrtho(-1.5, 1.5, -1.5 * ( GLfloat )h/( GLfloat )w, 1.5 * ( GLfloat )h / ( GLfloat )w, -10.0, 10.0);
. P7 x7 s# B9 ?, m! `1 ] else
: I8 }5 ]$ J3 R x/ f& p1 L X5 E glOrtho(-1.5 * ( GLfloat )w / ( GLfloat )h, 1.5 * ( GLfloat )w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);, ]: \; D5 C+ m% d) i8 S1 e
glMatrixMode(GL_MODELVIEW);
# ?0 |6 M! l; Q# }6 r9 O6 k glLoadIdentity();
% O% ?, }1 M7 h! }0 B}
$ v6 H! H6 n) T* X5 A U
- U, d- w; Y2 Y1 N/* 定义对键盘的响应函数 */; o4 W9 `7 @8 q1 P# O; \
void keyboard(unsigned char key, int x, int y). [2 J9 s8 B. n) ^1 ]
{9 j; {' N: t3 F7 }) Y: c
/*按Esc键退出*/ b) G: B8 R ~% v: Q+ \7 U
switch(key)
% k8 w7 d5 ^3 m% j* ] {
8 h! E% P1 X& V case 27:. R1 A- U5 z/ r' r
exit(0);+ z4 o p& q8 C o9 g* |
break;# n- W2 E. [% u( M1 Y
}# { ]; n$ M& i3 S' `
}; z! T8 ?0 q2 j& E2 q! {' E
! k* v5 v5 n, Z5 C- P/ ?. F" t1 p8 @. I
int main(int argc, char** argv)6 O' m3 f& Q/ n/ i a
{5 T% n. e* m+ k( u: n. k
/* GLUT环境初始化*/4 B& |$ L2 U7 ]9 x6 X" F$ Z
glutInit(&argc, argv);% f; |% V9 S6 F: J0 ?, E2 P% E
/* 显示模式初始化 */
# t Y/ G t4 l- ^" L$ H glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);. V& ^0 T% }/ @" M y- X
/* 定义窗口大小 */
) K v9 v/ d" g( _, ` glutInitWindowSize(300, 300);
! u. ?# Z, N) R- Q m' u: e /* 定义窗口位置 */
) i/ I z# Q4 d% ^! G glutInitWindowPosition(100, 100);$ L. H/ f! Y- o* B7 B
/* 显示窗口,窗口标题为执行函数名 */, C+ o7 p- t. d; o7 s5 P
glutCreateWindow(argv[0]);$ [3 i o6 t4 O) z5 |8 ~5 W7 Q- K
/* 调用OpenGL初始化函数 */
F- K% r% E6 P {) ~' i/ u7 { init();: c) W7 w. L( h, v6 J
/* 注册OpenGL绘图函数 */, w# q8 ]: f" D0 h' C# F
glutDisplayFunc(display);8 @" ^" D* g. Y: g
/* 注册窗口大小改变时的响应函数 */
/ I* q! }! {. {( ?+ ~+ S glutReshapeFunc(reshape);+ j& }. H4 w+ N+ `' U% m0 P
/* 注册键盘响应函数 */" L6 {) z4 D, t7 f; ]+ S
glutKeyboardFunc(keyboard);4 g0 u) V4 e$ W7 N, m
/* 进入GLUT消息循环,开始执行程序 */
3 }# I9 \, `; [1 e glutMainLoop();% ]% x$ c# g' E% L; Q" N( M8 U$ E9 m# o
return 0;( u1 o$ p* w" ?. b
}6 ]# z- |5 P# B) m6 }
8 J; j4 W q0 n' a
88,0-1 底端6 b. s6 U$ i8 c0 `
3 m% A% v. o7 n% m编译
5 c4 X% N6 ~' K% y, i# Gg++ sphere.c -o sphere -lglut -lGL; E5 a& a$ v* z, ~. p% @
) |; E; m9 U* T* c( g3 O
% B. e$ X1 k+ L
+ `" c- f. c) n2 h6 Q" r7 \- X |
|