SDL2+OpenGL (3)纹理映射
1 #include <GL/glew.h>
2 #include <SDL2/SDL.h>
3 #include <SDL2/SDL_opengl.h>
4 #include <SDL2/SDL_image.h>
5 bool quit;
6 SDL_Window* window;
7 SDL_GLContext glContext;
8 SDL_Event sdlEvent;
9 GLfloat xrot;
10 GLfloat yrot;
11 GLfloat zrot;
12 GLuint texture;
13
14 void Init()
15 {
16 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
17 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
18 SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,24);
19 SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
20 SDL_Init(SDL_INIT_EVERYTHING);
21 window = SDL_CreateWindow("SDL+OpenGL", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,400,300,SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN );
22 glContext = SDL_GL_CreateContext(window);
23 SDL_GL_SetSwapInterval(1);
24 glewInit();
25 glEnable(GL_TEXTURE_2D);
26 glShadeModel(GL_SMOOTH);
27 glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
28 glClearDepth(1.0f);
29 glEnable(GL_DEPTH_TEST);
30 glDepthFunc(GL_LEQUAL);
31 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
32 }
33 void LoadImage()
34 {
35 SDL_Surface *tmp=IMG_Load("huaji.jpg");
36 tmp = SDL_ConvertSurfaceFormat(tmp,SDL_PIXELFORMAT_ABGR8888,0);
37 texture=gluBuild2DMipmaps(GL_TEXTURE_2D,4,tmp->w,tmp->h,GL_RGBA,GL_UNSIGNED_BYTE,tmp->pixels);
38 SDL_FreeSurface(tmp);
39 }
40 void Draw()
41 {
42
43 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
44 glLoadIdentity();
45 glScaled(1.0f/10,1.0f/10,1.0f/10);
46
47 glRotatef(xrot,1.0f,0.0f,0.0f);
48 glRotatef(yrot,0.0f,1.0f,0.0f);
49 glRotatef(zrot,0.0f,0.0f,1.0f);
50
51 glBindTexture(GL_TEXTURE_2D, texture);
52 glBegin(GL_QUADS);
53 glTexCoord2f(0.0f, 0.0f); glVertex3f(-3.0f, -3.0f, 3.0f);
54 glTexCoord2f(1.0f, 0.0f); glVertex3f( 3.0f, -3.0f, 3.0f);
55 glTexCoord2f(1.0f, 1.0f); glVertex3f( 3.0f, 3.0f, 3.0f);
56 glTexCoord2f(0.0f, 1.0f); glVertex3f(-3.0f, 3.0f, 3.0f);
57
58 glTexCoord2f(1.0f, 0.0f); glVertex3f(-3.0f, -3.0f, -3.0f);
59 glTexCoord2f(1.0f, 1.0f); glVertex3f(-3.0f, 3.0f, -3.0f);
60 glTexCoord2f(0.0f, 1.0f); glVertex3f( 3.0f, 3.0f, -3.0f);
61 glTexCoord2f(0.0f, 0.0f); glVertex3f( 3.0f, -3.0f, -3.0f);
62
63 glTexCoord2f(0.0f, 1.0f); glVertex3f(-3.0f, 3.0f, -3.0f);
64 glTexCoord2f(0.0f, 0.0f); glVertex3f(-3.0f, 3.0f, 3.0f);
65 glTexCoord2f(1.0f, 0.0f); glVertex3f( 3.0f, 3.0f, 3.0f);
66 glTexCoord2f(1.0f, 1.0f); glVertex3f( 3.0f, 3.0f, -3.0f);
67
68 glTexCoord2f(1.0f, 1.0f); glVertex3f(-3.0f, -3.0f, -3.0f);
69 glTexCoord2f(0.0f, 1.0f); glVertex3f( 3.0f, -3.0f, -3.0f);
70 glTexCoord2f(0.0f, 0.0f); glVertex3f( 3.0f, -3.0f, 3.0f);
71 glTexCoord2f(1.0f, 0.0f); glVertex3f(-3.0f, -3.0f, 3.0f);
72
73 glTexCoord2f(1.0f, 0.0f); glVertex3f( 3.0f, -3.0f, -3.0f);
74 glTexCoord2f(1.0f, 1.0f); glVertex3f( 3.0f, 3.0f, -3.0f);
75 glTexCoord2f(0.0f, 1.0f); glVertex3f( 3.0f, 3.0f, 3.0f);
76 glTexCoord2f(0.0f, 0.0f); glVertex3f( 3.0f, -3.0f, 3.0f);
77
78 glTexCoord2f(0.0f, 0.0f); glVertex3f(-3.0f, -3.0f, -3.0f);
79 glTexCoord2f(1.0f, 0.0f); glVertex3f(-3.0f, -3.0f, 3.0f);
80 glTexCoord2f(1.0f, 1.0f); glVertex3f(-3.0f, 3.0f, 3.0f);
81 glTexCoord2f(0.0f, 1.0f); glVertex3f(-3.0f, 3.0f, -3.0f);
82 glEnd();
83
84 xrot+=0.3f;
85 yrot+=0.2f;
86 zrot+=0.4f;
87 SDL_GL_SwapWindow(window);
88 }
89 int main(int argc, char *argv[])
90 {
91 quit = false;
92 Init();
93 LoadImage();
94 while (!quit)
95 {
96 while(SDL_PollEvent(&sdlEvent))
97 {
98 if(sdlEvent.type == SDL_QUIT)
99 {
100 quit = true;
101 }
102 }
103 Draw();
104 SDL_Delay(16);
105 }
106 SDL_DestroyWindow(window);
107 window = NULL;
108 SDL_Quit();
109 return 0;
110 }