Advertisement
Guest User

Untitled

a guest
Dec 12th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.92 KB | None | 0 0
  1. #include "include/GL/glew.h"
  2. #include "include/GL/glut.h"
  3. #include <iostream>
  4. #include"include/GLM/GLM/glm.hpp"
  5. //using glm::mat4;
  6. //using glm::vec3;
  7.  
  8. #include"include/GLM/GLM/gtc/matrix_transform.hpp"
  9.  
  10. using  namespace glm;
  11.  
  12. float angle = 45.0f;
  13.  
  14. float orbit = 0.0f;
  15.  
  16. //! ID шейдерной программы
  17. GLuint Program;
  18.  
  19. //! ID Vertex Buffer Object
  20. GLuint uVAO,  uVBO[4];
  21.  
  22. void render();
  23. //! Вершина
  24. struct vertex
  25. {
  26.   GLfloat x;
  27.   GLfloat y;
  28.   GLfloat z;
  29. };
  30.  
  31. //! Функция печати лога шейдера
  32. void shaderLog(unsigned int shader)
  33. {
  34.   int   infologLen   = 0;
  35.   int   charsWritten = 0;
  36.   char *infoLog;
  37.  
  38.   glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infologLen);
  39.  
  40.   if(infologLen > 1)
  41.   {
  42.     infoLog = new char[infologLen];
  43.     if(infoLog == NULL)
  44.     {
  45.       std::cout<<"ERROR: Could not allocate InfoLog buffer\n";
  46.        exit(1);
  47.     }
  48.     glGetShaderInfoLog(shader, infologLen, &charsWritten, infoLog);
  49.     std::cout<< "InfoLog: " << infoLog << "\n\n\n";
  50.     delete[] infoLog;
  51.   }
  52. }
  53.  
  54. //! Инициализация OpenGL, здесь пока по минимальному=)
  55. void initGL()
  56. {
  57.   glClearColor(0, 0, 0, 0);
  58. }
  59.  
  60. //! Проверка ошибок OpenGL, если есть то выводит в консоль тип ошибки
  61. void checkOpenGLerror()
  62. {
  63.   GLenum errCode;
  64.   if((errCode=glGetError()) != GL_NO_ERROR)
  65.     std::cout << "OpenGl error! - " << gluErrorString(errCode);
  66. }
  67.  
  68. //! Инициализация шейдеров
  69. void initShader()
  70. {
  71.   //! Исходный код шейдеров
  72.     const char* vsSource =
  73.         "#version 330\n"
  74.         "uniform mat4 mWorld;"
  75.         "uniform mat4 mView;"
  76.         "uniform mat4 mProjection;\n "
  77.         "uniform vec3 vLightPos[3];\n"
  78.         "uniform vec3 vLightColor[3];\n"
  79.         "layout (location=0) in vec3 inPosition;\n"
  80.         "layout (location=1) in vec3 inColor;\n"
  81.         "layout (location=2) in vec3 inNormal;\n"
  82.         " out vec3 theColor;\n"
  83.         "void main() {\n"
  84.         "gl_Position = mProjection*mView*mWorld*vec4(inPosition*4.0f, 1.0);\n"
  85.         "vec3 color_tm=vec3(0.0);\n"
  86.         "for (int i=0; i<3; i++)\n"
  87.         "{ color_tm+=dot(normalize(inNormal),normalize(vec3(vLightPos[i] - inPosition)))*vLightColor[i] * 0.5;\n"
  88.         "}\n"
  89.         "theColor=color_tm;\n "
  90.     "}\n";
  91.     /*const char* vsSource =
  92.         "#version 330\n"
  93.         "uniform mat4 mWorld;"
  94.         "uniform mat4 mView;"
  95.         "uniform mat4 mProjection;\n "
  96.         "uniform vec3 vLightPos[3];\n"
  97.         "uniform vec3 vLightColor[3];\n"
  98.         "layout (location=0) in vec3 inPosition;\n"
  99.         "layout(location=1) in vec3 inColor;\n"
  100.         "layout(location = 2) in vec3 inNormal; \n"
  101.         " out vec3 theColor;\n"
  102.         "void main() {\n"
  103.         "gl_Position = mProjection*mView*mWorld*vec4(inPosition*4.0f, 1.0);\n"
  104.         "vec3  color = inColor;\n"
  105.         "for (int i=0;i<3;i++)\n"
  106.         "color+ = dot(normalize(inNormal),normalize(vLightPos[i]-inPosition))*vLightColor[i]*0.5f;\n"
  107.         "theColor =color;\n "
  108.         "}\n"; */
  109.     const char* fsSource =
  110.         "#version 330\n"
  111.         "in vec3 theColor;\n"
  112.         "layout(location=0) out vec4 outputColor;\n"
  113.         "void main(){\n"
  114.         "outputColor=vec4(theColor,1.0);\n"
  115.     "}\n";
  116.   //! Переменные для хранения идентификаторов шейдеров
  117.   GLuint vShader, fShader;
  118.  
  119.   //! Создаем вершинный шейдер
  120.   vShader = glCreateShader(GL_VERTEX_SHADER);
  121.   //! Передаем исходный код
  122.   glShaderSource(vShader, 1, &vsSource, NULL);
  123.   //! Компилируем шейдер
  124.   glCompileShader(vShader);
  125.  
  126.   std::cout << "vertex shader \n";
  127.   shaderLog(vShader);
  128.  
  129.   //! Создаем фрагментный шейдер
  130.   fShader = glCreateShader(GL_FRAGMENT_SHADER);
  131.   //! Передаем исходный код
  132.   glShaderSource(fShader, 1, &fsSource, NULL);
  133.   //! Компилируем шейдер
  134.   glCompileShader(fShader);
  135.  
  136.   std::cout << "fragment shader \n";
  137.   shaderLog(fShader);
  138.  
  139.   //! Создаем программу и прикрепляем шейдеры к ней
  140.   Program = glCreateProgram();
  141.   glAttachShader(Program, vShader);
  142.   glAttachShader(Program, fShader);
  143.  
  144.   //! Линкуем шейдерную программу
  145.   glLinkProgram(Program);
  146.  
  147.   //! Проверяем статус сборки
  148.   int link_ok;
  149.   glGetProgramiv(Program, GL_LINK_STATUS, &link_ok);
  150.   if(!link_ok)
  151.   {
  152.     std::cout << "error attach shaders \n";
  153.     return;
  154.   }
  155.  
  156.  
  157.   checkOpenGLerror();
  158. }
  159.  
  160. //! Инициализация VBO
  161. void initVBO()
  162. {
  163.  
  164.   //! Вершины нашего треугольника
  165.   vertex triangle[] = {
  166.     -0.5f,  0.5f, 0.0f, // Top-left
  167.      0.5f,  0.5f, 0.0f, // Top-right
  168.      0.5f, -0.5f, 0.0f, // Bottom-right
  169.     -0.5f, -0.5f, 0.0f,  // Bottom-left
  170.     0.f,  1.f, 0.0f     // Top top
  171.   };
  172.   vertex color[] = {
  173.         0.75f, 0.75f, 0.75f,
  174.         0.0f, 1.0f, 0.0f,
  175.         0.0f, 1.0f, 1.0f,
  176.         1.0f, 1.0f, 0.0f,
  177.         1.0f, 1.0f, 1.0f
  178.   };
  179.   int index[9] = { 0, 4, 1, 0, 1, 2, 2, 3, 0 };
  180.  
  181.   vertex normal[6] = {
  182.       { 1, 0, 1 },
  183.       { 1, 0, 0 },
  184.       { 0, 1, 0 }
  185.   };
  186.  
  187.  
  188.   glGenVertexArrays(1, &uVAO);
  189.   glGenBuffers(4,uVBO);
  190.  
  191.   glBindVertexArray(uVAO);
  192.  
  193.   glBindBuffer(GL_ARRAY_BUFFER, uVBO[0]);
  194.   glBufferData(GL_ARRAY_BUFFER, 27 * sizeof(float), triangle, GL_STATIC_DRAW);
  195.   glEnableVertexAttribArray(0);
  196.   glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
  197.  
  198.  
  199.   glBindBuffer(GL_ARRAY_BUFFER, uVBO[1]);
  200.   glBufferData(GL_ARRAY_BUFFER, 27 * sizeof(float), color, GL_STATIC_DRAW);
  201.   glEnableVertexAttribArray(1);
  202.   glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0,NULL);
  203.  
  204.   glBindBuffer(GL_ARRAY_BUFFER, uVBO[2]);
  205.   glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), normal, GL_STATIC_DRAW);
  206.   glEnableVertexAttribArray(2);
  207.   glVertexAttribPointer(2,3, GL_FLOAT, GL_FALSE, 0, NULL);
  208.  
  209.   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, uVBO[3]);
  210.   glBufferData(GL_ELEMENT_ARRAY_BUFFER,  9*sizeof(int),index, GL_STATIC_DRAW);
  211.  
  212.  
  213.  
  214.   checkOpenGLerror();
  215. }
  216.  
  217. //! Освобождение шейдеров
  218. void freeShader()
  219. {
  220.   //! Передавая ноль, мы отключаем шейдрную программу
  221.   glUseProgram(0);
  222.   //! Удаляем шейдерную программу
  223.   glDeleteProgram(Program);
  224. }
  225.  
  226. //! Освобождение шейдеров
  227. void freeVBO()
  228. {
  229.  // glBindBuffer(GL_ARRAY_BUFFER, 0);
  230.   glDeleteBuffers(3, uVBO);
  231.   glDeleteVertexArrays(1, &uVAO);
  232. }
  233.  
  234. void resizeWindow(int width, int height)
  235. {
  236.   glViewport(0, 0, width, height);
  237. }
  238.  
  239. //! Отрисовка
  240. void render()
  241. {
  242.   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  243.   glEnable(GL_DEPTH_TEST);
  244.   //! Устанавливаем шейдерную программу текущей
  245. glUseProgram(Program);
  246.  
  247.  
  248. // Изменение позиции камеры на орбите
  249. float radius = 5.0f;
  250.  
  251.  
  252. //orbit += 0.001f;
  253.  
  254. // Инициализация орбитальных данных координат камеры
  255. glm::vec3   Eye(sin(orbit)*radius, 1.0f, -2.0f + cos(orbit)*radius*2.0f);//поменять на spin
  256.  
  257. //Установка матриц для камеры
  258. glm::mat4   mWorld;
  259. glm::mat4   mView;
  260. glm::mat4   mProjection;
  261. mWorld = glm::mat4(1.0f, 0, 0, 0, 0, 1.0f, 0, 0, 0, 0, 1.0f, 0, 0, 0, 0, 1.0f);
  262.  
  263. mWorld = glm::translate(mWorld,glm::vec3(0, 0, 0));
  264. mWorld = glm::rotate(mWorld, orbit,vec3(0, 0, 1));
  265. mView = glm::lookAt(Eye, glm::vec3(0, 0, 0), glm::vec3(0.0f, 1.0f, 0.0f));
  266. mProjection = glm::perspectiveFov(45.0f, 533.0f, 400.0f, 0.01f, 100.0f);
  267.  
  268. //Установка констант шейдера матриц
  269. int iWorld = glGetUniformLocation(Program, "mWorld");
  270. int iView = glGetUniformLocation(Program, "mView");
  271. int iProjection = glGetUniformLocation(Program, "mProjection");
  272.  
  273. glUniformMatrix4fv(iWorld, 1, GL_FALSE, &mWorld[0][0]);
  274. glUniformMatrix4fv(iView, 1, GL_FALSE, &mView[0][0]);
  275. glUniformMatrix4fv(iProjection, 1, GL_FALSE, &mProjection[0][0]);
  276.  
  277.  
  278. float f0 = 2.0f;
  279. float f1 = 3.0f;
  280. float f2 = 2.5f;
  281. float r = 3.0f;
  282.  
  283. // Установка координат источников освещения
  284. glm::vec3 LightPos[3];
  285. glm::vec3 LightColor[3];
  286.  
  287. LightPos[0] = glm::vec3(sin(orbit*f0)*r, cos(orbit*f0)*r, cos(orbit*f0)*r);
  288. LightPos[1] = glm::vec3(sin(orbit*f1)*r, -sin(orbit*f1)*r, -cos(orbit*f1)*r);
  289. LightPos[2] = glm::vec3(cos(orbit*f2)*r, sin(orbit*f2)*r, sin(orbit*f2)*r);
  290. LightColor[0] = glm::vec3(1, 1, 0);
  291. LightColor[1] = glm::vec3(0, 0, 1);
  292. LightColor[2] = glm::vec3(0, 1, 1);
  293.  
  294. // Установка констант шейдера для источников
  295. int iLightPos = glGetUniformLocation(Program, "vLightPos");
  296. int iLightColor = glGetUniformLocation(Program, "vLightColor");
  297. glUniform3fv(iLightPos, 3,&LightPos[0][0]);
  298. glUniform3fv(iLightColor, 3,&LightColor[0][0]);
  299.  
  300.  
  301.  
  302. glBindVertexArray(uVAO);
  303.     //! Передаем данные на видеокарту(рисуем)
  304.      glDrawElements(GL_TRIANGLES, 9 , GL_UNSIGNED_INT, 0);
  305.     mWorld = glm::mat4(1.0f, 0, 0, 0, 0, 1.0f, 0, 0, 0, 0, 1.0f, 0, 0, 0, 0, 1.0f);
  306.  
  307.  
  308.     mWorld = glm::translate(mWorld,glm::vec3(4.0f, 0.0f, 0.0f));
  309.     //mWorld = glm::rotate(mWorld, spin, vec3(0, 0, 1));
  310.     glUniformMatrix4fv(iWorld, 1, GL_FALSE, &mWorld[0][0]);
  311.  
  312.     glBindVertexArray(uVAO);
  313.     //! Передаем данные на видеокарту(рисуем)
  314.  
  315.     //glDrawElements(GL_TRIANGLES, 15, GL_UNSIGNED_INT, 0);
  316.  
  317.   //! Отключаем шейдерную программу
  318.   glUseProgram(0);
  319.  
  320.   checkOpenGLerror();
  321.   glutSwapBuffers();
  322. }
  323.  
  324. void processSpecialKeys(int key, int x, int y) {
  325.  
  326.     switch(key) {
  327.         case GLUT_KEY_LEFT :
  328.                 orbit -= 0.05f;
  329.                 break;
  330.         case GLUT_KEY_RIGHT :
  331.                 orbit += 0.05f;
  332.                 break;
  333.     }
  334. }
  335.  
  336. int main( int argc, char **argv )
  337. {
  338.   glutInit(&argc, argv);
  339.   glutInitDisplayMode(GLUT_RGBA | GLUT_ALPHA | GLUT_DOUBLE);
  340.   glutInitWindowSize(800, 600);
  341.   glutCreateWindow("Simple shaders");
  342.  
  343.   //! Обязательно перед инициализации шейдеров
  344.   GLenum glew_status = glewInit();
  345.   if(GLEW_OK != glew_status)
  346.   {
  347.      //! GLEW не проинициализировалась
  348.     std::cout << "Error: " << glewGetErrorString(glew_status) << "\n";
  349.     return 1;
  350.   }
  351.  
  352.   //! Проверяем доступность OpenGL 2.0
  353.   if(!GLEW_VERSION_2_0)
  354.    {
  355.      //! OpenGl 2.0 оказалась не доступна
  356.     std::cout << "No support for OpenGL 2.0 found\n";
  357.     return 1;
  358.   }
  359.  
  360.   //! Инициализация
  361.  initGL();
  362.  initVBO();
  363.  initShader();
  364.  
  365.   glutReshapeFunc(resizeWindow);
  366.   glutDisplayFunc(render);
  367.   glutIdleFunc(render);
  368.   glutSpecialFunc(processSpecialKeys);
  369.   glutMainLoop();
  370.  
  371.   //! Освобождение ресурсов
  372.   freeShader();
  373.   freeVBO();
  374. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement