版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2017-1-24 21:35
|
显示全部楼层
/* sphere.c
1 R8 a9 B3 w9 m& Q W6 S( e 此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。
! ]9 y$ N. T( `& B0 _*/) V. |, B3 L, J8 n8 y$ u% N/ z/ T
/* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/+ p/ j. _ x1 r9 ?: s6 ^% Q: a' z8 B
#include<GL/glut.h>8 v+ l8 [. t% O1 \
#include<stdlib.h>
! x" M. n' g2 H0 u" {' T6 h* g; T' ?- k3 V, y v
/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */5 y. L/ E3 B5 X
void init(void)9 n- p! Y: e8 J* n4 ?! A4 m J
{
/ O& |7 ?% ~* H* m M$ o% p GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};: @ F3 C8 y* r* ~3 v
GLfloat mat_shininess[] = {50.0};
, H" m5 {0 T: l8 D3 Y" A; B GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
# |; {. K: q6 F) Z% v& g0 U8 L' a [, o* ?* M
glClearColor(0.0, 0.0, 0.0, 0.0);6 m7 }8 {+ o O) Y
glShadeModel(GL_SMOOTH);
6 p( l+ Z& U( P# C
+ C6 I' \8 Z" @8 X" ~ glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);7 q& ]# D- d. L; I: m! K T
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);0 B8 g: A# e6 h3 G
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
) `, v1 P: p- ?" a3 x
& d5 T, \$ N; k9 h4 `0 | glEnable(GL_LIGHTING);
/ E5 p4 I. O2 ^7 Y glEnable(GL_LIGHT0);
. ^ Y0 e F; J2 X% m glEnable(GL_DEPTH_TEST);; c; {/ s! S( h. v; q% M4 ]
}
8 X- Y% c& D& T- y9 T; x, c* ?! m
/*调用GLUT函数,绘制一个球*/6 P; B( x- Y, Q3 |; }' C
void display ( void )* v" o4 F* _. h! a; f
{
" a7 K, ?6 @; N- h5 M/ m glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
7 ~4 C! E9 r; i8 i% Y+ g glutSolidSphere(1.0, 40, 50);
$ y$ p- R; o2 `8 S3 q9 ~+ C glFlush();' n+ P7 K& } I8 x) M% N2 j! B7 ?
}
7 c* P% t6 v H7 s
u' ~) N4 W# r1 j# ?- C9 t8 k( f: S
/* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/& e) c' D* O% |0 ?5 Y* s: a$ J
void reshape(int w, int h)" @. _6 g" k. ~5 y
{
+ X1 G" q4 u% I( C2 T9 R# x glViewport(0, 0, (GLsizei) w, (GLsizei) h);6 z2 s0 l, k- D5 p) s9 F+ X! n" z7 `
glMatrixMode(GL_PROJECTION);' S* F; e( ` d
glLoadIdentity();
9 \! V# i. S0 L, p if (w <= h)
5 D; H' T, ^" X! E( {$ r" \ glOrtho(-1.5, 1.5, -1.5 * ( GLfloat )h/( GLfloat )w, 1.5 * ( GLfloat )h / ( GLfloat )w, -10.0, 10.0);
% j3 Q; N7 M* v; ] else2 W- G2 P, [. Y {$ ^
glOrtho(-1.5 * ( GLfloat )w / ( GLfloat )h, 1.5 * ( GLfloat )w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);
6 Z/ T" `8 j9 i4 f glMatrixMode(GL_MODELVIEW);- p* J3 _2 i9 x) `1 W
glLoadIdentity();
- e V: c& M! W8 S; V5 U+ }}
A$ |3 i% T1 M/ t+ Z0 V) H) i* I% t) V; O; O, `
/* 定义对键盘的响应函数 */
9 W) |! d0 m: c4 j* _" ^void keyboard(unsigned char key, int x, int y)" F0 P2 h- y' ]+ `8 i& ]
{) \- H7 o% G+ J$ h3 u. P' H
/*按Esc键退出*/1 I; T4 p# _* o6 v5 r( e
switch(key)
/ T+ x$ k5 T- f# \0 `0 a# } {2 v+ u$ [ N% G& V# q% f+ ]
case 27:
8 b" o4 n& L. s4 ?) f6 d! M exit(0);3 S( T% i m- J" ?: F
break;; E. C! Z/ A T
}$ g: v4 W; ]/ O# [
}; X9 k7 Z& X: P0 L
' C, Q4 Y, m0 o0 l. Q8 W3 G) f* y; ^9 A5 s6 E. C/ t
int main(int argc, char** argv)1 M. X4 c% b8 T2 b) c
{
- l/ }! B" m: { /* GLUT环境初始化*/# _- l; k) _& K+ U1 i* r, g% J$ M
glutInit(&argc, argv);. o1 B. z4 G3 k( `6 r! c# }
/* 显示模式初始化 */
; o( i5 o) D% f/ @- ^8 f/ o z glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); A0 x, l( B7 y, f# R! e
/* 定义窗口大小 */. h, k2 J7 U( I ?7 D. K' ^
glutInitWindowSize(300, 300);2 o7 B6 ^9 I# z& @4 p. K6 J2 ~
/* 定义窗口位置 */4 o; _: h& n4 R5 ?, b: I; W& [
glutInitWindowPosition(100, 100);7 R1 q1 r4 \" x
/* 显示窗口,窗口标题为执行函数名 */3 z) Z1 A2 p$ `# S3 u1 m
glutCreateWindow(argv[0]);
i+ L, s s; l' p /* 调用OpenGL初始化函数 */" \! [9 M* B& J4 @
init();
2 j. O/ d* u! a/ F /* 注册OpenGL绘图函数 */0 X; F6 X5 r V3 p3 `. |5 `( g3 r
glutDisplayFunc(display);
0 }6 F8 A6 f+ ^* h- e3 Y /* 注册窗口大小改变时的响应函数 */& c- v B. C8 a! U% @& X+ t0 q8 V
glutReshapeFunc(reshape);, P! H3 @/ Z4 P) S1 \
/* 注册键盘响应函数 */
* l" ^" E4 W; @; N, F0 u4 } glutKeyboardFunc(keyboard);
- v5 t) U* a5 T /* 进入GLUT消息循环,开始执行程序 */
2 x( z% j4 q3 O9 f4 [% R glutMainLoop();
: }4 S/ S7 L1 D* w, R- ^ return 0;
" r5 B w; C2 n, F/ C}
% y `% V5 r' ]& J' ^& u! _( q5 R' X! S1 U5 @- r0 k
88,0-1 底端
M7 V" S) _5 B- Y7 ]4 G. T% M _ h4 X& s
编译' [' S7 s7 C: z* U8 U
g++ sphere.c -o sphere -lglut -lGL
6 X- |. U1 d& J( e5 o5 d) a- j* J( I$ o$ t, d) V" s: V& s1 E8 V
+ n9 J) }- p: U7 M' q
( g$ b) u# W" w; x6 L1 P2 U |
|