#pragma once #include #include #include namespace extra2d { /** * @brief 纹理格式枚举 */ enum class TextureFormat : uint8 { RGB8, // RGB 8位每通道 RGBA8, // RGBA 8位每通道 R8, // 单通道(字体用) Depth, // 深度缓冲 DepthStencil // 深度模板缓冲 }; /** * @brief 纹理过滤模式 */ enum class TextureFilter : uint8 { Nearest, // 最近邻 Linear, // 线性 MipmapNearest, // 最近邻 Mipmap MipmapLinear // 线性 Mipmap }; /** * @brief 纹理环绕模式 */ enum class TextureWrap : uint8 { Repeat, // 重复 Clamp, // 边缘钳制 Mirror // 镜像重复 }; /** * @brief 纹理资源类 * * 封装 OpenGL ES 3.2 纹理对象 */ class Texture : public Resource { public: Texture(); ~Texture() override; /** * @brief 获取资源类型 */ ResourceType getType() const override { return ResourceType::Texture; } /** * @brief 创建空纹理 * @param width 纹理宽度 * @param height 纹理高度 * @param format 纹理格式 * @return 是否创建成功 */ bool create(uint32 width, uint32 height, TextureFormat format); /** * @brief 从文件加载纹理 * @param path 文件路径 * @return 是否加载成功 */ bool loadFromFile(const std::string& path); /** * @brief 从内存加载纹理 * @param data 像素数据 * @param width 纹理宽度 * @param height 纹理高度 * @param format 纹理格式 * @return 是否加载成功 */ bool loadFromMemory(const uint8* data, uint32 width, uint32 height, TextureFormat format); /** * @brief 更新纹理部分区域 * @param x 起始X坐标 * @param y 起始Y坐标 * @param width 区域宽度 * @param height 区域高度 * @param data 像素数据 */ void updateRegion(uint32 x, uint32 y, uint32 width, uint32 height, const uint8* data); /** * @brief 绑定纹理到指定槽位 * @param slot 纹理槽位(0-31) */ void bind(uint32 slot = 0) const; /** * @brief 解绑纹理 */ void unbind() const; /** * @brief 设置纹理过滤模式 * @param minFilter 缩小过滤模式 * @param magFilter 放大过滤模式 */ void setFilter(TextureFilter minFilter, TextureFilter magFilter); /** * @brief 设置纹理环绕模式 * @param wrapS S轴环绕模式 * @param wrapT T轴环绕模式 */ void setWrap(TextureWrap wrapS, TextureWrap wrapT); /** * @brief 生成 Mipmap */ void generateMipmap(); /** * @brief 获取纹理宽度 */ uint32 getWidth() const { return width_; } /** * @brief 获取纹理高度 */ uint32 getHeight() const { return height_; } /** * @brief 获取纹理格式 */ TextureFormat getFormat() const { return format_; } /** * @brief 获取 OpenGL 纹理句柄 */ GLuint getHandle() const { return handle_; } private: GLuint handle_ = 0; // OpenGL 纹理句柄 uint32 width_ = 0; // 纹理宽度 uint32 height_ = 0; // 纹理高度 TextureFormat format_ = TextureFormat::RGBA8; // 纹理格式 // 将 TextureFormat 转换为 OpenGL 格式 static GLint getGLInternalFormat(TextureFormat format); static GLenum getGLFormat(TextureFormat format); static GLenum getGLType(TextureFormat format); }; } // namespace extra2d