版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2017-1-24 21:35
|
显示全部楼层
/* sphere.c! M- F8 u. m" C3 b; Y; G q( t
此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。- u- w) L& X' P# s# F R0 [
*/) h k0 A) a( o k( m6 n7 U, i2 s
/* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/
# C5 r# {# U9 \) E/ \7 [#include<GL/glut.h>0 [ x+ b* z0 _2 [" D+ f
#include<stdlib.h>) S- G( v9 g3 j5 o
$ L! z r1 g- t
/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */7 d/ L8 q. F" ?8 A' O% p
void init(void)5 k0 D/ ?4 N& E
{% b& ]/ y) K2 u+ o8 S& J
GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};4 J; f+ K4 R$ u4 w' Q
GLfloat mat_shininess[] = {50.0};
( }& C+ b( z. d5 P/ C3 S GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
2 G/ k p* j7 K/ l+ q% G( s' R( {' C4 t8 X8 m. X
glClearColor(0.0, 0.0, 0.0, 0.0);
, j/ O$ O# y& {7 j2 e# o- ~) D4 B glShadeModel(GL_SMOOTH);# @* z2 e- z! p- h
. s% z* R4 p4 E$ Q" } glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
& `2 k9 ^9 }1 N' @ glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);% ~: G7 K- e! P1 e. }! o: @" o: g
glLightfv(GL_LIGHT0, GL_POSITION, light_position);0 q! H4 J& `0 Q0 c
* M! N* P, Y( E' b' [/ E4 e
glEnable(GL_LIGHTING);- @: y4 j. `& _$ i5 H" D# z1 z& _
glEnable(GL_LIGHT0);
3 k+ `: P3 h8 f9 \* K2 `) {( [" q glEnable(GL_DEPTH_TEST);% b8 k' H ]& n' u3 j2 L9 H
}7 Y1 ^( L& ~) U# `: S, g
( z# L C% A& C6 M+ ~/*调用GLUT函数,绘制一个球*/
, q7 d6 U# A2 ?7 m, W7 h, Avoid display ( void )
j" @ b }- G9 ~{
! n4 `0 @! V8 v glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
% B/ F7 l6 z5 P% C" r! u+ a glutSolidSphere(1.0, 40, 50);
8 u) C) u# G2 x" J j m glFlush();% o) ]" l N& ?5 B+ m
}; G2 L' _' D5 z- F/ S- K( {
4 \" g! y. I0 k+ }
6 e6 G0 q% J8 J( ~% j7 T. S/* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/# x0 h* z3 S' M+ D8 E7 I' O
void reshape(int w, int h)9 t% E- V) B) S% a2 }0 p$ B
{
! V$ O" [1 t# Q' L1 p4 f glViewport(0, 0, (GLsizei) w, (GLsizei) h);% u* ^1 V3 N0 B
glMatrixMode(GL_PROJECTION);
) a8 R# a8 T$ M" k% Z! I* o1 P glLoadIdentity();/ D6 G+ K! U T. e9 d' Q
if (w <= h)
; N% [( K; A% v' H) w glOrtho(-1.5, 1.5, -1.5 * ( GLfloat )h/( GLfloat )w, 1.5 * ( GLfloat )h / ( GLfloat )w, -10.0, 10.0);
' x9 M0 g2 b! B1 r# D# I: @' S, e else3 E0 K6 W# C% @" s7 K
glOrtho(-1.5 * ( GLfloat )w / ( GLfloat )h, 1.5 * ( GLfloat )w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);
1 `) p# l% T! z* P glMatrixMode(GL_MODELVIEW);5 v/ g+ V; S, S! o$ V# T
glLoadIdentity();
; _& F0 }+ @7 v0 X9 H}
. v9 p' V8 B$ x7 o3 F" O! ~% e' E Y3 l# Y# R
/* 定义对键盘的响应函数 */
8 S' `& ?9 o$ W7 A7 M: c7 wvoid keyboard(unsigned char key, int x, int y) c+ p ]4 M& }" ?6 t" z
{
4 z2 @, F, e, x, n! s f5 D /*按Esc键退出*/
$ y: m3 N) q8 `2 U# r" { switch(key)
7 l8 b4 i2 D; i# f- }& S {
' x% V6 z' J; K" i4 o case 27:9 K; |3 z1 X: |: C& v4 K w
exit(0);# ^$ C3 [: t& [$ \" u- M
break;0 {2 f# n. z: `( B
}
1 @& a6 L9 ^3 ^5 |3 k}# V9 G$ @" X5 I1 b# `& y$ l# l
. `) s' s, p) D4 h/ M t9 C5 p, j8 ~$ X) |5 _
int main(int argc, char** argv)
' w( P5 m5 e$ A8 }4 C9 I/ k& f" s{8 \5 w, _0 \& y
/* GLUT环境初始化*/
+ F- [* A. a5 e! b4 o& b/ v: I" _ glutInit(&argc, argv);
% t1 V. B; a* I7 T /* 显示模式初始化 */
% Q/ g+ G* E# G' [; j: q. b glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);" m1 t4 c0 t: s8 E
/* 定义窗口大小 */6 H% k- T! M9 l/ t# \; F$ ?6 L* f
glutInitWindowSize(300, 300);% b' i) D5 X2 V/ f" g% ^! |0 x
/* 定义窗口位置 */
7 V6 t2 l, t1 D9 `# d5 x0 z& }9 V glutInitWindowPosition(100, 100); V) A! r& \2 I; [7 v+ i
/* 显示窗口,窗口标题为执行函数名 */3 {4 w1 w4 L* E6 p6 D
glutCreateWindow(argv[0]);
+ u: a5 l% s% e/ \9 S" U /* 调用OpenGL初始化函数 */, F' E, o. P$ L' f- d2 L
init();
4 I2 X3 [2 c2 H c T$ Z: X /* 注册OpenGL绘图函数 */$ z9 a* {' c1 i! U/ {
glutDisplayFunc(display);
5 U" L$ \* a- [% S /* 注册窗口大小改变时的响应函数 */! E9 w4 T: z( P4 A: \0 Z: M# q
glutReshapeFunc(reshape);0 W6 j- f! Z- _0 D I" m4 F, S4 _
/* 注册键盘响应函数 */: A! R1 n9 j( u; }
glutKeyboardFunc(keyboard);4 _$ d# }; t$ ^; ^2 t/ ^
/* 进入GLUT消息循环,开始执行程序 */9 ^/ B3 M V! X& b: G7 s1 E
glutMainLoop();4 p' u$ O; M9 h8 _8 |
return 0;8 Y# |; N) c3 N$ z9 W+ a
}
% Z2 l z; t7 r. @& z' }9 Q, J' }
' a% M% |- e+ A: S. W- A& ?" i 88,0-1 底端2 @( R0 r9 m) @/ t; V6 L: a
- M: B. z# A* J/ ?0 l3 t
编译
6 z2 G6 z- o. { B* ^' w' L) h9 p' tg++ sphere.c -o sphere -lglut -lGL
1 V9 ?; J( y! M" z1 [6 f
& D x9 L" I+ T. x
+ E" n8 s; z3 E2 \& w" j7 d0 m' X* c/ x; ~: ?7 I# u- D
|
|