Advertisement
ZeLiBoBaS

ShadersPassColor

May 24th, 2015
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.21 KB | None | 0 0
  1.  
  2. #define GLFW_INCLUDE_GLCOREARB      // сообщаем, что хотим использовать Core функционал
  3.  
  4. #include <iostream>
  5. #include <GLFW/glfw3.h>
  6.  
  7. using namespace std;
  8.  
  9.  
  10. /* выполняется, если произошла ошибка в работе GLFW */
  11. void errorCallback(int errorCode, const char* errorDescription);
  12.  
  13. /* начальные установки для OpenGL */
  14. void setupGL();
  15.  
  16. /* компилирует шейдер */
  17. GLuint compileShader(const GLchar ** source, GLenum type);
  18.  
  19. /* создает шейдерную программу */
  20. GLuint createProgram(const GLchar ** vertexShaderSource, const GLchar ** fragmentShaderSource);
  21.  
  22. /* генерирует и биндит Vertex Array Object */
  23. void generateAndBindVao();
  24.  
  25. /* прорисовывает объекты */
  26. void render();
  27.  
  28.  
  29. GLFWwindow *window = nullptr;           // указатель на объект окна
  30. int windowWidth = 500;                  // высота окна
  31. int windowHeight = 500;                 // ширина окна
  32. const char* title = "First Triangle";   // заглавие окна
  33. GLFWmonitor* monitor = nullptr;         // указатель на объект монитора
  34. GLFWwindow* share = nullptr;            // указатель на объект окна для совмесного использования
  35. const int logSize = 256;                // размер лога
  36. const float pointSize = 10.0f;          // размер отображаемой точки
  37.  
  38. const GLchar* vertexZeroSource[] =
  39. {
  40.     "#version 410                                               \n"
  41.     "                                                           \n"
  42.     "void main(void)                                            \n"
  43.     "{                                                          \n"
  44.     "   gl_Position = vec4(0.0, 0.0, 0.0, 1.0);                 \n"
  45.     "}                                                          \n"
  46. };
  47.  
  48. const GLchar* vertexTriangleSource[] =
  49. {
  50.     "#version 410                                               \n"
  51.     "                                                           \n"
  52.     "void main(void)                                            \n"
  53.     "{                                                          \n"
  54.     "   switch (gl_VertexID)                                    \n"
  55.     "   {                                                       \n"
  56.     "       case 0:                                             \n"
  57.     "           gl_Position = vec4(0.0, 0.5, 0.0, 1.0);         \n"
  58.     "           break;                                          \n"
  59.     "       case 1:                                             \n"
  60.     "           gl_Position = vec4(0.5, -0.4, 0.0, 1.0);        \n"
  61.     "           break;                                          \n"
  62.     "       case 2:                                             \n"
  63.     "           gl_Position = vec4(-0.5, -0.4, 0.0, 1.0);       \n"
  64.     "           break;                                          \n"
  65.     "   }                                                       \n"
  66.     "                                                           \n"
  67.     "}                                                          \n"
  68. };
  69.  
  70. const GLchar* vertexTriangleColorSource[] =
  71. {
  72.     "#version 410                                               \n"
  73.     "                                                           \n"
  74.     "out vec4 colorFromVertex;                                  \n"
  75.     "                                                           \n"
  76.     "void main(void)                                            \n"
  77.     "{                                                          \n"
  78.     "   switch (gl_VertexID)                                    \n"
  79.     "   {                                                       \n"
  80.     "       case 0:                                             \n"
  81.     "           gl_Position = vec4(0.0, 0.5, 0.0, 1.0);         \n"
  82.     "           colorFromVertex = vec4(1.0, 0.0, 0.0, 1.0);     \n"
  83.     "           break;                                          \n"
  84.     "       case 1:                                             \n"
  85.     "           gl_Position = vec4(0.5, -0.4, 0.0, 1.0);        \n"
  86.     "           colorFromVertex = vec4(0.0, 1.0, 0.0, 1.0);     \n"
  87.     "           break;                                          \n"
  88.     "       case 2:                                             \n"
  89.     "           gl_Position = vec4(-0.5, -0.4, 0.0, 1.0);       \n"
  90.     "           colorFromVertex = vec4(0.0, 0.0, 1.0, 1.0);     \n"
  91.     "           break;                                          \n"
  92.     "   }                                                       \n"
  93.     "}                                                          \n"
  94. };
  95.  
  96. const GLchar* fragmentColorSource[] =
  97. {
  98.     "#version 410                                               \n"
  99.     "                                                           \n"
  100.     "in vec4 colorFromVertex;                                   \n"
  101.     "                                                           \n"
  102.     "out vec4 color;                                            \n"
  103.     "                                                           \n"
  104.     "void main(void)                                            \n"
  105.     "{                                                          \n"
  106.     "   color = colorFromVertex;                                \n"
  107.     "}                                                          \n"
  108. };
  109.  
  110. const GLchar* fragmentWhiteSource[] =
  111. {
  112.     "#version 410                                               \n"
  113.     "                                                           \n"
  114.     "out vec4 color;                                            \n"
  115.     "                                                           \n"
  116.     "void main(void)                                            \n"
  117.     "{                                                          \n"
  118.     "   color = vec4(1.0, 1.0, 1.0, 1.0);                       \n"
  119.     "}                                                          \n"
  120. };
  121.  
  122. int main(int argc, const char * argv[])
  123. {
  124.     /* регистрируем колбек для вывода ошибок */
  125.     glfwSetErrorCallback(errorCallback);
  126.    
  127.     /* инициализация GLFW */
  128.     if(!glfwInit())
  129.     {
  130.         /* завершаем приложение с неудачный статусом выполнения,
  131.          если не удалось инициализировать GLFW */
  132.         exit(EXIT_FAILURE);
  133.     }
  134.    
  135.     /* подсказки для GLFW */
  136.     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);                  // какую версию OpenGL использовать
  137.     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);                  // младшая версия
  138.     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  // какой профиль использовать (Core Profile или Compatibility Profile)
  139.     glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);            // использовать ли Forward Compatibility
  140.    
  141.     /* пытаемся создать объект окна */
  142.     window = glfwCreateWindow(windowWidth, windowHeight, title, monitor, share);
  143.    
  144.     if(!window)
  145.     {
  146.         /* завершаем работу GLFW */
  147.         glfwTerminate();
  148.        
  149.         /* выход из программы с неудачный статусом выполнения */
  150.         exit(EXIT_FAILURE);
  151.     }
  152.    
  153.     /* делаем начальные настройки */
  154.     setupGL();
  155.    
  156.     /* основной цикл приложения, выполняется пока окно не будет закрыто */
  157.     while(!glfwWindowShouldClose(window))
  158.     {
  159.         /* прорисовываем объекты */
  160.         render();
  161.        
  162.         /* меняем местами передний и задний буфферы */
  163.         glfwSwapBuffers(window);
  164.        
  165.         /* опрос событий */
  166.         glfwPollEvents();
  167.     }
  168.    
  169.     /* завершаем работу GLFW */
  170.     glfwTerminate();
  171.    
  172.     /* выход из программы с удачный статусом выполнения */
  173.     exit(EXIT_SUCCESS);
  174. }
  175.  
  176. void errorCallback(int errorCode, const char* errorDescription)
  177. {
  178.     /* вывод сообщения ошибки в поток ошибок */
  179.     fputs(errorDescription, stderr);
  180.     fputs("\n", stderr);
  181. }
  182.  
  183. void setupGL()
  184. {
  185.     /* устанавливаем размер точки */
  186.     glPointSize(pointSize);
  187.  
  188.     /* устанавливаем цвет очистки экнана */
  189.     glClearColor(0.5f,0.5f,0.5f,1.0f);
  190.    
  191.     /* создаем шейдернуую программу */
  192.     GLuint program = createProgram(vertexTriangleColorSource, fragmentColorSource);
  193.    
  194.     /* используем созданную программу */
  195.     glUseProgram(program);
  196.    
  197.     /* генерируем и биндим VAO */
  198.     generateAndBindVao();
  199. }
  200.  
  201. void compileShader(const GLuint shader, const GLchar ** source)
  202. {
  203.     /* указываем исходник для шейдера */
  204.     glShaderSource(shader, 1, source, NULL);
  205.    
  206.     /* компилируем шейдер */
  207.     glCompileShader(shader);
  208.    
  209.     GLint status;        // статус компиляции
  210.     GLchar log[logSize];    // лог компиляции
  211.    
  212.     /* получаем статус компиляции шейдера */
  213.     glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
  214.    
  215.     /* проверяем статус компиляции */
  216.     if (status == GL_FALSE)
  217.     {
  218.         /* если компиляция не удалась, то выводим сообщение об ошибку */
  219.         fputs("ERROR: Program compiling failed!", stderr);
  220.         fputs("\n", stderr);
  221.     }
  222.    
  223.     /* получаем лог шейдера */
  224.     glGetShaderInfoLog(shader, logSize, NULL, log);
  225.    
  226.     /* выводим лог */
  227.     fputs(log, stdout);
  228. }
  229.  
  230. GLuint createProgram(const GLchar ** vertexShaderSource, const GLchar ** fragmentShaderSource)
  231. {
  232.     /* создаем вершинный и фрагментный шейдеры */
  233.     GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  234.     GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  235.    
  236.     /* компилируем вершинный и фрагментный шейдеры */
  237.     compileShader(vertexShader, vertexShaderSource);
  238.     compileShader(fragmentShader, fragmentShaderSource);
  239.    
  240.     /* создаем шейдерную программу */
  241.     GLuint program = glCreateProgram();
  242.    
  243.     /* прикрепляем шейдеры к программе */
  244.     glAttachShader(program, vertexShader);
  245.     glAttachShader(program, fragmentShader);
  246.    
  247.     /* линкуем программу */
  248.     glLinkProgram(program);
  249.    
  250.     GLint status;        // статус линковки
  251.     GLchar log[logSize];    // лог линковки
  252.    
  253.     /* получаем статус линковки шейдера */
  254.     glGetProgramiv(program, GL_LINK_STATUS, &status);
  255.    
  256.     /* проверяем статус линковки */
  257.     if (status == GL_FALSE)
  258.     {
  259.         /* если линковка не удалась, то выводим сообщение об ошибку */
  260.         fputs("ERROR: Program linking failed!", stderr);
  261.         fputs("\n", stderr);
  262.     }
  263.    
  264.     /* получаем лог программы */
  265.     glGetProgramInfoLog(program, logSize, NULL, log);
  266.    
  267.     /* выводим лог */
  268.     fputs(log, stderr);
  269.    
  270.     /* удаляем шейдеры */
  271.     glDeleteShader(vertexShader);
  272.     glDeleteShader(fragmentShader);
  273.    
  274.     return program;
  275. }
  276.  
  277. void generateAndBindVao()
  278. {
  279.     GLuint vao; // Vartex Array Object
  280.    
  281.     /* генерируем VAO */
  282.     glGenVertexArrays(1, &vao);
  283.    
  284.     /* биндим VAO */
  285.     glBindVertexArray(vao);
  286. }
  287.  
  288. void render()
  289. {
  290.     /* очищаем буффер цвета */
  291.     glClear(GL_COLOR_BUFFER_BIT);
  292.    
  293.     /* прорисовываем объект */
  294.     glDrawArrays(GL_TRIANGLES, 0, 3);
  295. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement