Advertisement
bekovski

shader cherno

Nov 22nd, 2017
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.08 KB | None | 0 0
  1. #include <GL/glew.h>
  2. #include <GLFW/glfw3.h>
  3.  
  4. #include <iostream>
  5.  
  6. static unsigned int compileShader(unsigned int type, const std::string& source) {
  7.     unsigned int id = glCreateShader(type);
  8.     const char* src = source.c_str();
  9.     glShaderSource(id, 1, &src, nullptr);
  10.     glCompileShader(id);
  11.  
  12.     // error handling
  13.     int result;
  14.     glGetShaderiv(id, GL_COMPILE_STATUS, &result);
  15.     if (result == GL_FALSE) {
  16.         int length;
  17.         glGetShaderiv(id, GL_INFO_LOG_LENGTH, &length);
  18.         char* message = (char*)alloca(length * sizeof(char));
  19.         glGetShaderInfoLog(id, length, &length, message);
  20.         std::cout << "Failed to compile " << ((type == GL_VERTEX_SHADER) ? "vertex" : "fragment") << " shader! " << std::endl;
  21.         std::cout << message << std::endl;
  22.         glDeleteShader(id);
  23.         return 0;
  24.     }
  25.  
  26.     return id;
  27. }
  28.  
  29. static unsigned int createShader(const std::string& vertexShader, const std::string& fragmentShader) {
  30.     unsigned int program = glCreateProgram();
  31.     unsigned int vs = compileShader(GL_VERTEX_SHADER, vertexShader);
  32.     unsigned int fs = compileShader(GL_FRAGMENT_SHADER, fragmentShader);
  33.  
  34.     glAttachShader(program, vs);
  35.     glAttachShader(program, fs);
  36.     glLinkProgram(program);
  37.     glValidateProgram(program);
  38.  
  39.     glDeleteShader(vs);
  40.     glDeleteShader(fs);
  41.  
  42.     return program;
  43. }
  44.  
  45. int main(void)
  46. {
  47.     GLFWwindow* window;
  48.  
  49.     /* Initialize the library */
  50.     if (!glfwInit())
  51.         return -1;
  52.  
  53.     /* Create a windowed mode window and its OpenGL context */
  54.     window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
  55.     if (!window)
  56.     {
  57.         glfwTerminate();
  58.         return -1;
  59.     }
  60.  
  61.     /* Make the window's context current */
  62.     glfwMakeContextCurrent(window);
  63.  
  64.     if (glewInit() != GLEW_OK) {
  65.         std::cout << "Error!" << std::endl;
  66.     }
  67.  
  68.     std::cout << glGetString(GL_VERSION) << std::endl;
  69.  
  70.     float positions[6] = {
  71.         -0.5f, -0.5f,
  72.          0.0f,  0.5f,
  73.          0.5f, -0.5f
  74.     };
  75.  
  76.     unsigned int buffer;
  77.     glGenBuffers(1, &buffer);
  78.     glBindBuffer(GL_ARRAY_BUFFER, buffer);
  79.     glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);
  80.  
  81.     glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);
  82.     glEnableVertexAttribArray(0);
  83.  
  84.     std::string vertexShader =
  85.         "#version 330 core\n"
  86.         "\n"
  87.         "layout(location = 0) in vec4 position;\n"
  88.         "\n"
  89.         "void main()\n"
  90.         "{\n"
  91.         "   gl_Position = position;\n"
  92.         "}\n;";
  93.  
  94.     std::string fragmentShader =
  95.         "#version 330 core\n"
  96.         "\n"
  97.         "layout(location = 0) out vec4 color;\n"
  98.         "\n"
  99.         "void main()\n"
  100.         "{\n"
  101.         "   color = vec4(1.0, 0.0, 0.0, 0.0);\n"
  102.         "}\n;";
  103.  
  104.     unsigned int shader = createShader(vertexShader, fragmentShader);
  105.     glUseProgram(shader);
  106.  
  107.     /* Loop until the user closes the window */
  108.     while (!glfwWindowShouldClose(window))
  109.     {
  110.         /* Render here */
  111.         glClear(GL_COLOR_BUFFER_BIT);
  112.  
  113.         /*
  114.         glBegin(GL_TRIANGLES);
  115.         glVertex2f(-0.5f, -0.5f);
  116.         glVertex2f( 0.0f,  0.5f);
  117.         glVertex2f( 0.5f, -0.5f);
  118.         glEnd();
  119.         */
  120.  
  121.         glDrawArrays(GL_TRIANGLES, 0, 3);
  122.  
  123.         /* Swap front and back buffers */
  124.         glfwSwapBuffers(window);
  125.  
  126.         /* Poll for and process events */
  127.         glfwPollEvents();
  128.     }
  129.  
  130.     glDeleteProgram(shader);
  131.  
  132.     glfwTerminate();
  133.     return 0;
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement