Extra2D/Extra2D/include/extra2d/render/backends/opengl/gl_rhi_texture.h

236 lines
6.5 KiB
C++

#pragma once
#include <extra2d/render/rhi/rhi_texture.h>
#include <glad/glad.h>
#include <string>
namespace extra2d {
namespace rhi {
/**
* @brief OpenGL 纹理实现
*
* 使用 OpenGL 4.5 DSA 特性
*/
class GLRHITexture : public RHITexture {
public:
/**
* @brief 构造函数
*/
GLRHITexture();
/**
* @brief 析构函数
*/
~GLRHITexture() override;
/**
* @brief 初始化纹理
* @param desc 纹理描述
* @return 成功返回 true
*/
bool init(const TextureDesc& desc);
/**
* @brief 释放资源
*/
void shutdown();
// RHITexture 接口实现
TextureType getType() const override { return type_; }
Format getFormat() const override { return format_; }
uint32_t getWidth() const override { return width_; }
uint32_t getHeight() const override { return height_; }
uint32_t getDepth() const override { return depth_; }
uint32_t getMipLevels() const override { return mipLevels_; }
uint32_t getArrayLayers() const override { return arrayLayers_; }
uint32_t getSampleCount() const override { return sampleCount_; }
void setData(const void* data, uint32_t mipLevel = 0, uint32_t arrayLayer = 0) override;
void setSubData(const void* data, uint32_t x, uint32_t y,
uint32_t width, uint32_t height, uint32_t mipLevel = 0) override;
void generateMipmaps() override;
bool isValid() const override { return textureID_ != 0; }
uintptr_t getNativeHandle() const override { return static_cast<uintptr_t>(textureID_); }
const std::string& getDebugName() const override { return debugName_; }
void setDebugName(const std::string& name) override { debugName_ = name; }
/**
* @brief 获取 OpenGL 纹理 ID
*/
GLuint getTextureID() const { return textureID_; }
/**
* @brief 绑定到纹理单元
*/
void bind(uint32_t unit);
/**
* @brief 转换纹理类型到 OpenGL 目标
*/
static GLenum convertType(TextureType type);
/**
* @brief 转换格式到 OpenGL 内部格式
*/
static GLenum convertInternalFormat(Format format);
/**
* @brief 转换格式到 OpenGL 格式
*/
static GLenum convertFormat(Format format);
/**
* @brief 转换格式到 OpenGL 类型
*/
static GLenum convertDataType(Format format);
/**
* @brief 计算格式字节大小
*/
static uint32_t getFormatBytes(Format format);
private:
GLuint textureID_ = 0;
TextureType type_ = TextureType::Texture2D;
Format format_ = Format::RGBA8_UNORM;
uint32_t width_ = 0;
uint32_t height_ = 0;
uint32_t depth_ = 1;
uint32_t mipLevels_ = 1;
uint32_t arrayLayers_ = 1;
uint32_t sampleCount_ = 1;
std::string debugName_;
};
/**
* @brief OpenGL 采样器实现
*/
class GLRHISampler : public RHISampler {
public:
/**
* @brief 构造函数
*/
GLRHISampler();
/**
* @brief 析构函数
*/
~GLRHISampler() override;
/**
* @brief 初始化采样器
* @param desc 采样器描述
* @return 成功返回 true
*/
bool init(const SamplerDesc& desc);
/**
* @brief 释放资源
*/
void shutdown();
// RHISampler 接口实现
FilterMode getMinFilter() const override { return minFilter_; }
FilterMode getMagFilter() const override { return magFilter_; }
FilterMode getMipFilter() const override { return mipFilter_; }
AddressMode getAddressModeU() const override { return addressU_; }
AddressMode getAddressModeV() const override { return addressV_; }
AddressMode getAddressModeW() const override { return addressW_; }
float getMaxAnisotropy() const override { return maxAnisotropy_; }
ColorValue getBorderColor() const override { return borderColor_; }
bool isValid() const override { return samplerID_ != 0; }
uintptr_t getNativeHandle() const override { return static_cast<uintptr_t>(samplerID_); }
const std::string& getDebugName() const override { return debugName_; }
void setDebugName(const std::string& name) override { debugName_ = name; }
/**
* @brief 获取 OpenGL 采样器 ID
*/
GLuint getSamplerID() const { return samplerID_; }
/**
* @brief 绑定到纹理单元
*/
void bind(uint32_t unit);
private:
GLuint samplerID_ = 0;
FilterMode minFilter_ = FilterMode::Linear;
FilterMode magFilter_ = FilterMode::Linear;
FilterMode mipFilter_ = FilterMode::LinearMipmapLinear;
AddressMode addressU_ = AddressMode::ClampToEdge;
AddressMode addressV_ = AddressMode::ClampToEdge;
AddressMode addressW_ = AddressMode::ClampToEdge;
float maxAnisotropy_ = 1.0f;
ColorValue borderColor_;
std::string debugName_;
/**
* @brief 转换过滤模式到 OpenGL 枚举
*/
static GLenum convertFilter(FilterMode filter, FilterMode mipFilter);
/**
* @brief 转换寻址模式到 OpenGL 枚举
*/
static GLenum convertAddressMode(AddressMode mode);
/**
* @brief 转换比较函数到 OpenGL 枚举
*/
static GLenum convertCompareFunc(CompareFunc func);
};
/**
* @brief OpenGL 纹理视图实现
*/
class GLRHITextureView : public RHITextureView {
public:
/**
* @brief 构造函数
*/
GLRHITextureView();
/**
* @brief 析构函数
*/
~GLRHITextureView() override;
/**
* @brief 初始化纹理视图
*/
bool init(Ptr<RHITexture> texture, const TextureViewDesc& desc);
/**
* @brief 释放资源
*/
void shutdown();
// RHITextureView 接口实现
Ptr<RHITexture> getTexture() const override { return texture_; }
Format getFormat() const override { return format_; }
uint32_t getBaseMipLevel() const override { return baseMipLevel_; }
uint32_t getMipLevels() const override { return mipLevels_; }
uint32_t getBaseArrayLayer() const override { return baseArrayLayer_; }
uint32_t getArrayLayers() const override { return arrayLayers_; }
bool isValid() const override { return viewID_ != 0; }
uintptr_t getNativeHandle() const override { return static_cast<uintptr_t>(viewID_); }
/**
* @brief 获取 OpenGL 纹理视图 ID
*/
GLuint getViewID() const { return viewID_; }
private:
GLuint viewID_ = 0;
Ptr<RHITexture> texture_;
Format format_ = Format::RGBA8_UNORM;
uint32_t baseMipLevel_ = 0;
uint32_t mipLevels_ = 1;
uint32_t baseArrayLayer_ = 0;
uint32_t arrayLayers_ = 1;
};
} // namespace rhi
} // namespace extra2d