Abdulg

OpenGL boilerplate

Aug 10th, 2015
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.98 KB | None | 0 0
  1. #define GLEW_STATIC
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<fstream>
  5. #include<GL/glew.h>
  6. #include<GL/gl.h>
  7. #include <GL/glu.h>
  8. #include <GLFW/glfw3.h>
  9.  
  10. #define SCREENWIDTH 1920
  11. #define SCREENHEIGHT 1080
  12.  
  13. GLuint CompileShaderFromFile(char *File, GLenum Type)
  14. {
  15.     printf("Compiling shader ");
  16.     printf(File);
  17.     printf(":\n");
  18.  
  19.     std::ifstream Input(File);
  20.     std::string SourceString;
  21.  
  22.     if (!Input.is_open())
  23.         printf("Failed to load shader!\n");
  24.  
  25.     while (Input.good())
  26.     {
  27.         std::string CurrentLine;
  28.         std::getline(Input, CurrentLine);
  29.         SourceString.append(CurrentLine + "\n");
  30.     }
  31.  
  32.     GLuint Shader = glCreateShader(Type);
  33.     const char *Source = SourceString.c_str();
  34.     glShaderSource(Shader,1,&Source,NULL);
  35.     glCompileShader(Shader);
  36.  
  37.     GLint Test;
  38.     glGetShaderiv(Shader, GL_COMPILE_STATUS, &Test);
  39.     if(!Test)
  40.     {
  41.         char Buffer[512];
  42.         glGetShaderInfoLog(Shader, 512, NULL, Buffer);
  43.         printf("Failed to compile shader!\n");
  44.         printf(Buffer);
  45.         printf("-\n");
  46.         printf(Source);
  47.         printf("\n-\n");
  48.     }
  49.  
  50.     return Shader;
  51. }
  52.  
  53. GLuint CreateProgram(char *VertShader, char *FragShader)
  54. {
  55.     GLuint VertexShader = CompileShaderFromFile(VertShader, GL_VERTEX_SHADER);
  56.     GLuint FragmentShader = CompileShaderFromFile(FragShader, GL_FRAGMENT_SHADER);
  57.  
  58.     GLuint ShaderProgram = glCreateProgram();
  59.     glAttachShader(ShaderProgram, VertexShader);
  60.     glAttachShader(ShaderProgram, FragmentShader);
  61.     glDeleteProgram(VertexShader);
  62.     glDeleteProgram(FragmentShader);
  63.  
  64.     glLinkProgram(ShaderProgram);
  65.     glUseProgram(ShaderProgram);
  66.     return ShaderProgram;
  67. }
  68.  
  69. int main()
  70. {
  71.     glfwInit();
  72.  
  73.     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  74.     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
  75.     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  76.     glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
  77.  
  78.     glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
  79.  
  80.     GLFWwindow* Window = glfwCreateWindow(SCREENWIDTH, SCREENHEIGHT, "Prims", glfwGetPrimaryMonitor(), NULL);
  81.  
  82.     glfwMakeContextCurrent(Window);
  83.  
  84.     glewExperimental = GL_TRUE;
  85.     glewInit();
  86.  
  87.     GLfloat ScreenQuad [] =
  88.     {
  89.         1.0, 1.0,
  90.         -1.0, 1.0,
  91.         -1.0, -1.0,
  92.         1.0, -1.0
  93.     };
  94.  
  95.     GLuint Order [] =
  96.     {
  97.         0, 1, 2,
  98.         2, 3, 0
  99.     };
  100.  
  101.     GLuint VAO;
  102.     glGenVertexArrays (1, &VAO);
  103.     glBindVertexArray (VAO);
  104.  
  105.     GLuint VertexBuffer;
  106.     glGenBuffers(1, &VertexBuffer);
  107.     glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer);
  108.     glBufferData(GL_ARRAY_BUFFER, sizeof(ScreenQuad), ScreenQuad, GL_STATIC_DRAW);
  109.  
  110.     GLuint ElementBuffer;
  111.     glGenBuffers(1, &ElementBuffer);
  112.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ElementBuffer);
  113.     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Order), Order, GL_STATIC_DRAW);
  114.  
  115.     GLuint ShaderProgram = CreateProgram("VertexShader.vert", "FragmentShader.frag");
  116.  
  117.     GLint PositionAttribute = glGetAttribLocation(ShaderProgram, "Point");
  118.     glVertexAttribPointer(PositionAttribute, 2, GL_FLOAT, GL_FALSE, 0, 0);
  119.     glEnableVertexAttribArray(PositionAttribute);
  120.  
  121.     while (!glfwWindowShouldClose(Window))
  122.     {
  123.         glClear(GL_COLOR_BUFFER_BIT);
  124.         glBindVertexArray (VAO);
  125.  
  126.         glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
  127.  
  128.         glfwSwapBuffers(Window);
  129.         glfwPollEvents();
  130.  
  131.         if (glfwGetKey(Window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
  132.         {
  133.             glfwSetWindowShouldClose(Window, GL_TRUE);
  134.         }
  135.  
  136.         GLenum ErrorEnum = glGetError();
  137.         if (ErrorEnum != GL_NO_ERROR) printf("glGetError returned '%s'!\n", gluErrorString(ErrorEnum));
  138.     }
  139.  
  140.     glfwTerminate();
  141.     return 0;
  142. }
  143.  
  144. /* VertexShader.vert:
  145. #version 150
  146.  
  147. in vec2 Point;
  148.  
  149. void main()
  150. {
  151.     gl_Position = vec4(Point, 0.0, 1.0);
  152. }
  153.  
  154. FragmentShader.frag:
  155.  
  156. #version 150
  157.  
  158. out vec4 Colour;
  159.  
  160. void main()
  161. {
  162.     Colour = vec4(1.0, 1.0, 1.0, 1.0);
  163. }
  164. */
Advertisement
Add Comment
Please, Sign In to add comment