Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.45 KB | None | 0 0
  1. #include "widgetopengl.h"
  2. #include "model.h"
  3.  
  4. #include <QDebug>
  5. #include <QFile>
  6.  
  7.  
  8. GLuint WidgetOpenGL::loadShader(GLenum type, QString fname)
  9. {
  10. // wczytanie pliku
  11. QFile f(fname);
  12. if (!f.open(QFile::ReadOnly | QFile::Text))
  13. throw QString("Nie moge odczytac pliku '%1'").arg(fname);
  14.  
  15. QTextStream in(&f);
  16. std::string s = in.readAll().toStdString();
  17. GLchar *shader_source = (GLchar *)(s.c_str());
  18. f.close();
  19.  
  20. // zaladowanie shadera i kompilacja
  21. GLuint shader = glCreateShader(type);
  22. glShaderSource(shader, 1, &shader_source, NULL);
  23. glCompileShader(shader);
  24.  
  25. // czy kompilacja ok?
  26. GLint success;
  27. glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
  28. GLchar infoLog[512];
  29. glGetShaderInfoLog(shader, 512, NULL, infoLog);
  30. qDebug() << "Kompilacja shadera:" << fname << "\n" << infoLog;
  31. if (!success)
  32. throw QString("Blad shadera '%1': %2").arg(fname).arg(infoLog);
  33.  
  34. return shader;
  35. }
  36.  
  37.  
  38. void WidgetOpenGL::initializeGL()
  39. {
  40. // zaczynamy pesymistycznie...
  41. init_ok = false;
  42.  
  43. try
  44. {
  45. // jaka jest dostepna wersja OpenGL?
  46. OpenGLVersionTest test;
  47. QString version = test.version();
  48. if (version < MIN_OPENGL_VERSION)
  49. throw QString("Zla wersja OpenGL: %1").arg(version);
  50.  
  51. // specyficzne dla Qt:
  52. initializeOpenGLFunctions();
  53.  
  54. // jakie mamy dostepne rozszerzenia, itp.
  55. qDebug() << (char *)glGetString(GL_EXTENSIONS);
  56. qDebug() << (char *)glGetString(GL_RENDERER);
  57. qDebug() << (char *)glGetString(GL_VERSION);
  58. qDebug() << (char *)glGetString(GL_SHADING_LANGUAGE_VERSION);
  59.  
  60.  
  61. ////////////////////////////////////////////////////////////////
  62. // CZ 1. SHADERY
  63. ////////////////////////////////////////////////////////////////
  64.  
  65. // ladujemy shadery
  66. GLuint vertexShader = loadShader(GL_VERTEX_SHADER, "vertex.glsl");
  67. GLuint fragmentShader = loadShader(GL_FRAGMENT_SHADER, "fragment.glsl");
  68.  
  69. // tworzymy i linkujemy program
  70. shaderProgram = glCreateProgram();
  71. glAttachShader(shaderProgram, vertexShader);
  72. glAttachShader(shaderProgram, fragmentShader);
  73. glLinkProgram(shaderProgram);
  74.  
  75. // czy kompilacja ok?
  76. GLint success;
  77. glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
  78. if (!success)
  79. {
  80. GLchar infoLog[512];
  81. glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
  82. throw QString("Blad linkowania: %1").arg(infoLog);
  83. }
  84.  
  85. // shadery staly sie czescia programu, mozna skasowac
  86. glDeleteShader(vertexShader);
  87. glDeleteShader(fragmentShader);
  88.  
  89.  
  90. ////////////////////////////////////////////////////////////////
  91. // CZ 2. Wczytanie modelu
  92. ////////////////////////////////////////////////////////////////
  93.  
  94. Model model;
  95. model.readFile("../Modele/dragon.obj", true, false, 0.4);
  96. triangles_cnt = model.getVertDataCount();
  97.  
  98.  
  99. ////////////////////////////////////////////////////////////////
  100. // CZ 3. Vertex Buffer Object + Vertex Array Object
  101. ////////////////////////////////////////////////////////////////
  102.  
  103. // tworzymy VBO i przesylamy dane do serwera OpenGL
  104. GLuint VBO;
  105. glGenBuffers(1, &VBO);
  106. glBindBuffer(GL_ARRAY_BUFFER, VBO);
  107. glBufferData(GL_ARRAY_BUFFER, model.getVertDataSize(), model.getVertData(), GL_STATIC_DRAW);
  108.  
  109. // tworzymy VAO
  110. glGenVertexArrays(1, &VAO);
  111. glBindVertexArray(VAO);
  112.  
  113. // wspolrzene wierzcholkow
  114. GLint attr = glGetAttribLocation(shaderProgram, "position");
  115. if (attr < 0) throw QString("Nieprawidlowy parametr 'position'");
  116. glVertexAttribPointer(attr, 3, GL_FLOAT, GL_FALSE, model.getVertDataStride()*sizeof(GLfloat), 0);
  117. glEnableVertexAttribArray(attr);
  118.  
  119. // normalne
  120. attr = glGetAttribLocation(shaderProgram, "normal");
  121. if (attr < 0) throw QString("Nieprawidlowy parametr 'normal'");
  122. glVertexAttribPointer(attr, 3, GL_FLOAT, GL_FALSE, model.getVertDataStride()*sizeof(GLfloat), (void *)(3*sizeof(GLfloat)));
  123. glEnableVertexAttribArray(attr);
  124.  
  125. // zapodajemy VBO
  126. glBindBuffer(GL_ARRAY_BUFFER, VBO);
  127.  
  128. // odczepiamy VAO, aby sie nic juz nie zmienilo
  129. glBindVertexArray(0);
  130.  
  131.  
  132. ////////////////////////////////////////////////////////////////
  133. // CZ 4. Inne inicjalizacje OpenGL
  134. ////////////////////////////////////////////////////////////////
  135.  
  136. glClearColor(0, 0.3, 0, 1);
  137. glEnable(GL_DEPTH_TEST);
  138. glEnable(GL_CULL_FACE);
  139. glCullFace(GL_BACK);
  140.  
  141. v_transform(0, 0, 0, 1);
  142.  
  143. init_ok = true;
  144. }
  145. catch (QString msg)
  146. {
  147. qDebug() << "BLAD w initializeGL():" << msg;
  148. }
  149. }
  150.  
  151.  
  152. void WidgetOpenGL::paintGL()
  153. {
  154. if (!init_ok) return;
  155.  
  156. try
  157. {
  158. // czyscimy ekran i bufor glebokosci
  159. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  160.  
  161. // rysujemy
  162. glUseProgram(shaderProgram);
  163. glBindVertexArray(VAO);
  164.  
  165. // macierz
  166. int attr = glGetUniformLocation(shaderProgram, "pvm_matrix");
  167. if (attr < 0) throw QString("Nieprawidlowy parametr 'pvm_matrix'");
  168.  
  169. // !!!
  170. for (int i = 0; i < 10; i++)
  171. {
  172. m_matrix.setToIdentity();
  173. m_matrix.rotate(36*i, 0, 1, 0);
  174. m_matrix.translate(0, 0, -2);
  175. m_matrix.scale(0.5);
  176.  
  177. QMatrix4x4 pvm_matrix = p_matrix*v_matrix*m_matrix;
  178. glUniformMatrix4fv(attr, 1, GL_FALSE, pvm_matrix.data());
  179.  
  180. glDrawArrays(GL_TRIANGLES, 0, 3*triangles_cnt);
  181. }
  182.  
  183. // odczepiamy VAO
  184. glBindVertexArray(0);
  185. }
  186. catch (QString msg)
  187. {
  188. qDebug() << "BLAD w paintGL():" << msg;
  189. }
  190. }
  191.  
  192.  
  193. void WidgetOpenGL::resizeGL(int w, int h)
  194. {
  195. p_matrix.setToIdentity();
  196. float r = float(w)/float(h);
  197.  
  198. // macierz perspektywy...
  199. // p_matrix.ortho(-r, r, -1, 1, 0.1, 7);
  200. p_matrix.perspective(45, r, 0.1, 100); // !!!
  201. p_matrix.translate(0, 0, -5);
  202. }
  203.  
  204.  
  205.  
  206. void WidgetOpenGL::v_transform(float rot_x, float rot_y, float rot_z, float zoom)
  207. {
  208. v_matrix.setToIdentity();
  209. v_matrix.rotate(rot_x, 1, 0, 0);
  210. v_matrix.rotate(rot_y, 0, 1, 0);
  211. v_matrix.rotate(rot_z, 0, 0, 1);
  212. v_matrix.scale(zoom);
  213.  
  214. repaint();
  215. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement