Advertisement
thecplusplusguy

OpenGL tutorial 23 - VBO 2

Jul 30th, 2012
1,957
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.25 KB | None | 0 0
  1. //http://www.youtube.com/user/thecplusplusguy
  2. #include <iostream>
  3. #include <SDL/SDL.h>
  4. #include <SDL/SDL_image.h>
  5. #include "GLee.h"
  6. #include <GL/gl.h>
  7. #include <GL/glu.h>
  8. #include "camera.h"
  9. #include <vector>
  10. #include <string>
  11. #include <fstream>
  12.  
  13. camera cam;
  14. //data->vertex->fragment
  15.  
  16. unsigned int loadTexture(const char* name)
  17. {
  18.     SDL_Surface* img=IMG_Load(name);
  19.     SDL_PixelFormat form={NULL,32,4,0,0,0,0,8,8,8,8,0xff000000,0x00ff0000,0x0000ff00,0x000000ff,0,255};
  20.     SDL_Surface* img2=SDL_ConvertSurface(img,&form,SDL_SWSURFACE);
  21.     unsigned int texture;
  22.     glGenTextures(1,&texture);
  23.     glBindTexture(GL_TEXTURE_2D,texture);
  24.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,img2->w,img2->h,0,GL_RGBA, GL_UNSIGNED_INT_8_8_8_8,img2->pixels);
  25.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  26.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  27.     SDL_FreeSurface(img);
  28.     SDL_FreeSurface(img2);
  29.     return texture;
  30. }
  31.  
  32.  
  33. void loadFile(const char* fn,std::string& str)
  34. {
  35.     std::ifstream in(fn);
  36.     if(!in.is_open())
  37.     {
  38.         std::cout << "The file " << fn << " cannot be opened\n";
  39.         return;
  40.     }
  41.     char tmp[300];
  42.     while(!in.eof())
  43.     {
  44.         in.getline(tmp,300);
  45.         str+=tmp;
  46.         str+='\n';
  47.     }
  48. }
  49.  
  50. unsigned int loadShader(std::string& source,unsigned int mode)
  51. {
  52.     unsigned int id;
  53.     id=glCreateShader(mode);
  54.    
  55.     const char* csource=source.c_str();
  56.    
  57.     glShaderSource(id,1,&csource,NULL);
  58.     glCompileShader(id);
  59.     char error[1000];
  60.     glGetShaderInfoLog(id,1000,NULL,error);
  61.     std::cout << "Compile status: \n" << error << std::endl;
  62.     return id;
  63. }
  64.  
  65. unsigned int vs,fs,program;
  66.  
  67. void initShader(const char* vname,const char* fname)
  68. {
  69.     std::string source;
  70.     loadFile(vname,source);
  71.     vs=loadShader(source,GL_VERTEX_SHADER);
  72.     source="";
  73.     loadFile(fname,source);
  74.     fs=loadShader(source,GL_FRAGMENT_SHADER);
  75.    
  76.     program=glCreateProgram();
  77.     glAttachShader(program,vs);
  78.     glAttachShader(program,fs);
  79.    
  80.     glLinkProgram(program);
  81.     glUseProgram(program);
  82. }
  83.  
  84. void clean()
  85. {
  86.     glDetachShader(program,vs);
  87.     glDetachShader(program,fs);
  88.     glDeleteShader(vs);
  89.     glDeleteShader(fs);
  90.     glDeleteProgram(program);
  91. }
  92.  
  93. unsigned int buffer;
  94. unsigned int img;
  95.  
  96. void init()
  97. {
  98.     glClearColor(0,0,0,1);
  99.     glMatrixMode(GL_PROJECTION);
  100.         glLoadIdentity();
  101.         gluPerspective(50,640.0/480.0,1,1000);
  102.     glMatrixMode(GL_MODELVIEW);
  103.     glEnable(GL_DEPTH_TEST);
  104.     initShader("vertex.vs","fragment.frag");
  105.    
  106.     float tri[]={-2,2,-4,1,0,0,0,1,
  107.                          -2,-2,-4,0,1,0,0,0,
  108.                          2,-2,-4,0,0,1,1,0,
  109.                          2,2,-4,0,0,1,1,1};
  110.     glGenBuffers(1,&buffer);
  111.     glBindBuffer(GL_ARRAY_BUFFER,buffer);
  112.     glBufferData(GL_ARRAY_BUFFER,sizeof(tri),tri,GL_STATIC_DRAW);
  113.     glActiveTexture(GL_TEXTURE0);
  114.     img=loadTexture("img.jpg");
  115.    
  116. }
  117.  
  118. void display()
  119. {
  120.     glLoadIdentity();
  121.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  122.     cam.Control();
  123.     cam.UpdateCamera();
  124.    
  125.     glUniform3f(glGetUniformLocation(program,"color"),0.6,1.0,0.4);
  126.    
  127.     int index1=glGetAttribLocation(program,"vertex");
  128.     int index2=glGetAttribLocation(program,"inputcolor");
  129.     int index3=glGetAttribLocation(program,"inputcolor2");
  130.     glBindTexture(GL_TEXTURE_2D,img);
  131.     glUniform1i(glGetUniformLocation(program,"img"),0);
  132.    
  133.     glEnableVertexAttribArray(index1);
  134.     glVertexAttribPointer(index1,3,GL_FLOAT,GL_FALSE,8*sizeof(float),0);
  135.    
  136.     glEnableVertexAttribArray(index2);
  137.     glVertexAttribPointer(index2,3,GL_FLOAT,GL_FALSE,8*sizeof(float),(void*)(3*sizeof(float)));
  138.    
  139.     glEnableVertexAttribArray(index3);
  140.     glVertexAttribPointer(index3,2,GL_FLOAT,GL_FALSE,8*sizeof(float),(void*)(6*sizeof(float)));
  141.    
  142.     glDrawArrays(GL_QUADS,0,4);
  143. }
  144.  
  145. int main()
  146. {
  147.     SDL_Init(SDL_INIT_EVERYTHING);
  148.     SDL_SetVideoMode(640,480,32,SDL_OPENGL);
  149.     Uint32 start;
  150.     SDL_Event event;
  151.     bool running=true;
  152.     init();
  153.     bool b=false;
  154.     while(running)
  155.     {
  156.         start=SDL_GetTicks();
  157.         while(SDL_PollEvent(&event))
  158.         {
  159.             switch(event.type)
  160.             {
  161.                 case SDL_QUIT:
  162.                     running=false;
  163.                     break;
  164.                 case SDL_KEYDOWN:
  165.                     switch(event.key.keysym.sym)
  166.                     {
  167.                         case SDLK_ESCAPE:
  168.                             running=false;
  169.                             break;
  170.                     }
  171.                     break;
  172.                 case SDL_MOUSEBUTTONDOWN:
  173.                     cam.mouseIn(true);
  174.                     break;
  175.                    
  176.             }
  177.         }
  178.         display();
  179.         SDL_GL_SwapBuffers();
  180.         if(1000.0/30>SDL_GetTicks()-start)
  181.             SDL_Delay(1000.0/30-(SDL_GetTicks()-start));
  182.     }
  183.     clean();
  184.     SDL_Quit();
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement