版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2017-1-24 21:35
|
显示全部楼层
/* sphere.c5 K* i/ X n+ Q2 `7 C
此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。4 O4 R* U* b! W0 ?' \/ _$ A
*/
7 j7 r% M3 n7 I& p7 _. p" s8 ]/* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/% w9 t1 j+ X% P1 e8 i! a
#include<GL/glut.h>0 C6 e' R. F) z. y5 B
#include<stdlib.h># l: X5 f4 ^' x! q6 o
( v, ~6 s% S% T e
/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */
+ {* I3 N: S M! x$ fvoid init(void)
) c, X, {' J4 i I( P: |" s{
% s$ a# G3 E/ l! i: e2 h, F; f GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};% e9 A9 k$ g% H! q8 i- D" ^
GLfloat mat_shininess[] = {50.0};
# {' w2 l F$ I- z1 n o1 W GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};6 U9 o- l; t9 G& e$ } ^
. }" v P; m+ L/ p8 i) _7 J
glClearColor(0.0, 0.0, 0.0, 0.0);5 K$ d+ \$ c" E' z# a! v
glShadeModel(GL_SMOOTH);/ C$ Q2 p" J- t z+ j2 w
, R/ h8 i! o3 {! ?7 T glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);2 M, @- M* j" ^% |0 \& _" a; ?
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);* U$ N! M& _1 K4 `/ S: G* i W
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
* Z; S8 B/ P% @* p, K) h: m
6 A/ p2 _) Z7 d5 L5 Z: A glEnable(GL_LIGHTING);/ _5 V! x3 n1 R; _6 p8 N
glEnable(GL_LIGHT0);! z! q4 y% r( {: q
glEnable(GL_DEPTH_TEST);/ A: \( W& d- U6 _1 @
}
8 n# f: l7 D# u2 ?/ S
( d+ P; M8 S2 d, G/*调用GLUT函数,绘制一个球*/
! \$ ?5 i1 [+ ~( b. w) A5 ^void display ( void )
' y. c1 G1 @( _8 x8 g{
4 N8 e2 G, v0 w+ U8 M glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/ x4 s, w8 ~8 P0 E7 p& ~+ k
glutSolidSphere(1.0, 40, 50);
3 ~3 F+ X' z- _9 b0 m) L glFlush();1 B6 V* u' J9 ?/ ^: G) K# J$ v
}' g$ Z' h$ C5 d
: _5 R* H2 S8 V! u/ c3 o" Q
2 n, @ w6 I. w" D# X/* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/9 f6 v4 H% c& S
void reshape(int w, int h)
1 G) F5 O @& f' I& d& x% ?0 t5 C, Q{
# P& L6 G* [6 d: \ G+ j3 X* J glViewport(0, 0, (GLsizei) w, (GLsizei) h);
$ }: y) C1 ^% N d glMatrixMode(GL_PROJECTION);, b# ]: c" v0 z
glLoadIdentity();3 S5 }( W2 C( V$ u7 k
if (w <= h)2 }( i# i& y2 O4 H
glOrtho(-1.5, 1.5, -1.5 * ( GLfloat )h/( GLfloat )w, 1.5 * ( GLfloat )h / ( GLfloat )w, -10.0, 10.0);9 k7 q5 ?+ x( C7 |9 P( ?/ X
else
9 ]5 j& {% U( I( t# L3 x4 y glOrtho(-1.5 * ( GLfloat )w / ( GLfloat )h, 1.5 * ( GLfloat )w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0); R" H) Z5 J% x4 j% k5 _
glMatrixMode(GL_MODELVIEW);
0 d: {; r; ?3 O# v, Q3 l0 F glLoadIdentity();
) f5 L1 N4 E; O1 {. o: Z}3 h9 A; Y: d' [4 A* l; X$ ~
/ k3 a e- F: A
/* 定义对键盘的响应函数 */
g- n8 F! W2 C- d/ w8 Lvoid keyboard(unsigned char key, int x, int y)) F+ \! u+ a ?" @, p! {$ n: z
{4 X* K( E- e* z( u/ v$ m
/*按Esc键退出*/
5 K$ j6 Z' y0 V0 q: R3 B# R) A; V# q switch(key)5 J: ]' n: |* G& Q; y3 ]% i
{
. e+ h2 l8 m2 Z% M0 t# o7 J) T( l } case 27:/ d6 r x7 O$ a0 e/ x
exit(0);
: Q% ~7 a8 F1 P0 |) w, D break;% j2 i3 T K' o
}
* B& r- r$ G, S3 _}. z+ p4 @0 X. P
- h" e+ W2 j% Y9 e, @ U! I9 W
+ U9 J5 w' `- }1 }$ e# fint main(int argc, char** argv)% K/ W# e/ Y9 Z) Q3 j
{
' Q$ E1 c$ {5 x* n( c /* GLUT环境初始化*/
& r+ i0 V4 n9 E# w" Z glutInit(&argc, argv);# L6 Q% ~/ k# U! M
/* 显示模式初始化 */
. T9 h* U) }5 ~% |. w2 f3 C glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);8 c* F1 M; J/ u
/* 定义窗口大小 */" K$ x- G! X/ }4 V3 @. Y- P
glutInitWindowSize(300, 300);
. G8 j! y8 G5 b /* 定义窗口位置 */
: {, X: i1 L- A. ]4 T5 o glutInitWindowPosition(100, 100); y* [; W- B& n- A* m# v
/* 显示窗口,窗口标题为执行函数名 */' o) B" I, h% o0 p7 M/ A( ?
glutCreateWindow(argv[0]);3 G* w- u! g# r3 K# m
/* 调用OpenGL初始化函数 */
0 o( {) h& q. T8 h( n, n init();! y! Z& \" d/ R; O. ]
/* 注册OpenGL绘图函数 */- q: S# U: n, B1 i
glutDisplayFunc(display);7 A {7 O4 l" e
/* 注册窗口大小改变时的响应函数 */6 p0 D$ K: O; @4 Y3 X5 U( k
glutReshapeFunc(reshape);- X3 k+ `8 T/ w
/* 注册键盘响应函数 */* h; t9 Y. F5 @) {- I+ p, C
glutKeyboardFunc(keyboard);
. ?# v5 P/ g% m0 y) H. | /* 进入GLUT消息循环,开始执行程序 */8 G. d# g8 j! P8 w
glutMainLoop(); R4 s6 g" b# [4 [
return 0;
/ J. r, t8 h5 W1 g, m( L2 b}
$ W0 A/ J- i3 G
( W+ R# @# q; x9 @6 l$ ^0 G9 u# A 88,0-1 底端! o/ A9 w/ }' L+ H9 o) M9 I! j
/ I* ^' f% x3 L( C6 X编译
9 B- o# x) P, \+ g# A$ M6 g: Fg++ sphere.c -o sphere -lglut -lGL
v0 |8 X7 D8 R( a* ?% Q
R/ P2 }. |" C6 w1 \8 N5 t X6 d9 T- d) G
* b6 E3 a4 W4 b" H" q3 _
|
|