Guest User

open.gl tutorials #3 drawing GLFW code

a guest
Oct 23rd, 2013
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.60 KB | None | 0 0
  1.  
  2. // Link statically with GLEW
  3. #define GLEW_STATIC
  4.  
  5. // Headers
  6. #include <GL/glew.h>
  7. #include <GLFW/glfw3.h>
  8. #include <iostream>
  9.  
  10. // Shader sources
  11. const GLchar* vertexSource =
  12.     "#version 150 core\n"
  13.     "in vec2 position;"
  14.     "in vec3 color;"
  15.     "out vec3 Color;"
  16.     "void main() {"
  17.     "   Color = color;"
  18.     "   gl_Position = vec4(position, 0.0, 1.0);"
  19.     "}";
  20. const GLchar* fragmentSource =
  21.     "#version 150 core\n"
  22.     "in vec3 Color;"
  23.     "out vec4 outColor;"
  24.     "void main() {"
  25.     "   outColor = vec4(Color, 1.0);"
  26.     "}";
  27.  
  28. int main(int argc, char* argv[])
  29. {
  30.     glfwInit();
  31.     GLFWwindow* window = glfwCreateWindow(640, 480, "OpenGL", NULL, NULL);
  32.     glfwMakeContextCurrent(window);
  33.  
  34.     // Initialize GLEW
  35.     glewExperimental = GL_TRUE;
  36.     glewInit();
  37.  
  38.     // Create Vertex Array Object
  39.     GLuint vao;
  40.     glGenVertexArrays(1, &vao);
  41.     glBindVertexArray(vao);
  42.  
  43.     // Create a Vertex Buffer Object and copy the vertex data to it
  44.     GLuint vbo;
  45.     glGenBuffers(1, &vbo);
  46.  
  47.     GLfloat vertices[] = {
  48.         -0.5f,  0.5f, 1.0f, 0.0f, 0.0f, // Top-left
  49.          0.5f,  0.5f, 0.0f, 1.0f, 0.0f, // Top-right
  50.          0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // Bottom-right
  51.         -0.5f, -0.5f, 1.0f, 1.0f, 1.0f  // Bottom-left
  52.     };
  53.  
  54.     glBindBuffer(GL_ARRAY_BUFFER, vbo);
  55.     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
  56.  
  57.     // Create an element array
  58.     GLuint ebo;
  59.     glGenBuffers(1, &ebo);
  60.  
  61.     GLuint elements[] = {
  62.         0, 1, 2,
  63.         2, 3, 0
  64.     };
  65.  
  66.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
  67.     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);
  68.  
  69.     // Create and compile the vertex shader
  70.     GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  71.     glShaderSource(vertexShader, 1, &vertexSource, NULL);
  72.     glCompileShader(vertexShader);
  73.  
  74.     // Create and compile the fragment shader
  75.     GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  76.     glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
  77.     glCompileShader(fragmentShader);
  78.  
  79.     // Link the vertex and fragment shader into a shader program
  80.     GLuint shaderProgram = glCreateProgram();
  81.     glAttachShader(shaderProgram, vertexShader);
  82.     glAttachShader(shaderProgram, fragmentShader);
  83.     glBindFragDataLocation(shaderProgram, 0, "outColor");
  84.     glLinkProgram(shaderProgram);
  85.     glUseProgram(shaderProgram);
  86.  
  87.     // Specify the layout of the vertex data
  88.     GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
  89.     glEnableVertexAttribArray(posAttrib);
  90.     glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), 0);
  91.  
  92.     GLint colAttrib = glGetAttribLocation(shaderProgram, "color");
  93.     glEnableVertexAttribArray(colAttrib);
  94.     glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (void*)(2 * sizeof(GLfloat)));
  95.  
  96.     while(!glfwWindowShouldClose(window))
  97.     {
  98.         if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
  99.             glfwSetWindowShouldClose(window, GL_TRUE);
  100.  
  101.         glfwSwapBuffers(window);
  102.         glfwPollEvents();
  103.  
  104.  
  105.         // Clear the screen to black
  106.         glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  107.         glClear(GL_COLOR_BUFFER_BIT);
  108.  
  109.         // Draw a rectangle from the 2 triangles using 6 indices
  110.         glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
  111.  
  112.         // Swap buffers
  113.  
  114. }
  115.     glDeleteProgram(shaderProgram);
  116.     glDeleteShader(fragmentShader);
  117.     glDeleteShader(vertexShader);
  118.  
  119.     glDeleteBuffers(1, &ebo);
  120.     glDeleteBuffers(1, &vbo);
  121.  
  122.     glDeleteVertexArrays(1, &vao);
  123. }
Advertisement
Add Comment
Please, Sign In to add comment