Extra2D/include/renderer/uniform_buffer.h

158 lines
3.2 KiB
C
Raw Normal View History

#pragma once
#include <glad/glad.h>
#include <memory>
#include <renderer/render_types.h>
#include <vector>
namespace extra2d {
/**
* @brief (UBO)
*
* uniform GPU
* std140
*/
class UniformBuffer {
public:
/**
* @brief
*/
UniformBuffer();
/**
* @brief
*/
~UniformBuffer();
/**
* @brief UBO
* @param size
* @param binding
* @return
*/
bool create(uint32_t size, uint32_t binding);
/**
* @brief UBO
*/
void destroy();
/**
* @brief
* @param data
* @param size
* @param offset
*/
void update(const void *data, uint32_t size, uint32_t offset = 0);
/**
* @brief
* @param binding
*/
void bind(uint32_t binding);
/**
* @brief
* @return
*/
uint32_t getSize() const { return size_; }
/**
* @brief OpenGL
* @return OpenGL
*/
GLuint getHandle() const { return ubo_; }
/**
* @brief
* @return
*/
bool isValid() const { return ubo_ != 0; }
private:
GLuint ubo_ = 0; // OpenGL 缓冲区对象
uint32_t size_ = 0; // 缓冲区大小
uint32_t binding_ = 0; // 绑定槽位
};
/**
* @brief UBO
*
* UBO
*
*/
class UniformBufferManager {
public:
/**
* @brief
*/
UniformBufferManager();
/**
* @brief
*/
~UniformBufferManager();
// 禁止拷贝
UniformBufferManager(const UniformBufferManager &) = delete;
UniformBufferManager &operator=(const UniformBufferManager &) = delete;
// 允许移动
UniformBufferManager(UniformBufferManager &&) noexcept;
UniformBufferManager &operator=(UniformBufferManager &&) noexcept;
/**
* @brief
* @return
*/
bool initialize();
/**
* @brief
*/
void shutdown();
/**
* @brief UBO
* @return UBO
*/
UniformBuffer *getGlobalUBO();
/**
* @brief UBO
* @param size
* @return UBO
*/
UniformBuffer *acquireMaterialUBO(uint32_t size);
/**
* @brief UBO
*
* 便 UBO
*/
void resetMaterialUBOs();
/**
* @brief UBO
* @param data
* @param size
*/
void updateGlobalUBO(const void *data, uint32_t size);
private:
// 全局 UBO用于 viewProjection、time 等全局数据)
std::unique_ptr<UniformBuffer> globalUBO_;
// 材质 UBO 池
std::vector<std::unique_ptr<UniformBuffer>> materialUBOPool_;
uint32_t currentUBOIndex_ = 0;
// 常量
static constexpr uint32_t INITIAL_UBO_POOL_SIZE = 16;
static constexpr uint32_t GLOBAL_UBO_SIZE =
256; // 足够存储 viewProjection + time + screenSize
};
} // namespace extra2d