From cee62312d053fa7b7be903aa0a93f2ae61be16a1 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 | 33 +++++++++++++++++++++++++++++++-- src/main.cpp | 45 ++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 75 insertions(+), 5 deletions(-) diff --git a/include/Model.h b/include/Model.h index 3e2fae3..d8bc976 100644 --- a/include/Model.h +++ b/include/Model.h @@ -63,11 +63,13 @@ class Model : public Node void load_verteces(glm::vec3* verteces, GLuint count); // Загрузка вершин в буфер void load_indices(GLuint* indices, GLuint count); // Загрузка индексов в буфер + void load_texCoords(glm::vec2* texCoords, GLuint count); // Загрузка текстурных координат в буфер void set_index_range(size_t first_byteOffset, size_t count); // Ограничение диапазона из буфера индексов private: VAO vao; BO vertex_vbo, index_vbo; // вершинный и индексный буферы + BO texCoords_vbo; // буфер с текстурными координатами GLuint verteces_count; // Количество вершин size_t first_index_byteOffset, indices_count; // Сдвиг в байтах для первого и количество индексов }; diff --git a/src/Model.cpp b/src/Model.cpp index 2daa600..ba70e80 100644 --- a/src/Model.cpp +++ b/src/Model.cpp @@ -202,7 +202,7 @@ Node& Node::operator=(const Node& other) // Конструктор по умолчанию Model::Model(Node *parent) : Node(parent), verteces_count(0), first_index_byteOffset(0), indices_count(0), -vertex_vbo(VERTEX), index_vbo(ELEMENT) +vertex_vbo(VERTEX), index_vbo(ELEMENT), texCoords_vbo(VERTEX) { } @@ -211,7 +211,7 @@ vertex_vbo(VERTEX), index_vbo(ELEMENT) Model::Model(const Model& copy) : Node(copy), vao(copy.vao), verteces_count(copy.verteces_count), first_index_byteOffset(copy.first_index_byteOffset), indices_count(copy.indices_count), -vertex_vbo(copy.vertex_vbo), index_vbo(copy.index_vbo) +vertex_vbo(copy.vertex_vbo), index_vbo(copy.index_vbo), texCoords_vbo(copy.texCoords_vbo) { } @@ -228,6 +228,7 @@ Model& Model::operator=(const Model& other) vertex_vbo = other.vertex_vbo; index_vbo = other.index_vbo; + texCoords_vbo = other.texCoords_vbo; return *this; } @@ -298,6 +299,34 @@ void Model::load_indices(GLuint* indices, GLuint count) indices_count = count; } +// Функция для конфигурации атрибута вершинного буфера +void texCoords_attrib_config() +{ + // Определим спецификацию атрибута + glVertexAttribPointer( 1 // индекс атрибута, должен совпадать с Layout шейдера + , 2 // количество компонент одного элемента + , GL_FLOAT // тип + , GL_FALSE // необходимость нормировать значения + , 0 // шаг + , (void *)0 // отступ с начала массива + ); + // Включаем необходимый атрибут у выбранного VAO + glEnableVertexAttribArray(1); +} + +// Загрузка текстурных координат в буфер +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(); +} + // Ограничение диапазона из буфера индексов void Model::set_index_range(size_t first_byteOffset, size_t count) { diff --git a/src/main.cpp b/src/main.cpp index 75a9b19..0ced0fb 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,6 +2,8 @@ #include #include #include +#define STB_IMAGE_IMPLEMENTATION +#include #include @@ -199,9 +201,40 @@ int main(void) // Загрузка индексов модели rectangle.load_indices(indices, sizeof(indices)); - rectangle.e_position().z = 2; - rectangle.e_rotation() = {0.733f, 0.462f, 0.191f, 0.462f}; + // Текстурные координаты + 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.e_position().y = -1; + rectangle.e_position().z = 3; + rectangle.e_rotation() = {0.707f, 0.707f, 0.0f, 0.0f}; + rectangle.e_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); @@ -209,6 +242,8 @@ int main(void) GLuint vp_uniform = glGetUniformLocation(shaderProgram, "vp"); GLuint model_uniform = glGetUniformLocation(shaderProgram, "model"); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // Использование уменьшенных версий mipmap + // Пока не произойдет событие запроса закрытия окна while(!glfwWindowShouldClose(window)) { @@ -219,6 +254,7 @@ int main(void) glClear(GL_COLOR_BUFFER_BIT); // Тут производится рендер + glBindTexture(GL_TEXTURE_2D, texture); // Привязка текстуры как активной rectangle.render(model_uniform); // Представление содержимого буфера цепочки показа на окно @@ -226,7 +262,10 @@ int main(void) // Обработка системных событий glfwPollEvents(); } - + + // Удаление текстуры + glDeleteTextures(1, &texture); + // Удаление шейдерной программы glDeleteProgram(shaderProgram);