学习汇报openGL
#include <gl\glaux.h>5 v6 f! {! H! t# o; [* [
#include <stdio.h>
( n( h$ l: \2 q9 m, I#include <stdlib.h>1 y p4 j2 f9 F: i* \7 z
#include <string.h>
" h5 N4 D" e4 M0 ~! b#include <math.h>
/ O0 m1 i z$ O r#include "GL/glut.h"
" E/ \* _, k: U J A
/ ?6 \9 s0 }' T. h: ^. a4 }
1 n' L% `2 G4 @* N" x" ?6 tvoid Display();3 K$ x, L" c+ g5 I
void HandleVisibility(int visible);2 C4 A6 i. H$ r) A
void HandleIdle();" C, ^6 A* |/ I
void HandleReshape(int w,int h);9 ~8 Q- B$ E: x& r+ S- s C* e3 X
void HandleKeyboard(unsigned char key,int x,int y);5 V" [, \- P) b( R: m" m: S$ ]
void CreateEnvironment();6 @+ Q( z) Z" x2 F" {8 B5 B
void MakeGeometry();5 K( [# ]/ I& \6 d: l. J" e0 M
void MakeLighting();
# m. o7 s4 t5 m: |5 uAUX_RGBImageRec *LoadBMP(char *Filename);
; x2 v( w3 j8 w" E# S tint LoadGLTextures();
& U6 m* H) L! j* }5 s9 T
" L0 p8 y' A J7 v5 vGLuint texture;
5 `; ~5 W4 ~* m+ H1 F% e# W }7 z$ d7 o
GLfloat xrot;// X Rotation
' R; ^# Z7 {6 I- q) w" {GLfloat yrot;// Y Rotation
: u$ ~, `6 D3 L( _. T mGLfloat zrot;// Z Rotation
u" l5 r) q; ?! C( }+ ], B
8 E& ^% Y! J! j7 ~5 k& l+ e; P# K3 uGLfloat z=0.0f;
. _* u% c' m. @( N! v( ]2 [2 v9 F2 l6 j7 r6 t" O8 Z* T
int main(int argc,char **argv)
4 d0 Y: X& d3 z& r& R ]2 p{
% w g% N* e6 K2 {4 \0 @ // Initialisation GLUT
4 R$ a* G2 B- c int mode = GLUT_RGB|GLUT_DOUBLE;
- V, V! G+ i3 v1 T( N' \ glutInitDisplayMode(mode);
9 ^) f7 Y8 A, n) h! c- Y4 y
; [9 X' r2 m9 y, P/ B // Initialisation fenêtre
" P3 T' E" h9 X glutInitWindowSize(300,300);
% D; s; s5 e8 n' R% E glutInitWindowPosition(50,50);
+ d0 V. m% a' h0 a glutCreateWindow("salut");0 o: b! y* U; D
$ s! n6 L B) J& G* y3 C8 z // Initialisation Handlers. i& d! s) _3 n2 V
glutDisplayFunc(Display);
& J, N# ~/ `' ^' V3 ~ glutReshapeFunc(HandleReshape);0 N) z2 S5 d' g' x6 Y) v5 D
glutKeyboardFunc(HandleKeyboard);
, \# {: a( x; Z6 Z9 C0 j glutIdleFunc(HandleIdle);) x7 J' K r+ q9 A7 H& H% t, K
o" V) i4 N9 f" Y3 K
// Initialisation contexte openGL
! V B8 o. W6 @5 a CreateEnvironment();* B* G A. a# [$ F! K, q: t. b ], Y
; c; Q7 R5 J w // Boucle principale1 a/ t1 Z/ L8 A/ N
glutMainLoop();
$ n% ~$ | A# z4 o8 ~% F9 L/ ]& g. J6 x4 t- V
return(0);
6 [* b. A6 ?0 m6 o. {6 T1 ?}
' _7 U! O9 h6 O2 E2 o) ^
( L9 W( i" g' _$ b; Q2 i, a
+ y$ ~) w5 J q5 C9 s0 Yvoid CreateEnvironment()
; K; s3 s$ n' l2 w" [& @- }1 p& z{ " b5 \" R7 ~% m" U8 n
glClearColor(0.0,0.0,0.0,1.0);
! N' B. R6 | M: p glClearDepth(1.0);
1 \& C( E6 t6 ] glEnable(GL_LIGHT0);" ~. [6 T0 y/ N# c3 C
glEnable(GL_LIGHTING);
7 ]# q, I& Z9 E( i% i- g. O- f glEnable(GL_DEPTH_TEST);: y; ]2 O. v0 ~* H
glShadeModel(GL_SMOOTH);
) P& |3 i* r5 P3 ]6 ` glEnable(GL_NORMALIZE);- h$ k I5 f4 @7 ?$ ]3 ^% h
glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
; ]/ M V7 y' u/ w3 |( O/ n4 L glEnable(GL_COLOR_MATERIAL);
$ y1 c4 \& X8 \& `+ ~3 L glEnable(GL_TEXTURE_2D);# l& y4 t5 |& I2 y1 `/ I3 ]3 ?8 i
glDepthFunc(GL_LEQUAL);
. m+ _/ B$ a" S* `3 E glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
# ?4 T5 Y! C$ q0 A# P$ _
& H1 m$ A0 O# M6 @+ K: M& ` glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
5 H2 v2 c8 @5 s- ^5 r4 b2 J( x! q' Q! p7 K+ j) }* n4 q q3 f
LoadGLTextures();! v y) C2 C8 S6 I! j; _- K* L I
}
% R' R( v) o$ t( |! E0 [ u- W2 m" B0 F
void HandleReshape(int w,int h)
4 W# @/ K, U7 s' f- B0 P{
: A& z3 ?) p5 {' B4 ]" s glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
# [* n1 j3 s2 i glViewport(0,0,(GLsizei)w,(GLsizei)h);3 v1 M$ E/ d, @9 o' A: R4 K
}# z, ?& } `% D) v* j, m2 A$ j
l& r, C1 n) @# S/ G2 c {' R. C
void HandleVisibility(int visible): ~: V& K' J. x5 C" ]; x1 V
{
* R" w0 D# k4 {% R% ]; s+ j. n if (visible==GLUT_VISIBLE) glutIdleFunc(HandleIdle);/ Z, ]0 ]8 p* P2 H7 z0 H' \
else glutIdleFunc(NULL);- l+ w5 x- @4 r
}. K. F, n! O6 `: e" \* l# F3 _
b" r4 P) \, \) v- f' h* Avoid HandleIdle()
" H- C% K+ y( H7 j5 t( S2 x7 K5 a4 O{0 _* z% W+ [* |) `6 s
glutPostRedisplay();
! j; E9 G4 a( d! {3 [) }}
1 ?# p( [8 u4 e, f4 A6 Z% f
5 `4 H/ ^" j( O9 `& Y1 R+ G: Mvoid HandleKeyboard(unsigned char key,int x, int y)/ t) g. h* \4 h- ]/ X! P, Q
{
+ N/ a$ _: R# P- p switch(key){
; h' X. z, Y: l2 Z) P; k" K8 | case 'q':case 'Q':
5 {( I, A3 H' F1 t' M- _ exit(EXIT_SUCCESS);
, R# h% C: \) b: |! g break;
/ j. f3 S5 m! q' L, Q6 ~9 L$ o4 Z+ [9 ]+ Q5 r
case 'e':case 'E':
- g, ~* R6 L; W( J/ Q8 J xrot-=0.2f;
6 ^. M, D, E+ f) d break;
; f4 |( c2 r l! J0 E- ~8 V+ o/ ?: x- r6 r# S8 k
case 'r':case 'R':" n$ O8 z, c$ |6 |% R( M
xrot+=0.2f;. f7 R8 `9 x" N5 g) s& K3 W$ g$ }2 \
break;/ H. ~: V/ n' J8 \
4 b( l2 ~% ]9 F# M' O case 'c':case 'C':
Q: C# M: {5 N7 U yrot-=0.2f;
6 Z2 {, |* N# e1 m* o$ Q: a K3 D3 q break; - y0 l) V5 e% B# O4 j8 j+ b
/ C, n% ?7 n& ?4 @ case 'v':case 'V':& f, j2 P9 z& K! U$ `
yrot+=0.2f;- y# j! \- K: u6 d
break; # S/ D; Q: y( N" t% [% \1 d3 U
2 {# O* I" c% M, z case 't':case 'T':: N. Z% R3 T9 ?4 N
zrot-=0.2f;& D* [1 V5 \4 g! p# o/ Q2 p: f
break; 0 J) o o, }0 p# D4 O# ~
$ K& n, b: e6 F( v, a
case 'y':case 'Y':
& c) e. ~ U. q& F zrot+=0.2f;
; n1 G V( r* @4 Y' m- ^ break;
$ w9 A1 `8 J/ N5 R0 \0 h0 S8 J J) |6 x! I+ c/ P* D
case 'f':case 'F':" R7 Y2 _" b& i( I- u& K4 @% i( \
z-=0.02f;
. C6 q5 Z5 s9 S: y( C3 N break;: T8 M: P( @: W: f; u! a+ Q; i6 f
! B" T4 a3 N5 F: j
case 'a':case 'A':+ L% _- h- U( Z1 f5 e, g' a$ P6 h
z+=0.02f;
/ C2 x" J5 o5 E- b( Y! l; f+ Y1 k break;
6 @; W- |# c+ v& h( d5 F8 R$ S( {3 o. ^! u7 D
break;" o3 p0 D7 T$ Z
}
& K b' E! L! t: r# f# U+ I6 }# S, Q
}6 w. Y( E; J n+ Z3 `
P0 c& f% f6 @8 t0 u6 x8 [void Display()
/ ^( L1 T2 \( v/ T1 D{) n: G7 @, @' O$ B) n
/ o2 h" M2 F% ~: S
// Initialisation de la matrice de projection
6 x! `/ `5 P* A, G* j
, B' C: }9 K/ c* x, m, w5 S% x glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
/ ?2 P2 J% A; f% a glMatrixMode(GL_PROJECTION);
4 X% O2 a8 K6 w- V0 t glLoadIdentity();
" f6 ^' s2 E5 n1 f' b gluPerspective (75, 1, 1, 300);
% |; h# A/ \$ ?! g8 |6 F+ f/ @
' H% D/ K! ^* t" G0 N" Q // Initialisation de la caméra
+ q% R9 C, G6 O% @3 p glMatrixMode(GL_MODELVIEW);& t8 Y" H+ l5 q/ H
glLoadIdentity();
9 E- s6 v1 ^- H( o" a& d$ }) k gluLookAt(3, 3, 3, 0, 0, 0, 0, 1, 0);' ]; P4 V# H6 V( Z( @4 O) w% S
: O/ s* H* X: F' t/ D
, ?% X/ ?* h7 ]) {
//Rotate and Translate% a9 A' f' d3 }1 k9 S6 ~" s
glTranslatef(0.0f,0.0f,z);1 s# x# f7 S3 `4 Z: f! N) A2 G: w) H
, q$ Y! A/ C! A. D$ s glRotatef(xrot,1.0f,0.0f,0.0f);- r2 K. P" V& @8 ~/ u; O" P
glRotatef(yrot,0.0f,1.0f,0.0f);, T$ B! o7 K) _6 \, b$ a
glRotatef(zrot,0.0f,0.0f,1.0f);" g0 c- V. w) l% \: X
5 I! F6 J7 ^4 }" c // Génération de la scène (lumière + géométrie)5 o; d6 ?! E' @3 x7 `8 l# ?5 ]$ x
MakeLighting();
^" [& Z0 v5 k. ?+ C% V/ D MakeGeometry();
& D( E- _( e; |( R
, r3 y8 w6 r8 J: k // Swap des buffers
# y' r* o1 b, t2 e! f glutSwapBuffers();8 r+ @% A- _( L
5 `4 y9 m8 S( p
}
: O+ v# n6 a7 F6 c# j+ w# z
7 c s2 @: {6 A! H* l0 L9 ~void MakeGeometry()/ m+ U2 ?' N9 p$ D' F
{
& _4 L# U( [/ b+ u4 ~8 `6 R glBindTexture(GL_TEXTURE_2D, texture);) t4 O& B7 L5 h5 H3 r
glBegin(GL_QUADS);+ n; F3 l: |! j0 L" i
// Surface en face
# o- ]2 e2 K* s- w$ e3 ^ glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);& N# I( F% u0 x8 C# q N
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);9 e* v* A: e3 }; O
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);; w! r! M$ B- v$ L3 g
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
$ g q. m8 T. T# A" j // Surface en derière
@" L+ H& ~9 t. |; k glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);6 S1 F3 F. ^; z& ]7 e$ g5 S
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
! F2 F+ z3 Y5 K/ F, p. P5 A glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
! |" A( I3 J: A& z glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
, l8 \* q" }( M, f8 h/ C // Surface en tête
8 Z* B, [8 V8 |: n) X; A: _7 | glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);1 \+ l, @' M1 I
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
8 H: y3 x* F( ] glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);; o! j, A( N0 R" m0 t# h
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
f1 Y& v) y. d8 N // Surface en bas
; k, a% [9 l$ a0 k4 f" E, M1 _ glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);2 }2 s+ p' ^* n; ~( v ]; I8 K0 c
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);# J. _3 W% [! y. Q
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
% ^/ C) T8 B9 \3 @ glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
9 s5 m5 j0 ^: I) I s4 { // Surface à droite
$ O: y! u# O# {. _0 C glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
" n# N: x0 P) f% p glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);' H/ L# c6 Q& |& G6 _3 @& U! }2 M! O5 w
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
}4 J7 e3 K5 [- M, F glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
8 e; `& O1 A2 b/ ` // Surface à gauche5 ?& E% x) ~+ v- g4 p5 ~
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
0 q! x8 X% M: K! l glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
% {( E- o" i, a4 Z" o glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);& X) V' _4 E5 _8 H& U
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
" n, M7 C4 y+ U1 g9 p glEnd();# F% G! Y) O& B' K$ T( F" L
8 L# r, O/ s2 ]" c" v9 V6 \& ^/ _
}
9 w+ ~2 o5 G1 l1 N& n4 {1 ]
# ^9 e$ |" W+ @! k' {3 [* rvoid MakeLighting()
$ W$ K4 z3 _3 t2 F: N0 c6 g7 K! m! P{
2 N9 o9 ]1 l0 s) r! m2 [, G- i$ R // Désactiver toutes les lumières% v J6 [! E. V' M; {
glDisable(GL_LIGHTING); R9 A# @9 Q: F& B3 U# L5 G( _
glDisable(GL_LIGHT0);: X) d4 k8 t, c6 b9 \) ]
: @) b. v5 i/ u5 ?# w; |+ r# j // Initialisation des paramètres
9 o0 N' L3 U, T9 y GLfloat LightAmbient[]={ 0.5f, 0.5f, 0.5f, 1.0f };
. u* Y1 r- t- e$ o- S2 e GLfloat LightDiffuse[]={ 1.0f, 1.0f, 1.0f, 1.0f }; H5 Y, G) N: S% y% p P1 W( b4 c
GLfloat LightPosition[]={ 0.0f, 0.0f, 2.0f, 1.0f };$ V- v9 }0 w& {4 k* L
$ \1 F* N1 u* U: e* `" m. \# H
// Initialisation de la position, ambient, diffuse et specular et activation d'une lumière$ P; w8 I! p' M c" Z
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE);# i" T' `- L+ u' i* p7 v# [$ W8 _/ E
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_FALSE);$ O. E6 W7 y, k# H
glLightfv( GL_LIGHT0, GL_AMBIENT, LightAmbient);5 B( R* c+ F9 i, K/ u& W0 e) A
glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
% M+ `9 H( r2 Q& I% u7 a% d: d glLightfv( GL_LIGHT0, GL_POSITION, LightPosition);
3 Y, H+ u+ l( l. l- I2 ^& n' Z6 }% g% F+ O' w
//spot
+ M- p, e( c* f7 ^+ z/ ? GLfloat spot[]={60.0};% O/ N1 Q4 F! Z! a/ |
glLightfv(GL_LIGHT0,GL_SPOT_CUTOFF, spot);
1 j: {3 \3 J7 G4 b2 o GLfloat spot_direction[] = {0.0f,-5.0f,0.0f};
# o; p% t! ^' d% [ glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION, spot_direction);. W3 P: L2 Y# ]! L$ r
# d" ]' p6 R& t6 s6 q
// Modèle d'éclairage Gouraud
' M" y( A4 f7 d2 ]9 g" J glShadeModel(GL_SMOOTH);
9 O0 ^" O. J$ c6 j3 H. r$ g' F! Z! }+ V' x
// Activer la lumière$ s2 w- {$ A; z/ [/ p6 d
glEnable(GL_LIGHTING);
2 A, R: {9 p0 J e% Q/ O glEnable(GL_LIGHT0);% _0 u& ^4 q2 ]. p
" i2 z5 {& j3 k s
}
" B9 s; A! } s) l6 x. F$ u
; k" y# K; v7 Q: j8 W5 zAUX_RGBImageRec *LoadBMP(char *Filename)
$ u1 G( F" P9 r1 R# W{6 d- G6 k7 e! q
FILE *fp;: _0 D5 N- x g, L0 O, ?7 x
1 F& |& P0 |# S) L0 V, e E if (fp=fopen(Filename,"r"))' R j( g6 k9 J& H9 ]/ W( L
{ S- I, ~0 w+ u6 c$ b
fclose(fp);
2 b& N: g; c3 _* v return auxDIBImageLoad(Filename);
% V3 Q2 H1 f. N W% q) a# q }& x7 t O9 [. l
8 j$ I5 k) F$ _9 c, r
return NULL;
/ v: Y2 F7 |" H* _4 J}
! Q. x. n( `6 |# i9 ?
5 B) A" e# d7 A2 C9 B$ {int LoadGLTextures(). u9 V+ w' O. W( {/ J0 l2 A& L' h: Z
{! ] B& [- B# y& [: T" j
// Create Storage Space For The Texture
# [" Q8 S& `- n AUX_RGBImageRec *TextureImage;
" \2 c/ k; V$ e2 U3 ^
2 d9 |! Z: h! {$ ^# G; Q' I // Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
+ J% y8 y9 h- `% J. U$ f6 R& a3 H if (TextureImage=LoadBMP("Crate.bmp"))
8 |0 M$ H$ M3 C* U. ^ {
0 `1 O# a+ ]" ~7 b, f5 j6 {" w . p3 A& E$ F2 Q! w# i
// Générer l'espace nécessaire au stockage d'une texture
6 i5 x( Z; f' y+ ^9 j glGenTextures(1,&texture);
8 a, p8 T2 M6 e' z- S // Sélection de la texture + initialisation des paramètres de rendu# n9 g1 h0 T" e9 p& M: C& T! L3 J1 T
glBindTexture(GL_TEXTURE_2D,texture);+ X7 i/ y4 S V/ Z
( q3 b& g$ v: @& [9 J
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
3 M$ M/ ^' n+ g7 ^2 R* t' R4 u3 ? glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);1 @' `% X4 f) t& ]$ f! L
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_REPEAT);& N- ~( B$ ]5 V6 r
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_REPEAT);
6 F1 W- z+ i U" W3 y" u5 k% \ glTexEnvi(GL_TEXTURE_2D,GL_TEXTURE_ENV_MODE,GL_MODULATE);
8 L8 P! c" x. X' w' |" {
6 H2 k3 q- C* Y5 v5 v/ R( e: ? // Génération de la texture
* G: J* Y' }: f4 {' a glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,TextureImage->sizeX,TextureImage->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage->data);9 i1 f% [1 z7 U5 ~
, z# b4 ?4 g1 i! C; j // Libération de la mémoire
% A9 i0 W8 x# E3 r+ ^2 \" C. H% M free(TextureImage->data);4 i+ H. f1 W8 y r6 A
return(true);
$ E. d9 w& _& S. b }
3 b( U& \* e* l& q7 g return(false);$ q# M' J+ E9 K7 ~
}
搜索更多相关主题的帖子:
openGL 源码 纹理 正方体 灯光