# OpenGLBuffer OpenGL 缓冲区的实现,封装 OpenGL buffer object。 ## 头文件 ```cpp #include ``` ## 继承关系 ``` RHIBuffer (interface) └── OpenGLBuffer (implementation) ``` ## OpenGLBufferType 枚举 | 值 | 描述 | |----|------| | `Vertex` | 顶点缓冲区 | | `Index` | 索引缓冲区 | | `Uniform` | Uniform 缓冲区 (UBO) | | `CopyRead` | 复制源缓冲区 | | `CopyWrite` | 复制目标缓冲区 | | `AtomicCounter` | 原子计数器缓冲区 | | `DispatchIndirect` | 间接计算调用缓冲区 | | `DrawIndirect` | 间接绘制缓冲区 | | `ShaderBindingTable` | 光线追踪 Shader 绑定表 | ## 公共成员函数 ### 构造函数与析构函数 #### `OpenGLBuffer()` #### `~OpenGLBuffer() override` ### 初始化 #### `bool Initialize(OpenGLBufferType type, size_t size, const void* data = nullptr, bool dynamic = false)` 通用初始化。 - `type`: 缓冲区类型 - `size`: 大小(字节) - `data`: 初始数据(可选) - `dynamic`: 是否动态更新 #### `bool InitializeVertexBuffer(const void* data, size_t size)` 初始化顶点缓冲区。 #### `bool InitializeIndexBuffer(const void* data, size_t size)` 初始化索引缓冲区。 #### `void Shutdown() override` ### 绑定操作 #### `void Bind() const` 绑定缓冲区到当前 target。 #### `void Unbind() const` 解除绑定。 #### `void BindBase(unsigned int target, unsigned int index) const` 绑定到指定的 binding point(用于 UBO、SSBO 等)。 ### 数据操作 #### `void* Map() override` 映射缓冲区到 CPU。 #### `void Unmap() override` 解除映射。 #### `void SetData(const void* data, size_t size, size_t offset = 0) override` 更新缓冲区数据。 ### 属性 #### `unsigned int GetID() const` 获取 OpenGL buffer ID。 #### `uint64_t GetSize() const override` 获取缓冲区大小。 #### `OpenGLBufferType GetType() const` 获取缓冲区类型。 #### `bool IsDynamic() const` 是否动态缓冲区。 #### `BufferType GetBufferType() const override / void SetBufferType(BufferType type) override` #### `uint32_t GetStride() const override / void SetStride(uint32_t stride) override` #### `void* GetNativeHandle() override` 返回 `reinterpret_cast(static_cast(m_buffer))` #### `ResourceStates GetState() const override` 返回 `ResourceStates::Common`(OpenGL 无显式状态) #### `const std::string& GetName() const override / void SetName(...) override` ## 内部成员 | 成员 | 类型 | 描述 | |------|------|------| | `m_buffer` | `unsigned int` | GL buffer ID | | `m_size` | `size_t` | 大小 | | `m_isIndexBuffer` | `bool` | 是否索引缓冲区 | | `m_dynamic` | `bool` | 是否动态 | | `m_type` | `OpenGLBufferType` | 缓冲区类型 | | `m_bufferType` | `BufferType` | RHI 缓冲区类型 | | `m_stride` | `uint32_t` | 顶点步长 | | `m_name` | `std::string` | 名称 | ## 使用示例 ```cpp OpenGLBuffer vb; float vertices[] = { ... }; vb.InitializeVertexBuffer(vertices, sizeof(vertices)); vb.SetBufferType(BufferType::Vertex); vb.SetStride(sizeof(float) * 5); OpenGLBuffer ib; uint16_t indices[] = { 0, 1, 2, ... }; ib.InitializeIndexBuffer(indices, sizeof(indices)); // Bind and draw vb.Bind(); ib.Bind(); glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, 0); ```