版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2017-1-24 21:35
|
显示全部楼层
/* sphere.c
+ C* ?' D3 [5 X, K* ^ 此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。
8 U) N! l1 L% N6 J5 `" l$ b3 P*/
$ ~3 l- b7 d* d6 h6 y/ N6 p- Y: V/* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/2 C0 d7 l: Q* n1 p
#include<GL/glut.h>2 G4 P. E' K6 Q H: {3 k& s
#include<stdlib.h># m' |% p6 s3 w
$ y# Z$ A% A2 P C
/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */
) U+ p' T& X v0 Y; J, Ivoid init(void)' S J4 C/ h/ K
{
7 p; w6 @8 ^; |( \ GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
6 q/ }: y- j7 `8 f GLfloat mat_shininess[] = {50.0};
0 W2 m5 e6 H! b0 e4 m6 F GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0}; D. \! V$ f2 q, i
0 l' r* ]- _9 t& A) c( s( y- J' z
glClearColor(0.0, 0.0, 0.0, 0.0);
: |/ j7 W" {$ }8 V; r/ G2 X- q glShadeModel(GL_SMOOTH);
& @. Q$ e$ P3 f) F( \4 z3 n9 W9 s9 ?8 P% v r
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
. R/ t9 b2 @$ r glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
1 e8 B9 w; T* K8 T1 V glLightfv(GL_LIGHT0, GL_POSITION, light_position);
" e7 A' @- R# k+ B2 ~( b, \
5 A3 B8 o+ s' ^" u: V, L2 O8 a4 M glEnable(GL_LIGHTING);5 Z: x. R8 e2 I
glEnable(GL_LIGHT0);$ W, K) _& E; X4 J2 [: t; p
glEnable(GL_DEPTH_TEST);
# ~+ A% E+ d) w( e& P}/ L4 N+ B5 v2 X. o1 n R& e0 O
, ]7 ^' U' Z! o# [% K/*调用GLUT函数,绘制一个球*/
1 l) N' q8 T d4 [# G6 P( J/ @2 ]void display ( void )
& _1 U5 `' R5 k5 s{
' N, Q/ r. f. @- ~# `. z: @5 K glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
* _3 E) d- e' Q! r! a3 N glutSolidSphere(1.0, 40, 50);9 J m/ g" c) Z2 D, p! n7 v
glFlush();0 u5 _4 ]4 b1 w+ W
}1 \, {9 D: c5 ]
+ a" \: d" z2 ^$ W3 C
6 m- {8 Z' R3 C4 I$ @/* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/ D* i* s8 E* H1 e" i. z/ Q
void reshape(int w, int h)
! p0 X4 h; P; v9 u+ Q; g8 _! {3 j{
5 H! R" D# C! g6 V6 R) X& V3 Z glViewport(0, 0, (GLsizei) w, (GLsizei) h);
+ Q! V! J) l5 B' @& { glMatrixMode(GL_PROJECTION);
4 T' b2 t5 X# K4 @ glLoadIdentity();
! y( y2 R- f- d/ C6 y if (w <= h)6 G/ ^0 O+ w3 h' }7 K
glOrtho(-1.5, 1.5, -1.5 * ( GLfloat )h/( GLfloat )w, 1.5 * ( GLfloat )h / ( GLfloat )w, -10.0, 10.0);
" {+ _( f3 o, g# z+ F7 h. Q( h else+ w+ [! H1 g0 j; S! S! ^
glOrtho(-1.5 * ( GLfloat )w / ( GLfloat )h, 1.5 * ( GLfloat )w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);, ^/ l/ h0 Y# r# ]: ]" U( M
glMatrixMode(GL_MODELVIEW);
3 r0 w' A1 G$ n" J3 E glLoadIdentity();2 R4 T- ~" I. u4 {& S6 a. B
}, {8 O% g$ d; @6 q( p3 `* z# X
" N2 j: y) j6 U { Q/ t/* 定义对键盘的响应函数 */
& U# A" k, g5 m4 I8 F6 ~: Pvoid keyboard(unsigned char key, int x, int y)
7 P" F" H$ ] Q _9 L2 V& g{
9 N. G. U) f$ u$ n; Y' Y$ j /*按Esc键退出*/
: q" w9 m4 \% G# N1 h y+ H switch(key)
' n8 |! z7 [9 W$ g C3 B: N { ~3 M7 ^9 o, h. Q. ~0 z+ m
case 27:+ u) K( R: G1 v. I' G2 y
exit(0);
/ x! e- M9 o' _" e: m0 S" X break;& x ~# _# t* p f
}4 p7 y6 b/ F" U J
}
, T: v: @. j8 d
% s4 r$ a6 U" }4 m' ^( i4 M5 |2 P, n5 Y3 \1 [+ R1 G
int main(int argc, char** argv)
7 N- A; K' @! r' d{
. J1 d0 z% f) r- n% F6 d /* GLUT环境初始化*/7 Z$ X/ F1 @1 o8 E# L1 P
glutInit(&argc, argv);
! N6 V' O9 J+ M% d6 y! m7 | /* 显示模式初始化 */2 q; v$ T3 @ e: V5 L0 R
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);4 O7 ~) f3 Q- a, y. X$ ]7 S
/* 定义窗口大小 */
( y3 X& E! ]: b }4 E, } glutInitWindowSize(300, 300);% q6 U) d: |; V7 M: w2 U# ^
/* 定义窗口位置 */# m9 g# e4 P! R7 C
glutInitWindowPosition(100, 100);0 _$ W x6 a; A
/* 显示窗口,窗口标题为执行函数名 */
v" S: E6 N* E% ` glutCreateWindow(argv[0]);
4 u6 ]9 n, f W7 O6 q% E' { /* 调用OpenGL初始化函数 */$ h+ L, S0 A0 C2 O* E5 }
init();2 W/ F$ }$ u0 l* J) p+ W0 X- i1 S
/* 注册OpenGL绘图函数 */
( d% D% _# C ^, f( t% L6 Q glutDisplayFunc(display);7 y5 Y3 I9 p* D
/* 注册窗口大小改变时的响应函数 */
$ V4 r0 i& L8 w3 V; O! ^. w& R6 e glutReshapeFunc(reshape);
8 ^9 L4 E/ n! N/ m0 k) B0 ~ /* 注册键盘响应函数 */
) V8 `6 z {: W, L glutKeyboardFunc(keyboard);
- S6 S8 U2 o. v- x8 C7 K; o /* 进入GLUT消息循环,开始执行程序 */6 e) M0 z* ~; A5 b
glutMainLoop();* o8 J' j' M7 x. u
return 0; r) n# p" _3 }! p( p, c
}
+ ~- k; r$ @& E) z
" z- _! J5 ~% T 88,0-1 底端- P$ ]8 L. O: V/ J, F |
% u2 N$ H& R( C' j( C+ ^编译
- w9 [, w# `+ J9 Kg++ sphere.c -o sphere -lglut -lGL, m, q9 N n/ m) S; O
" u7 h% N5 S( p; ?. Z) k
* Z" r" S1 D- A4 N& h. r. C2 c3 G) o
|
|