版主
  
主题
帖子
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|

楼主 |
发表于 2017-1-24 21:35
|
显示全部楼层
/* sphere.c- M$ z5 R; X7 n# [$ k+ y
此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。
( l. Z+ T" D' ~4 `7 v4 X1 R*/
$ `$ J/ g. W- G7 |$ T; `/* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/; S. \3 l& s" b8 L
#include<GL/glut.h>8 ]( |0 W9 l; b9 u5 }- ~5 I$ f1 ?4 L. w
#include<stdlib.h>
4 o' {# ~% [7 U7 W) ^$ o6 f* V, c2 C( m% ~
/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */* s( n0 Q! }/ x1 D+ m1 \8 r
void init(void)7 A5 d' h' ^4 u
{
# o0 p ^8 s- W+ w+ C+ r A v5 L3 l GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
/ B" N2 p* g( f$ F4 `5 J, h GLfloat mat_shininess[] = {50.0};
- v0 Q$ x$ f% y9 d' U' K GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};3 |# a1 b$ j* ?$ [6 M% a
( c n R1 m9 `- T: X) F1 |- j glClearColor(0.0, 0.0, 0.0, 0.0);8 Y- \( F3 f; y6 b, r
glShadeModel(GL_SMOOTH);
! d3 C5 W6 k+ I' b, ^
( z+ U3 L) d' H, ?8 f# k/ S glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
7 W( p* E3 \0 \0 i, U A( R glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);& i) n, w& r. s0 F
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
! i* a1 ~% }( ^8 b( d) w+ O9 U# i# d2 |6 J
glEnable(GL_LIGHTING);
8 V; \: W2 M- o glEnable(GL_LIGHT0);
7 s( l9 g$ h9 O; N; Z1 }; g4 t glEnable(GL_DEPTH_TEST); t( l4 s' _- } ?' a' _
}
; l/ U3 g' ~4 W+ j8 v$ c7 R8 m9 W! X8 {' L) T+ o, ?
/*调用GLUT函数,绘制一个球*/4 i8 f. g+ f5 ]
void display ( void )6 P7 }+ G& g2 w/ A, N* ^: Y
{' x7 `, n: }- ^# i* n h
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);& ?( ?/ _3 Y; `4 `/ a9 ^: Y
glutSolidSphere(1.0, 40, 50);
! Z; T2 r N: j1 t6 D2 U) z glFlush();9 l, x8 z8 ], B$ K7 V3 ~4 p
}
- Y; m1 x/ L' g H. G; n
. h# c# W# W6 H5 c: j) {0 G
, q8 a4 B( E" h1 {1 `7 `9 R: m/* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/5 o( |4 }4 j, A$ [
void reshape(int w, int h) _) j+ q* J! W3 L5 a: ]; ^8 n
{
; U6 ^; } z* }* @ glViewport(0, 0, (GLsizei) w, (GLsizei) h);
/ v! f( r% u* p0 b2 o1 H- v) J glMatrixMode(GL_PROJECTION);
) l3 O6 p* X7 b3 @8 B# l glLoadIdentity();
. g' [0 c& i3 L1 a5 v( B% U if (w <= h)
$ v- N+ ]3 C/ n8 V4 E) \* N glOrtho(-1.5, 1.5, -1.5 * ( GLfloat )h/( GLfloat )w, 1.5 * ( GLfloat )h / ( GLfloat )w, -10.0, 10.0);
$ c# e" o: ]4 m/ Y+ c else
7 ] w3 k' \, L4 a, n% u$ I glOrtho(-1.5 * ( GLfloat )w / ( GLfloat )h, 1.5 * ( GLfloat )w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);
' e. X8 ^* B, Y/ w glMatrixMode(GL_MODELVIEW);
; k! x# M1 A% }, q+ W7 {/ K( y d glLoadIdentity();3 ^0 B2 T* ^) Q8 x, [0 V
}
" f1 t5 G# }- c3 o _- H
! W" _7 C- k, P% @* k/* 定义对键盘的响应函数 */2 z" g3 P/ ]5 p2 \ W- o3 O8 N1 f
void keyboard(unsigned char key, int x, int y)6 c: p1 u2 ^6 J6 r1 y$ l
{8 r! s7 i* Y% q/ A. {$ r6 N5 W
/*按Esc键退出*/, {% @/ ]+ z. |+ S8 w& Y7 c" E
switch(key)
H1 R: g3 J/ u5 \, r a, T {8 _# V5 V% I1 @3 F; w+ S
case 27:
% v3 ?3 Z4 e" l# c/ R! N exit(0);
2 T0 F% p' F5 n" o0 p# c8 o break;9 e' d8 E# K/ {/ _, F
}& u% P4 }& ^1 X
}( b% _) H: `) ]0 I3 p
+ b( Q; E# y' ?& E
( Y! } I" A1 y0 r. N- ?; g% Z: Nint main(int argc, char** argv)4 m7 u5 \/ }( \" x" @
{! G. J/ ], g/ Y+ r: \# C/ x6 r7 X
/* GLUT环境初始化*/
' N6 {5 i! C' c' h glutInit(&argc, argv);
7 v- C. [8 x0 L P5 K* K/ J' A# w /* 显示模式初始化 */
/ _, Q9 J: K0 J, [1 N* B! W glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
" k7 u+ H% S" H5 D0 S0 } /* 定义窗口大小 */; `/ R5 n3 d$ _# P0 z
glutInitWindowSize(300, 300);
, x) O/ I- S1 L+ h8 k2 ?5 s /* 定义窗口位置 */9 N) e: v" n/ g0 h9 ?9 D
glutInitWindowPosition(100, 100);6 Q- i1 z* W; n& ?$ i
/* 显示窗口,窗口标题为执行函数名 */
0 G% E8 ]" Z6 E- X# K, \% f glutCreateWindow(argv[0]);' a B7 l+ \: P: ]( C
/* 调用OpenGL初始化函数 */7 \0 i; n$ t# A: m7 u* w
init();
5 U! T2 y6 ^5 R5 V: x J+ A. m /* 注册OpenGL绘图函数 *// t8 _7 d9 Z3 A4 Q3 N' d
glutDisplayFunc(display);
* H; j" }3 N& Z, g /* 注册窗口大小改变时的响应函数 */* \% I, G, D/ B4 S1 w+ R
glutReshapeFunc(reshape);: c5 \- g4 |" @0 S
/* 注册键盘响应函数 */0 M5 U; f# t2 {* K
glutKeyboardFunc(keyboard);- t& L$ {6 i& {( M' Z
/* 进入GLUT消息循环,开始执行程序 */
% c- E) A4 i$ \' c& B3 u glutMainLoop();& X- Z4 s- n+ h$ Q8 M/ q
return 0;
: ^4 C* ]! m5 R" T}/ w1 ^6 E2 V: ~/ x& s- n
! }' `0 a4 ~1 x+ Z6 F @2 U
88,0-1 底端
: r; T1 I% a5 p1 s! ]9 B% \6 i h4 z' N4 g
编译+ R8 e5 G+ q! ^) n7 r
g++ sphere.c -o sphere -lglut -lGL
) ?* ~* o& X* z: z3 J% r. [7 X- H0 c `3 U. o- c
& ?, f F) k1 d. @2 i3 K$ |/ S
$ ]) P1 z. K! V/ N1 ]
|
|