Advertisement
Siborgium

Untitled

May 31st, 2017
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.77 KB | None | 0 0
  1. class triangle {
  2. public: GLuint VAO, shaderProgram;
  3. GLuint VBO, EBO;
  4. GLfloat tVertices[18] = {0.5f, 0.5f, 1.0f, 0.7f, 0.7f, 0.7f
  5. 0.5f, -0.5f, 1.0f, 0.5f, 0.5f, 0.5f
  6. -0.5f, -0.5f, 1.0f, 0.3f, 0.3f, 0.3f};
  7. GLuint vIndices[3] = {0, 1, 2};
  8. triangle() {
  9. try {
  10. //инициализация VAO
  11. glGenVertexArrays(1, &this->VAO);
  12. glBindVertexArray(VAO);
  13. //инициализация VBO
  14. glGenBuffers(1, &this->VBO);
  15. glBindBuffer(GL_ARRAY_BUFFER, this->VBO);
  16.  
  17. glBufferData(GL_ARRAY_BUFFER, sizeof(this->tVertices), this->tVertices, GL_DYNAMIC_DRAW);
  18. //инициализация EBO
  19. glGenBuffers(1, &this->EBO);
  20. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->EBO);
  21. glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(this->vIndices), this->vIndices, GL_DYNAMIC_DRAW);
  22. //передача вершин на layout 0
  23. glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);
  24. glEnableVertexAttribArray(0);
  25. //передача цветов на layout 1
  26. glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
  27. glEnableVertexAttribArray(1);
  28.  
  29. shaderInit();
  30.  
  31. glBindBuffer(GL_ARRAY_BUFFER, 0);
  32. glBindVertexArray(0);
  33. }
  34. catch (char* s) {
  35. std::cout << s << std::endl;
  36. system("pause");
  37. abort();
  38. }
  39. }
  40. ~triangle() {
  41. glDeleteVertexArrays(1, &VAO);
  42. glDeleteBuffers(1, &VBO);
  43. glDeleteBuffers(1, &EBO);
  44. }
  45. void shaderInit() {
  46. try {
  47. GLint compile_ok = GL_FALSE, link_ok = GL_FALSE;
  48. GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  49. const char* vertexShader_source = "#version 330 core
  50. layout(location = 0) in vec3 vertexPos;
  51. layout(location = 1) in vec3 inColor;
  52. out vec4 outColor;
  53. void main(){gl_Position = vec4(vertexPos, 1.0); outColor = vec4(inColor, 1.0);}"
  54. glShaderSource(vertexShader, 1, &vertexShader_source, NULL);
  55. glCompileShader(vertexShader);
  56. glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &compile_ok);
  57. if (0 == compile_ok) { throw "Error in vertex shader"; }
  58. GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  59. const char* fragmentShader_source = "#version 330 core
  60. in vec4 outColor;
  61. out vec4 color;
  62. void main(){color = outColor;}";
  63. glShaderSource(fragmentShader, 1, &fragmentShader_source, NULL);
  64. glCompileShader(fragmentShader);
  65. glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &compile_ok);
  66. if (0 == compile_ok) { throw "Error in fragment shader"; }
  67. glAttachShader(this->shaderProgram, vertexShader);
  68. glAttachShader(this->shaderProgram, fragmentShader);
  69. glLinkProgram(this->shaderProgram);
  70. glGetProgramiv(this->shaderProgram, GL_COMPILE_STATUS, &compile_ok);
  71. if (0 == compile_ok) { throw "Error while linking program"; }
  72. glDeleteShader(vertexShader);
  73. glDeleteShader(fragmentShader);
  74. }
  75. catch (char* s) {
  76. std::cout << s << std::endl;
  77. system("pause");
  78. abort();
  79. }
  80. }
  81. void draw() {
  82. glUseProgram(this->shaderProgram);
  83. glBindVertexArray(this->VAO);
  84. glDrawElements(GL_TRIANGLES, ArraySize(this->vIndices), GL_UNSIGNED_INT, 0);
  85. glBindVertexArray(0);
  86. glUseProgram(0);
  87. }
  88. };
  89.  
  90. GLFWwindow *window;
  91.  
  92. void render(GLFWwindow *window, triangle &t) {
  93. glfwPollEvents();
  94.  
  95. glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
  96. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  97.  
  98. t.draw();
  99.  
  100. glfwSwapBuffers(window);
  101. };
  102.  
  103. int main() {
  104. if (!glfwInit()) { std::cout << "Failed to initialize GLFW" << std::endl; return -1; }
  105. glfwWindowHint(GLFW_SAMPLES, 4);
  106. glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // нам нужен OpenGL 3.3
  107. glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  108. glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //нам не нужен старый OpenGL
  109. glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
  110. window = glfwCreateWindow(480, 640, "GLFW: Getting Started", 0, 0);
  111. glfwMakeContextCurrent(window);
  112.  
  113. glfwSetKeyCallback(window, key_callback);
  114. glfwSetMouseButtonCallback(window, mouse_button_callback);
  115.  
  116. glewExperimental = true;
  117. if (glewInit() != GLEW_OK) { std::cout << "Failed to initialize GLEW" << std::endl; system("pause"); glfwTerminate(); return -1; }
  118. if (window == NULL) { std::cout << "Failed to initialize window" << std::endl; system("pause"); glfwTerminate(); return -1; }
  119.  
  120. int width, height;
  121. glfwGetFramebufferSize(window, &width, &height);
  122. glViewport(0, 0, width, height);
  123.  
  124. glMatrixMode(GL_PROJECTION);
  125. glLoadIdentity();
  126.  
  127. triangle t1;
  128. glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);
  129. while (glfwWindowShouldClose(window) == 0) {render(window, t1);}
  130. glfwTerminate();
  131. return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement