版主
主题
帖子
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2017-1-24 21:35
|
显示全部楼层
/* sphere.c: V' A8 C" L! C/ j
此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。" u/ O7 f+ D6 ]3 q( E n, i
*/4 i+ G& q# B; Z0 t& n; ?: ]
/* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/
; y k% y1 t% B) ^#include<GL/glut.h>6 v2 S3 V/ B) L+ W: k
#include<stdlib.h>
2 l% \" x* p- e( F" T
7 n9 j" ]+ r6 \# i/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 *// U; o! J7 X: P ?& X1 A
void init(void)
- p% ?& _9 R4 g1 H+ O, I6 }{% z7 G" W: I1 g2 s3 Z6 [
GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};( N# L# F5 J: [4 [( w3 I
GLfloat mat_shininess[] = {50.0};
- F4 }, p2 U& b0 Q GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};* a* k2 n: z' j# G
, d+ C. f6 Y. Q( w$ x" w
glClearColor(0.0, 0.0, 0.0, 0.0); r- s; E9 _ j! Y, p3 |" T
glShadeModel(GL_SMOOTH);
& K; a$ T" ^0 D+ Z# @( u/ B6 j" Q- h, u
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
: F; ?3 @& t; u, I glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);/ S8 f! r9 S3 ~; O: P' ~
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
6 U+ G! C2 D$ L: S; a' ]# N* V3 j6 l( U% p) b
glEnable(GL_LIGHTING);
% e& O8 Q+ f1 g/ b" X glEnable(GL_LIGHT0);( L) l) [; W* q7 b
glEnable(GL_DEPTH_TEST);- M/ c6 Z, q$ t. e0 P8 t
}
- g9 e# ?! K C' o( U5 A7 r
2 G) j. ]' ~8 G5 I/*调用GLUT函数,绘制一个球*/1 W' K9 R; t; w$ Y- Z
void display ( void )9 I- L" y( S3 Q
{
: z" ?0 J4 P E$ L. k glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);. W' }( s: J+ u2 w
glutSolidSphere(1.0, 40, 50);
) ?/ |" g. H0 b+ \; l* h glFlush();1 `% j3 @+ \, ]. y9 d
}9 \2 e5 \3 _& [* [8 V* u( w
: i2 q4 K+ M5 A& L1 p1 U9 i4 T8 u1 ]+ n7 ]! x- S0 t4 ?
/* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/
7 o; n2 E3 a% K5 _void reshape(int w, int h)
- ?, S, P* k3 W9 m{ . J8 y; f# p1 F: Q6 B8 `2 y, r
glViewport(0, 0, (GLsizei) w, (GLsizei) h);/ ~" ?( ]' F4 S# M/ t& @4 l! |
glMatrixMode(GL_PROJECTION);
3 t/ i _) H- {1 ]* E' S' h7 _5 w. p$ b glLoadIdentity();, _/ c$ t' W0 O& t" W2 s8 f
if (w <= h)3 j M4 ~+ C/ t
glOrtho(-1.5, 1.5, -1.5 * ( GLfloat )h/( GLfloat )w, 1.5 * ( GLfloat )h / ( GLfloat )w, -10.0, 10.0);6 S; z9 R3 Y" t& u8 d: x% K
else
2 \. F* b& A2 P" u glOrtho(-1.5 * ( GLfloat )w / ( GLfloat )h, 1.5 * ( GLfloat )w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);1 T4 a: P( r! k' @
glMatrixMode(GL_MODELVIEW);4 k$ `" F) u- B5 K
glLoadIdentity();5 A! E+ U* x$ K6 T3 f
}! M( P5 F. E8 @8 M6 b
# W6 w/ _5 I5 P2 Z2 M& x( K2 U/ I" c
/* 定义对键盘的响应函数 */
: C' |. J3 o. k$ p) Vvoid keyboard(unsigned char key, int x, int y)5 b' p6 }0 h& U% r( e& f4 G
{
) ]$ M5 S6 y' O/ ^' c8 ^" z! S- U /*按Esc键退出*/
3 j+ Z4 V% O7 F8 k3 v8 V! h switch(key)+ G0 ^- q" H$ w/ v# ~
{: d) `" j% H' L Q+ X& ~' q
case 27:$ ~1 x( i- p1 c7 d) b* M3 J
exit(0);
+ @6 h! j9 q3 m- d break;/ x( J! s% y: J v
}' s7 l$ n6 W$ \; B5 V
}2 W4 [/ l( Y* E1 Z6 {' C
5 d- ~# @4 w$ O% P6 K- h) W) S) k
7 F K' Z5 `# B- L! _int main(int argc, char** argv)
, j: e$ l2 \. D{ _$ w# u( N7 {# n9 l
/* GLUT环境初始化*/ ^/ y1 _" b9 \" r, s
glutInit(&argc, argv);! R/ S( f/ z* S9 r% l$ Y
/* 显示模式初始化 */
! }! w6 U$ k" M glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
9 ?1 Q: R( M( w0 Z4 m /* 定义窗口大小 */
# i' v# n7 q/ Y _- d% j" g' c) W glutInitWindowSize(300, 300);$ I: s! H; \; ~8 l; X
/* 定义窗口位置 */
& _* U! U9 U# |2 @0 f) g9 l glutInitWindowPosition(100, 100);- L/ V' Y' O; J. i0 [3 r& {
/* 显示窗口,窗口标题为执行函数名 */0 ?. [1 _2 z1 Q! V+ p* T. }: e
glutCreateWindow(argv[0]);) j& M0 A. I9 U. y2 m4 g0 M p7 ]0 e
/* 调用OpenGL初始化函数 */- A6 o1 i5 b( \
init();' R: S7 u& C7 n% j/ I
/* 注册OpenGL绘图函数 */" e/ x! s9 @0 n P/ m
glutDisplayFunc(display);
. q6 ?4 {8 ~& H- j: P /* 注册窗口大小改变时的响应函数 */
. W: O, C9 `" ]$ F) r: ] glutReshapeFunc(reshape);
[' d8 y+ l" F4 e J /* 注册键盘响应函数 */
7 h" X) I/ d/ D$ g0 ]3 P4 X9 I" \ glutKeyboardFunc(keyboard);
! ^9 A( |: H; d, j- o8 j /* 进入GLUT消息循环,开始执行程序 */
1 p2 d1 F: r4 e# |$ V) o6 |( A2 | glutMainLoop();
6 u6 V5 Y0 D; ?" Q& c* B3 F5 i return 0;
^: R# H* K/ |4 \7 N3 R}
% }4 R# w& K1 d! ^7 F5 F5 V% o
+ U7 I# X3 F. W- @" S 88,0-1 底端) [2 E) j( n3 q! [4 s/ w) o
8 z0 b5 Q. y! Z: S编译
0 a1 B4 P/ m4 V! u* p Mg++ sphere.c -o sphere -lglut -lGL7 g, _' x# H L* t+ R2 ]3 \
6 [; E: l- [! z6 F& G( c) K/ x" ]" s
1 f, b$ U* [4 u3 F
$ k' j9 o- B/ e2 s# l2 J6 v3 u# i9 Z
|
|