Advertisement
thecplusplusguy

GLSL tutorial 3 - texturing - main.cpp

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