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  }

 

posted @ 2016-05-23 15:09  CodeMIRACLE  阅读(782)  评论(0编辑  收藏  举报