From 455d355b17fe2d37f681f0c2dddd47eaac5333ab Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Mon, 14 Nov 2022 11:42:20 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=BE=D0=B4=D0=B5=D0=BB=D1=8C=20=D1=81?= =?UTF-8?q?=20=D1=82=D0=B5=D0=BA=D1=81=D1=82=D1=83=D1=80=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/Model.h | 2 ++ src/Model.cpp | 32 ++++++++++++++++++++++++++++++-- src/main.cpp | 43 +++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 73 insertions(+), 4 deletions(-) diff --git a/include/Model.h b/include/Model.h index 62d21df..480b8b0 100644 --- a/include/Model.h +++ b/include/Model.h @@ -14,6 +14,7 @@ class Model void render(const GLuint &mvp_uniform); // Вызов отрисовки void load_verteces(glm::vec3* verteces, GLuint count); // Загрузка вершин в буфер void load_indices(GLuint* indices, GLuint count); // Загрузка индексов в буфер + void load_texCoords(glm::vec2* texCoords, GLuint count); // Загрузка текстурных координат в буфер glm::vec3 position; // позиция модели glm::vec3 rotation; // поворот модели @@ -23,6 +24,7 @@ class Model private: VAO vao; BO vertex_vbo, index_vbo; // вершинный и индексный буферы + BO texCoords_vbo; // буфер с текстурными координатами GLuint verteces_count; // Количество вершин GLuint indices_count; // Количество индексов diff --git a/src/Model.cpp b/src/Model.cpp index 094d084..a3d7ff3 100644 --- a/src/Model.cpp +++ b/src/Model.cpp @@ -3,13 +3,13 @@ extern Camera camera; // Конструктор без параметров -Model::Model() : verteces_count(0), indices_count(0), vertex_vbo(VERTEX), index_vbo(ELEMENT), position(0), rotation(0), scale(1) +Model::Model() : verteces_count(0), indices_count(0), vertex_vbo(VERTEX), index_vbo(ELEMENT), texCoords_vbo(VERTEX), position(0), rotation(0), scale(1) { } // Конструктор копирования -Model::Model(const Model& copy) : vao(copy.vao), verteces_count(copy.verteces_count), indices_count(copy.indices_count), vertex_vbo(copy.vertex_vbo), index_vbo(copy.index_vbo), position(copy.position), rotation(copy.rotation), scale(copy.scale) +Model::Model(const Model& copy) : vao(copy.vao), verteces_count(copy.verteces_count), indices_count(copy.indices_count), vertex_vbo(copy.vertex_vbo), index_vbo(copy.index_vbo), texCoords_vbo(copy.texCoords_vbo), position(copy.position), rotation(copy.rotation), scale(copy.scale) { } @@ -81,6 +81,34 @@ void Model::load_indices(GLuint* indices, GLuint count) indices_count = count; } +// Функция для конфигурации атрибута вершинного буфера +void texCoords_attrib_config() +{ + // Включаем необходимый атрибут у выбранного VAO + glEnableVertexAttribArray(1); + // Устанавливаем связь между VAO и привязанным VBO + glVertexAttribPointer( 1 // индекс атрибута, должен совпадать с Layout шейдера + , 2 // количество компонент одного элемента + , GL_FLOAT // тип + , GL_FALSE // нормализованность значений + , 0 // шаг + , (void *)0 // отступ с начала массива + ); +} + +// Загрузка текстурных координат в буфер +void Model::load_texCoords(glm::vec2* texCoords, GLuint count) +{ + // Подключаем VAO + vao.use(); + + texCoords_vbo.use(); + + // Загрузка вершин в память буфера + texCoords_vbo.load(texCoords, sizeof(glm::vec2)*count); + texCoords_attrib_config(); +} + #include // Матрица трансформации модели diff --git a/src/main.cpp b/src/main.cpp index 427d25a..d407859 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,6 +2,8 @@ #include #include #include +#define STB_IMAGE_IMPLEMENTATION +#include #include @@ -200,15 +202,48 @@ int main(void) // Загрузка индексов модели rectangle.load_indices(indices, sizeof(indices)); - rectangle.position.z = 2; - rectangle.rotation = glm::vec3(45); + // Текстурные координаты + glm::vec2 texCoords[] = { {0.0f, 0.0f} + , {1.0f, 0.0f} + , {1.0f, 1.0f} + , {0.0f, 1.0f} + }; + + // Загрузка текстурных координат модели + rectangle.load_texCoords(texCoords, sizeof(texCoords)/sizeof(glm::vec2)); + + // Зададим горизонтальное положение перед камерой + rectangle.position.y = -1; + rectangle.position.z = 3; + rectangle.rotation.x = 90; + rectangle.scale = glm::vec3(3); + // Работа с текстурой + GLuint texture; // Дескриптор текстуры + glGenTextures(1, &texture); // Генерация одной текстуры + glBindTexture(GL_TEXTURE_2D, texture); // Привязка текстуры как активной + + int width, height, channels; // Ширина, высота и цветовые каналы текстуры + unsigned char* image = stbi_load("../resources/textures/grass.png", &width, &height, &channels, STBI_default); // Загрузка в оперативную память изображения + // Загрузка данных с учетом прозрачности + if (channels == 3) // RGB + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); + else if (channels == 4) // RGBA + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image); + + glGenerateMipmap(GL_TEXTURE_2D); // Генерация мипмапа для активной текстуры + glBindTexture(GL_TEXTURE_2D, 0); // Отвязка активной текстуры + + stbi_image_free(image); // Освобождение оперативной памяти + // Установка цвета очистки буфера цвета glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Расположение Uniform-переменной GLuint mvp_uniform = glGetUniformLocation(shaderProgram, "mvp"); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // Использование уменьшенных версий mipmap + // Пока не произойдет событие запроса закрытия окна while(!glfwWindowShouldClose(window)) { @@ -216,6 +251,7 @@ int main(void) glClear(GL_COLOR_BUFFER_BIT); // Тут производится рендер + glBindTexture(GL_TEXTURE_2D, texture); // Привязка текстуры как активной rectangle.render(mvp_uniform); // Представление содержимого буфера цепочки показа на окно @@ -224,6 +260,9 @@ int main(void) glfwPollEvents(); } + // Удаление текстуры + glDeleteTextures(1, &texture); + // Удаление шейдерной программы glDeleteProgram(shaderProgram);