fork(1) download
  1. /*http://e...content-available-to-author-only...e.ru, Flashhell*/
  2.  
  3. #include <GL/glew.h>
  4. #include <GL/glut.h>
  5.  
  6. #include <iostream>
  7.  
  8. // ! Переменные с индентификаторами ID
  9. // ! ID шейдерной программы
  10. GLuint Program;
  11. // ! ID атрибута
  12. GLint Attrib_vertex;
  13. // ! ID юниформ переменной цвета
  14. GLint Unif_color;
  15. // ! ID Vertex Buffer Object
  16. GLuint VBO;
  17.  
  18. // ! Вершина
  19. struct vertex
  20. {
  21. GLfloat x;
  22. GLfloat y;
  23. };
  24.  
  25. // ! Функция печати лога шейдера
  26. void shaderLog(unsigned int shader)
  27. {
  28. int infologLen = 0;
  29. int charsWritten = 0;
  30. char *infoLog;
  31.  
  32. glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infologLen);
  33.  
  34. if(infologLen > 1)
  35. {
  36. infoLog = new char[infologLen];
  37. if(infoLog == NULL)
  38. {
  39. std::cout<<"ERROR: Could not allocate InfoLog buffer\n";
  40. exit(1);
  41. }
  42. glGetShaderInfoLog(shader, infologLen, &charsWritten, infoLog);
  43. std::cout<< "InfoLog: " << infoLog << "\n\n\n";
  44. delete[] infoLog;
  45. }
  46. }
  47.  
  48. // ! Инициализация OpenGL (по минимуму)
  49. void initGL()
  50. {
  51. glClearColor(0, 0, 0, 0);
  52. }
  53.  
  54. // ! Проверка ошибок OpenGL, если есть, то вывод в консоль типа ошибки
  55. void checkOpenGLerror()
  56. {
  57. GLenum errCode;
  58. if((errCode=glGetError()) != GL_NO_ERROR)
  59. std::cout << "OpenGl error! - " << gluErrorString(errCode);
  60. }
  61.  
  62. // ! Инициализация шейдеров
  63. void initShader()
  64. {
  65. //! Исходный код шейдеров
  66. const char* vsSource =
  67. "attribute vec2 coord;\n"
  68. "void main() {\n"
  69. " gl_Position = vec4(coord, 0.0, 1.0);\n"
  70. "}\n";
  71. const char* fsSource =
  72. "uniform vec4 color;\n"
  73. "void main() {\n"
  74. " gl_FragColor = color;\n"
  75. "}\n";
  76. // ! Переменные для хранения идентификаторов шейдеров
  77. GLuint vShader, fShader;
  78.  
  79. // ! Создаем вершинный шейдер
  80. vShader = glCreateShader(GL_VERTEX_SHADER);
  81. // ! Передаем исходный код
  82. glShaderSource(vShader, 1, &vsSource, NULL);
  83. // ! Компилируем шейдер
  84. glCompileShader(vShader);
  85.  
  86. std::cout << "vertex shader \n";
  87. shaderLog(vShader);
  88.  
  89. // ! Создаем фрагментный шейдер
  90. fShader = glCreateShader(GL_FRAGMENT_SHADER);
  91. // ! Передаем исходный код
  92. glShaderSource(fShader, 1, &fsSource, NULL);
  93. // ! Компилируем шейдер
  94. glCompileShader(fShader);
  95.  
  96. std::cout << "fragment shader \n";
  97. shaderLog(fShader);
  98.  
  99. // ! Создаем программу и прикрепляем шейдеры к ней
  100. Program = glCreateProgram();
  101. glAttachShader(Program, vShader);
  102. glAttachShader(Program, fShader);
  103.  
  104. // ! Линкуем шейдерную программу
  105. glLinkProgram(Program);
  106.  
  107. // ! Проверяем статус сборки
  108. int link_ok;
  109. glGetProgramiv(Program, GL_LINK_STATUS, &link_ok);
  110. if(!link_ok)
  111. {
  112. std::cout << "error attach shaders \n";
  113. return;
  114. }
  115. // /! Вытягиваем ID атрибута из собранной программы
  116. const char* attr_name = "coord";
  117. Attrib_vertex = glGetAttribLocation(Program, attr_name);
  118. if(Attrib_vertex == -1)
  119. {
  120. std::cout << "could not bind attrib " << attr_name << std::endl;
  121. return;
  122. }
  123. // ! Вытягиваем ID юниформ
  124. const char* unif_name = "color";
  125. Unif_color = glGetUniformLocation(Program, unif_name);
  126. if(Unif_color == -1)
  127. {
  128. std::cout << "could not bind uniform " << unif_name << std::endl;
  129. return;
  130. }
  131.  
  132. checkOpenGLerror();
  133. }
  134.  
  135. // ! Инициализация VBO
  136. void initVBO()
  137. {
  138. glGenBuffers(1, &VBO);
  139. glBindBuffer(GL_ARRAY_BUFFER, VBO);
  140. // ! Вершины нашего треугольника
  141. vertex triangle[3] = {
  142. {-1.0f,-1.0f},
  143. { 0.0f, 1.0f},
  144. { 1.0f,-1.0f}
  145. };
  146. //! Передаем вершины в буфер
  147. glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW);
  148.  
  149. checkOpenGLerror();
  150. }
  151.  
  152. // ! Освобождение шейдеров
  153. void freeShader()
  154. {
  155. // ! Передавая ноль, мы отключаем шейдрную программу
  156. glUseProgram(0);
  157. // ! Удаляем шейдерную программу
  158. glDeleteProgram(Program);
  159. }
  160.  
  161. // ! Освобождение шейдеров
  162. void freeVBO()
  163. {
  164. glBindBuffer(GL_ARRAY_BUFFER, 0);
  165. glDeleteBuffers(1, &VBO);
  166. }
  167.  
  168. void resizeWindow(int width, int height)
  169. {
  170. glViewport(0, 0, width, height);
  171. }
  172.  
  173. //! Отрисовка
  174. void render()
  175. {
  176. glClear(GL_COLOR_BUFFER_BIT);
  177. // ! Устанавливаем шейдерную программу текущей
  178. glUseProgram(Program);
  179.  
  180. static float red[4] = {1.0f, 0.0f, 0.0f, 1.0f};
  181. // ! Передаем юниформ в шейдер
  182. glUniform4fv(Unif_color, 1, red);
  183.  
  184. // ! Включаем массив атрибутов
  185. glEnableVertexAttribArray(Attrib_vertex);
  186. // ! Подключаем VBO
  187. glBindBuffer(GL_ARRAY_BUFFER, VBO);
  188. // ! Указывая pointer 0 при подключенном буфере, мы указываем, что данные представлены в VBO
  189. glVertexAttribPointer(Attrib_vertex, 2, GL_FLOAT, GL_FALSE, 0, 0);
  190. // ! Отключаем VBO
  191. glBindBuffer(GL_ARRAY_BUFFER, 0);
  192. // ! Передаем данные на видеокарту (рисуем)
  193. glDrawArrays(GL_TRIANGLES, 0, sizeof (vertex));
  194.  
  195. // ! Отключаем массив атрибутов
  196. glDisableVertexAttribArray(Attrib_vertex);
  197.  
  198. // ! Отключаем шейдерную программу
  199. glUseProgram(0);
  200.  
  201. checkOpenGLerror();
  202.  
  203. glutSwapBuffers();
  204. }
  205.  
  206. int main( int argc, char **argv )
  207. {
  208. glutInit(&argc, argv);
  209. glutInitDisplayMode(GLUT_RGBA | GLUT_ALPHA | GLUT_DOUBLE);
  210. glutInitWindowSize(800, 600);
  211. glutCreateWindow("Simple shaders");
  212.  
  213. // ! Обязательно перед инициализации шейдеров
  214. GLenum glew_status = glewInit();
  215. if(GLEW_OK != glew_status)
  216. {
  217. // ! GLEW не проинициализировалась
  218. std::cout << "Error: " << glewGetErrorString(glew_status) << "\n";
  219. return 1;
  220. }
  221.  
  222. // ! Проверяем доступность OpenGL 2.0
  223. if(!GLEW_VERSION_2_0)
  224. {
  225. // ! OpenGl 2.0 оказалась не доступна
  226. std::cout << "No support for OpenGL 2.0 found\n";
  227. return 1;
  228. }
  229.  
  230. // ! Инициализация
  231. initGL();
  232. initVBO();
  233. initShader();
  234.  
  235. glutReshapeFunc(resizeWindow);
  236. glutDisplayFunc(render);
  237. glutMainLoop();
  238.  
  239. // ! Освобождение ресурсов
  240. freeShader();
  241. freeVBO();
  242. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp:3:21: fatal error: GL/glew.h: No such file or directory
 #include <GL/glew.h>
                     ^
compilation terminated.
stdout
Standard output is empty