Advertisement
thecplusplusguy

GLSL tutorial 4 - main.cpp

Aug 3rd, 2012
1,601
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.67 KB | None | 0 0
  1. //http://www.youtube.com/user/thecplusplusguy
  2. //GLSL tutorial - per-fragment (per-pixel lighting)
  3. //main.cpp
  4. #include <iostream>
  5. #include <SDL/SDL.h>
  6. #include <SDL/SDL_image.h>
  7. #include "GLee.h"
  8. #include <GL/gl.h>
  9. #include <GL/glu.h>
  10. #include "camera.h"
  11. #include <vector>
  12. #include <string>
  13. #include <fstream>
  14. //#include "objloader.h"
  15. float angle=0.0;
  16. camera cam;
  17. //objloader obj;
  18. //data->vertex->fragment
  19.  
  20. void loadFile(const char* fn,std::string& str)
  21. {
  22.     std::ifstream in(fn);
  23.     if(!in.is_open())
  24.     {
  25.         std::cout << "The file " << fn << " cannot be opened\n";
  26.         return;
  27.     }
  28.     char tmp[300];
  29.     while(!in.eof())
  30.     {
  31.         in.getline(tmp,300);
  32.         str+=tmp;
  33.         str+='\n';
  34.     }
  35. }
  36.  
  37. unsigned int loadShader(std::string& source,unsigned int mode)
  38. {
  39.     unsigned int id;
  40.     id=glCreateShader(mode);
  41.    
  42.     const char* csource=source.c_str();
  43.    
  44.     glShaderSource(id,1,&csource,NULL);
  45.     glCompileShader(id);
  46.     char error[1000];
  47.     glGetShaderInfoLog(id,1000,NULL,error);
  48.     std::cout << "Compile status: \n" << error << std::endl;
  49.     return id;
  50. }
  51.  
  52. unsigned int vs,fs,program;
  53.  
  54. void initShader(const char* vname,const char* fname)
  55. {
  56.     std::string source;
  57.     loadFile(vname,source);
  58.     vs=loadShader(source,GL_VERTEX_SHADER);
  59.     source="";
  60.     loadFile(fname,source);
  61.     fs=loadShader(source,GL_FRAGMENT_SHADER);
  62.    
  63.     program=glCreateProgram();
  64.     glAttachShader(program,vs);
  65.     glAttachShader(program,fs);
  66.    
  67.     glLinkProgram(program);
  68.     glUseProgram(program);
  69. }
  70.  
  71. void clean()
  72. {
  73.     glDetachShader(program,vs);
  74.     glDetachShader(program,fs);
  75.     glDeleteShader(vs);
  76.     glDeleteShader(fs);
  77.     glDeleteProgram(program);
  78. }
  79.  
  80. unsigned int loadTexture(const char* filename)
  81. {
  82.     unsigned int num;
  83.     glGenTextures(1,&num);
  84.     SDL_Surface* img=IMG_Load(filename);
  85.     if(img==NULL)
  86.     {
  87.         std::cout << "img was not loaded" << std::endl;
  88.         return -1;
  89.     }
  90.     SDL_PixelFormat form={NULL,32,4,0,0,0,0,0,0,0,0,0xff000000,0x00ff0000,0x0000ff00,0x000000ff,0,255};
  91.     SDL_Surface* img2=SDL_ConvertSurface(img,&form,SDL_SWSURFACE);
  92.     if(img2==NULL)
  93.     {
  94.         std::cout << "img2 was not loaded" << std::endl;
  95.         return -1;     
  96.     }
  97.     glBindTexture(GL_TEXTURE_2D,num);      
  98.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  99.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  100.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,img2->w,img2->h,0,GL_RGBA,GL_UNSIGNED_INT_8_8_8_8,img2->pixels);      
  101.     SDL_FreeSurface(img);
  102.     SDL_FreeSurface(img2);
  103.     return num;
  104. }
  105.  
  106. unsigned int myImg,myImg2/*,monkey*/;
  107.  
  108. void init()
  109. {
  110.     glClearColor(0,0,0,1);
  111.     glMatrixMode(GL_PROJECTION);
  112.         glLoadIdentity();
  113.         gluPerspective(50,640.0/480.0,1,1000);
  114.     glMatrixMode(GL_MODELVIEW);
  115.     glEnable(GL_DEPTH_TEST);
  116.     initShader("vertex.vs","fragment.frag");
  117.     myImg=loadTexture("brick.jpg");
  118.     myImg2=loadTexture("concrete.jpg");
  119.     //monkey=obj.load("monkey.obj");
  120. }
  121.  
  122. void display()
  123. {
  124.     glLoadIdentity();
  125.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  126.     cam.Control();
  127.     cam.UpdateCamera();
  128.     angle+=3.0;
  129.     if(angle>=360)
  130.         angle-=360;
  131.    
  132.     glUniform3f(glGetUniformLocation(program,"lightPos"),0.0,0.0,0.0);  //light position (is the same as the player position)
  133.    
  134.     glUniform3f(glGetUniformLocation(program,"mambient"),0.2,0.2,0.2);  //setting the material property
  135.     glUniform3f(glGetUniformLocation(program,"mdiffuse"),0.6,0.6,0.6);
  136.     glUniform3f(glGetUniformLocation(program,"mspecular"),1.0,1.0,1.0);
  137.    
  138.     glUniform3f(glGetUniformLocation(program,"lambient"),0.2,0.2,0.2);  //setting light property
  139.     glUniform3f(glGetUniformLocation(program,"ldiffuse"),0.6,0.6,0.6);
  140.     glUniform3f(glGetUniformLocation(program,"lspecular"),1.0,1.0,1.0);
  141.        
  142.     glUniform1f(glGetUniformLocation(program,"shininess"),32.0);    //shininess
  143.    
  144. //  glRotatef(angle,0,1,0);
  145. //  glCallList(monkey);
  146. // /*
  147.     glBegin(GL_QUADS);
  148.         glNormal3f(0.0,0.0,1.0);
  149.         glTexCoord2f(1,0);      //gl_MultiTexCoord0
  150.         glVertex3f(-1,1,-4);    //gl_Vertex
  151.         glTexCoord2f(0,0);
  152.         glVertex3f(-1,-1,-4);
  153.         glTexCoord2f(0,1);
  154.         glVertex3f(1,-1,-4);
  155.         glTexCoord2f(1,1);
  156.         glVertex3f(1,1,-4);
  157.     glEnd();
  158. // */
  159. }
  160.  
  161. int main()
  162. {
  163.     SDL_Init(SDL_INIT_EVERYTHING);
  164.     SDL_SetVideoMode(640,480,32,SDL_OPENGL);
  165.     Uint32 start;
  166.     SDL_Event event;
  167.     bool running=true;
  168.     init();
  169.     bool b=false;
  170.     while(running)
  171.     {
  172.         start=SDL_GetTicks();
  173.         while(SDL_PollEvent(&event))
  174.         {
  175.             switch(event.type)
  176.             {
  177.                 case SDL_QUIT:
  178.                     running=false;
  179.                     break;
  180.                 case SDL_KEYDOWN:
  181.                     switch(event.key.keysym.sym)
  182.                     {
  183.                         case SDLK_ESCAPE:
  184.                             running=false;
  185.                             break;
  186.                     }
  187.                     break;
  188.                 case SDL_MOUSEBUTTONDOWN:
  189.                     cam.mouseIn(true);
  190.                     break;
  191.                    
  192.             }
  193.         }
  194.         display();
  195.         SDL_GL_SwapBuffers();
  196.         if(1000.0/30>SDL_GetTicks()-start)
  197.             SDL_Delay(1000.0/30-(SDL_GetTicks()-start));
  198.     }
  199.     clean();
  200.     SDL_Quit();
  201. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement