From 2564aabc0cb7c71c037f25b68a4edac1c33ad62b Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Fri, 3 Nov 2023 13:32:18 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9A=D0=BB=D0=B0=D1=81=D1=81=203D=20=D0=BA?= =?UTF-8?q?=D1=83=D0=B1=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE=D0=B9=20=D1=82?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D1=82=D1=83=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/Texture.h | 14 +++++++++++ src/Texture.cpp | 60 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/include/Texture.h b/include/Texture.h index 5e5367d..bbbf12a 100644 --- a/include/Texture.h +++ b/include/Texture.h @@ -73,4 +73,18 @@ class TextureCube : public BaseTexture virtual void use(); // Привязка текстуры }; +// Класс 3D кубической текстуры +class TextureCubeArray : public BaseTexture +{ + public: + TextureCubeArray(GLuint levels, GLuint width, GLuint height, GLuint attachment, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера для использования в буфере + TextureCubeArray(const TextureCubeArray& other); // Конструктор копирования + + TextureCubeArray& operator=(const TextureCubeArray& other); // Оператор присваивания + + void reallocate(GLuint levels, GLuint width, GLuint height, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Пересоздает текстуру для имеющегося дескриптора + + virtual void use(); // Привязка текстуры +}; + #endif // TEXTURE_H diff --git a/src/Texture.cpp b/src/Texture.cpp index 2d4dd20..9837bb7 100644 --- a/src/Texture.cpp +++ b/src/Texture.cpp @@ -327,3 +327,63 @@ void TextureCube::use() glActiveTexture(type + GL_TEXTURE0); glBindTexture(GL_TEXTURE_CUBE_MAP, handler); // Привязка текстуры как активной } + +// Конструктор текстуры заданного размера для использования в буфере +TextureCubeArray::TextureCubeArray(GLuint levels, GLuint width, GLuint height, GLuint attachment, GLuint texType, GLint internalformat, GLint format, GLenum dataType) +{ + type = texType; + // Генерация текстуры заданного размера + glGenTextures(1, &handler); + glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, handler); + glTexImage3D( + GL_TEXTURE_CUBE_MAP_ARRAY, 0, internalformat, width, height, 6*levels, 0, format, dataType, 0); + + glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + // Привязка к буферу кадра + glFramebufferTexture(GL_FRAMEBUFFER, attachment, handler, 0); + + // Создаем счетчик использований дескриптора + handler_count[handler] = 1; +} + +// Конструктор копирования +TextureCubeArray::TextureCubeArray(const TextureCubeArray& other) +{ + handler = other.handler; + type = other.type; + // Делаем копию и увеличиваем счетчик + handler_count[handler]++; +} + +// Оператор присваивания +TextureCubeArray& TextureCubeArray::operator=(const TextureCubeArray& other) +{ + // Если это разные текстуры + if (handler != other.handler) + { + this->~TextureCubeArray(); // Уничтожаем имеющуюся + // Заменяем новой + handler = other.handler; + handler_count[handler]++; + } + type = other.type; + + return *this; +} + +// Пересоздает текстуру для имеющегося дескриптора +void TextureCubeArray::reallocate(GLuint levels, GLuint width, GLuint height, GLuint texType, GLint internalformat, GLint format, GLenum dataType) +{ + use(); + glTexImage3D( + GL_TEXTURE_CUBE_MAP_ARRAY, 0, internalformat, width, height, 6*levels, 0, format, dataType, 0); +} + +// Привязка текстуры +void TextureCubeArray::use() +{ + glActiveTexture(type + GL_TEXTURE0); + glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, handler); // Привязка текстуры как активной +}