236 lines
6.5 KiB
C++
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
|