Advertisement
Guest User

Untitled

a guest
Dec 16th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.43 KB | None | 0 0
  1. // GLEW нужно подключать до GLFW.
  2. // GLEW
  3. #include <Windows.h>
  4. #include <stdio.h>
  5. #pragma comment(lib, "legacy_stdio_definitions.lib")
  6. #define GLEW_STATIC
  7. #include <glew.h>
  8. // GLFW
  9. #include <glfw3.h>
  10. #include <SOIL.h>
  11. #include <string>
  12. #include <fstream>
  13. #include <sstream>
  14. #include <iostream>
  15.  
  16.  
  17. class Shader
  18. {
  19. public:
  20. // Идентификатор программы
  21. GLuint Program;
  22. // Конструктор считывает и собирает шейдер
  23. Shader(const GLchar* vertexPath, const GLchar* fragmentPath)
  24. {
  25. // 1. Получаем исходный код шейдера из filePath
  26. std::string vertexCode;
  27. std::string fragmentCode;
  28. std::ifstream vShaderFile;
  29. std::ifstream fShaderFile;
  30. // Удостоверимся, что ifstream объекты могут выкидывать исключения
  31. vShaderFile.exceptions(std::ifstream::badbit);
  32. fShaderFile.exceptions(std::ifstream::badbit);
  33. try
  34. {
  35. // Открываем файлы
  36. vShaderFile.open(vertexPath);
  37. fShaderFile.open(fragmentPath);
  38. std::stringstream vShaderStream, fShaderStream;
  39. // Считываем данные в потоки
  40. vShaderStream << vShaderFile.rdbuf();
  41. fShaderStream << fShaderFile.rdbuf();
  42. // Закрываем файлы
  43. vShaderFile.close();
  44. fShaderFile.close();
  45. // Преобразовываем потоки в массив GLchar
  46. vertexCode = vShaderStream.str();
  47. fragmentCode = fShaderStream.str();
  48. }
  49. catch (std::ifstream::failure e)
  50. {
  51. std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl;
  52. }
  53. const GLchar* vShaderCode = vertexCode.c_str();
  54. const GLchar* fShaderCode = fragmentCode.c_str();
  55. // 2. Сборка шейдеров
  56. GLuint vertex, fragment;
  57. GLint success;
  58. GLchar infoLog[512];
  59.  
  60. // Вершинный шейдер
  61. vertex = glCreateShader(GL_VERTEX_SHADER);
  62. glShaderSource(vertex, 1, &vShaderCode, NULL);
  63. glCompileShader(vertex);
  64. // Если есть ошибки - вывести их
  65. glGetShaderiv(vertex, GL_COMPILE_STATUS, &success);
  66. if (!success)
  67. {
  68. glGetShaderInfoLog(vertex, 512, NULL, infoLog);
  69. std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
  70. };
  71. // Фрагментный шейдер
  72. fragment = glCreateShader(GL_FRAGMENT_SHADER);
  73. glShaderSource(fragment, 1, &fShaderCode, NULL);
  74. glCompileShader(fragment);
  75.  
  76. // Если есть ошибки - вывести их
  77. glGetShaderiv(fragment, GL_COMPILE_STATUS, &success);
  78. if (!success)
  79. {
  80. glGetShaderInfoLog(fragment, 512, NULL, infoLog);
  81. std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
  82. };
  83. // Шейдерная программа
  84. this->Program = glCreateProgram();
  85. glAttachShader(this->Program, vertex);
  86. glAttachShader(this->Program, fragment);
  87. glLinkProgram(this->Program);
  88. //Если есть ошибки - вывести их
  89. glGetProgramiv(this->Program, GL_LINK_STATUS, &success);
  90. if (!success)
  91. {
  92. glGetProgramInfoLog(this->Program, 512, NULL, infoLog);
  93. std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
  94. }
  95. std::cout << "vShaderCode" << std::endl << vShaderCode << std::endl << std::endl;
  96. std::cout << "fShaderCode" << std::endl << fShaderCode << std::endl << std::endl;
  97. // Удаляем шейдеры, поскольку они уже в программу и нам больше не нужны.
  98. glDeleteShader(vertex);
  99. glDeleteShader(fragment);
  100. }
  101. // Использование программы
  102. void Use() { glUseProgram(this->Program); }
  103. };
  104.  
  105. void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
  106. {
  107. // Когда пользователь нажимает ESC, мы устанавливаем свойство WindowShouldClose в true,
  108. // и приложение после этого закроется
  109. if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
  110. glfwSetWindowShouldClose(window, GL_TRUE);
  111. }
  112.  
  113.  
  114. GLFWwindow* initWindow()
  115. {
  116. //Инициализация GLFW
  117. glfwInit();
  118. //Настройка GLFW
  119. //Задается минимальная требуемая версия OpenGL.
  120. //Мажорная
  121. glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  122. //Минорная
  123. glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  124. //Установка профайла для которого создается контекст
  125. glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  126. //Выключение возможности изменения размера окна
  127. glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
  128.  
  129. GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr);
  130. if (window == nullptr)
  131. {
  132. std::cout << "Failed to create GLFW window" << std::endl;
  133. glfwTerminate();
  134. return NULL;
  135. }
  136. glfwMakeContextCurrent(window);
  137.  
  138. glewExperimental = GL_TRUE;
  139. if (glewInit() != GLEW_OK)
  140. {
  141. std::cout << "Failed to initialize GLEW" << std::endl;
  142. return NULL;
  143. }
  144. return window;
  145. }
  146.  
  147.  
  148. using namespace std;
  149. int main()
  150. {
  151. GLuint texture;
  152. glGenTextures(1, &texture);
  153. glBindTexture(GL_TEXTURE_2D, texture);
  154.  
  155. int widthi, heighti;
  156. unsigned char* image = SOIL_load_image("C:\\Users\\skich\\OpenGL\\Textures\\yachik3.jpg", &widthi, &heighti, 0, SOIL_LOAD_RGB);
  157. cout << widthi << " " << heighti << endl;
  158. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, widthi, heighti, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
  159. //glGenerateMipmap(GL_TEXTURE_2D);
  160. //SOIL_free_image_data(image);
  161. glBindTexture(GL_TEXTURE_2D, 0);
  162. //C:\Users\skich\OpenGL\Textures\yachik3.jpg
  163. //C:\Users\skich\OpenGL\Shaders\fragment.txt
  164. //C:\Users\skich\OpenGL\Shaders\vert.txt
  165.  
  166. GLFWwindow* window = initWindow();
  167. int width, height;
  168. glfwGetFramebufferSize(window, &width, &height);
  169. glViewport(0, 0, width, height);
  170. glfwSetKeyCallback(window, key_callback);
  171. float r = 0.4, g = 0.5, b = 0.4, rv = 0.001, gv = 0.001, bv = 0.001;
  172.  
  173.  
  174. GLuint VBO;
  175. glGenBuffers(1, &VBO);
  176. glBindBuffer(GL_ARRAY_BUFFER, VBO);
  177. //GLuint vertexShader, fragmentShader, shaderProgram;
  178. //initShaders(vertexShader, fragmentShader, shaderProgram);
  179. Shader ourShader("C:\\Users\\skich\\OpenGL\\Shaders\\vert.txt" , "C:\\Users\\skich\\OpenGL\\Shaders\\fragment.txt");
  180. glEnableVertexAttribArray(0);
  181.  
  182. GLuint VAO;
  183. glGenVertexArrays(1, &VAO);
  184. GLuint EBO;
  185. glGenBuffers(1, &EBO);
  186. GLfloat vertices[] = {
  187. // Позиции // Цвета // Текстурные координаты
  188. 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, // Верхний правый
  189. 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // Нижний правый
  190. -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // Нижний левый
  191. -0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f // Верхний левый
  192. };
  193. GLuint indices[] = { // Помните, что мы начинаем с 0!
  194. 0, 1, 3, // Первый треугольник
  195. 1, 2, 3 // Второй треугольник
  196. };
  197. GLfloat texCoords[] = {
  198. 0.0f, 0.0f, // Нижний левый угол
  199. 1.0f, 0.0f, // Нижний правый угол
  200. 0.5f, 1.0f // Верхняя центральная сторона
  201. };
  202. // 1. Привязываем VAO
  203. glBindVertexArray(VAO);
  204. // 2. Копируем наш массив вершин в буфер для OpenGL
  205. glBindBuffer(GL_ARRAY_BUFFER, VBO);
  206. glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
  207. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
  208. glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
  209. // 3. Устанавливаем указатели на вершинные атрибуты
  210. glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)0);
  211. glEnableVertexAttribArray(0);
  212. glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
  213. glEnableVertexAttribArray(1);
  214. glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat)));
  215. glEnableVertexAttribArray(2);
  216. //4. Отвязываем VAO
  217. glBindVertexArray(0);
  218.  
  219. //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  220.  
  221. while (!glfwWindowShouldClose(window))
  222. {
  223. GLfloat timeValue = glfwGetTime();
  224. GLfloat greenValue = (sin(timeValue) / 2) + 0.5;
  225. GLint vertexColorLocation = glGetUniformLocation(ourShader.Program, "ourColor");
  226. ourShader.Use();
  227. glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);
  228.  
  229. glfwPollEvents();
  230.  
  231. glClearColor(r, g, b, 1.0f);
  232. glClear(GL_COLOR_BUFFER_BIT);
  233.  
  234. //glUseProgram(shaderProgram);
  235. glBindTexture(GL_TEXTURE_2D, texture);
  236.  
  237. glBindVertexArray(VAO);
  238. glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
  239. glBindVertexArray(0);
  240. glBindTexture(GL_TEXTURE_2D, 0);
  241.  
  242.  
  243. glfwSwapBuffers(window);
  244. }
  245. glfwTerminate();
  246. return 0;
  247. }
  248.  
  249.  
  250. .....................................
  251. #version 330 core
  252. layout (location = 0) in vec3 position;
  253. layout (location = 1) in vec3 color;
  254. layout (location = 2) in vec2 texCoord;
  255.  
  256. out vec3 ourColor;
  257. out vec2 TexCoord;
  258.  
  259. void main()
  260. {
  261. gl_Position = vec4(position, 1.0f);
  262. ourColor = color;
  263. TexCoord = texCoord;
  264. }
  265. .....................................
  266. #version 330 core
  267. in vec3 ourColor;
  268. in vec2 TexCoord;
  269.  
  270. out vec4 color;
  271.  
  272. uniform sampler2D ourTexture;
  273.  
  274. void main()
  275. {
  276. color = texture(ourTexture, TexCoord);
  277. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement